ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2378|回复: 10

[求助] 循环查询不同数据后,如何分别记录在不同的单元格内?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-10-17 16:22 | 显示全部楼层 |阅读模式
循环查询不同数据后,如何分别记录在不同的单元格内?
    请见附件。

    在记录产品原始数据的("E5:G23")单元格区域,有19组数字(有的组里数据空缺);另外在("M5:O5")单元格区域,有三个产品标准数据。

    现在我想通过宏代码对产品原始数据进行6次循环查询,把符合"M5:O5"单元格区域三个产品标准数据的分别统计个数,再分别记录在"M6:O11"单元格区域里。如:第1次循环结果分别记录在"M6:O6"、第2次循环结果分别记录在"M7:O7"。。。。。。以此类推。

    每次循环的行数我用彩条标在原始数据右边。具体详见附件。

    现在我把第1次循环的代码试着写了一下,可是代码最后把分别统计的个数都汇总在一起先后记在"M5、N5、O5"单元格里了。"M5、N5、O5"应该分别是4、3、5,现在的结果是记入了这三个数的和:12、12、12。

    想请各位大侠帮我一下,怎样分别记录这三个数?之后怎样再写一个大循环把6次循环全部完成?

    不胜感谢!

我写的代码:

Sub 循环查询不同数据分别记录()
Dim c As Range   '定义“变量”等等, i%
Dim i As Integer, j As Integer, k As Integer, h As Integer, l As Integer, p As Integer  '循环变量
For i = 5 To 13   '按行循环
  For j = 3 To 7   '按列循环
    For h = 13 To 15   '按列循环
       If Cells(i, j).Value = Cells(5, h).Value Then
       k = k + 1 '记录查询计算结果
       End If
     Cells(6, h) = k  '查询计算结果分别赋值到 Cells(6, h)
    Next
  Next
Next
End Sub


循环查询不同数据分别记录.rar

9.1 KB, 下载次数: 10

TA的精华主题

TA的得分主题

发表于 2018-10-17 19:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Sub t()
  2. Dim i%, j%, k%, x%, y%, arr
  3. For y = 1 To 6
  4. arr = Array(91, 6, 45)
  5. For x = 0 To 2
  6. For i = 2 * y + 3 To 2 * y + 11
  7.    For j = 3 To 7
  8.     If Cells(i, j) = arr(x) Then
  9.      k = k + 1
  10.      End If
  11.      Next j
  12. Next i
  13. Cells(y + 5, x + 13) = k
  14. k = 0
  15. Next x
  16. Next y
  17. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-10-17 20:05 | 显示全部楼层
  1. Sub test()
  2.     Dim row1%, row2%, arr, i%, j%, k%, d As Object
  3.     row1 = 5
  4.     row2 = 13
  5.     For i = 6 To 11
  6.         Set d = CreateObject("Scripting.Dictionary")
  7.         arr = Range("C" & row1, "G" & row2)
  8.         For j = 1 To UBound(arr)
  9.             For k = 1 To UBound(arr, 2)
  10.                 Select Case arr(j, k)
  11.                     Case 91
  12.                         d(91) = d(91) + 1
  13.                     Case 6
  14.                         d(6) = d(6) + 1
  15.                     Case 45
  16.                         d(45) = d(45) + 1
  17.                 End Select
  18.             Next
  19.         Next
  20.         Range("M" & i, "O" & i) = Array(d(91), d(6), d(45))
  21.         row1 = row1 + 2
  22.         row2 = row2 + 2
  23.     Next
  24. End Sub
复制代码


虽然你描述说是E5:G23,但看实际的值应该是C5:G23,代码是按C5做的,我理解不对的话自己改下

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-17 22:13 | 显示全部楼层

非常感谢您帮我解决了问题。以我的菜鸟水平尚能看懂您写的代码。特加上注释,请您审看一下对不对?
Sub t()
Dim i%, j%, k%, x%, y%, arr
For y = 1 To 6   '行的6次大循环
  arr = Array(91, 6, 45)    '标本数据
    For x = 0 To 2     '3个标本数据的循环
      For i = 2 * y + 3 To 2 * y + 11    '原始数据行的循环
        For j = 3 To 7    '原始数据列的循环
          If Cells(i, j) = arr(x) Then  '如果被查询的数据等于标本数据,那么
             k = k + 1     '累加计数
          End If
        Next j
      Next i
        Cells(y + 5, x + 13) = k    '将计数结果按各次循环的先后分别记入相应的单元格
        k = 0
    Next x
Next y
End Sub

TA的精华主题

TA的得分主题

发表于 2018-10-17 22:18 | 显示全部楼层
08nq26 发表于 2018-10-17 22:13
非常感谢您帮我解决了问题。以我的菜鸟水平尚能看懂您写的代码。特加上注释,请您审看一下对不对?
Sub  ...

正解,楼主有基础嘛。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-17 22:22 | 显示全部楼层
本帖最后由 08nq26 于 2018-10-17 22:24 编辑
Mapleaf12138 发表于 2018-10-17 20:05
虽然你描述说是E5:G23,但看实际的值应该是C5:G23,代码是按C5做的,我理解不对的话自己改下

非常感谢!与二楼不同,您从另一个角度解决了我的问题,和二楼一样地效果完美。我只知道运用了字典功能,但是不大看得懂,能否抽空帮我加上文字注释?太不好意思了!
E5:G23是我写错了,应该是C5:G23。抱歉!

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-17 23:42 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-10-18 08:50 | 显示全部楼层
08nq26 发表于 2018-10-17 22:22
非常感谢!与二楼不同,您从另一个角度解决了我的问题,和二楼一样地效果完美。我只知道运用了字典功能, ...
  1. Sub test()
  2.     Dim row1%, row2%, arr, i%, j%, k%, d As Object, t
  3.     t = Timer '这个是后加的,定义一个时间变量,用以查询程序执行时间,尽量用字典,运行效率要高很多
  4.     row1 = 5 'C列行数
  5.     row2 = 13 'G列行数
  6.     For i = 6 To 11 '循环M-O列的第6到11行
  7.         Set d = CreateObject("Scripting.Dictionary") '定义字典
  8.         arr = Range("C" & row1, "G" & row2) '定义C到G的数组
  9.         For j = 1 To UBound(arr) '循环数组第一维
  10.             For k = 1 To UBound(arr, 2) '循环数组第二维
  11.                 Select Case arr(j, k) '判断数组值
  12.                     Case 91
  13.                         d(91) = d(91) + 1 '当=91时,字典中Key=91的值加上1,下同
  14.                     Case 6
  15.                         d(6) = d(6) + 1
  16.                     Case 45
  17.                         d(45) = d(45) + 1
  18.                 End Select
  19.             Next
  20.         Next
  21.         Range("M" & i, "O" & i) = Array(d(91), d(6), d(45)) 'Array定义一个数组,数组的值分别是字典中91,6,45的值,并赋值给M-O列
  22.         row1 = row1 + 2 'C列行数+2,G列行数+2,以便下次循环
  23.         row2 = row2 + 2
  24.     Next
  25.     MsgBox Timer - t '显示程序总共执行了多长时间
  26. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-10-18 09:00 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
08nq26 发表于 2018-10-17 23:42
请教:
倒数第4行的
k = 0

这个是初始化次数的值,简单来说就是当91出现的次数已经填写到相应单元格后,重新把他赋值为0,用以记录6出现的次数,以此类推,也可以放到for x = ……下面,那样你可能更容易理解

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-18 23:07 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-26 21:09 , Processed in 0.049500 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表