ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 求VBA跨表检索重复次数与对应项求和

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-9-6 15:10 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 feilv205 于 2018-9-7 11:04 编辑

寻求帮助解决的问题


文件说明:

两个工作表:
B01中的B1表和BX01中的BX1,B01在F盘,BX01在D盘;
B1、BX1两表中有列标题同为“产品编号”的列,但所在列不同,B1表中在B列,BX1中在C列,在B1表中没有重复,在BX1表中存在重复;


需要帮助解决的:


将B1表B列“产品编号”下各编号在BX1表C列中出现的次数对应计入B1表F列“次数”中,没有出现的为空;对同编号所对应的BX1表中F列的数量进行累加,计入B1表中编号对应的G列“总数”中,没有的计为空格。


论坛里找了字典法、三维数组法、SQL法,在一表中自检捣鼓一下还能对付,跨薄还不同列就汗了,麻烦老师们给予帮助,先谢过!


十分感谢“不知道为什么”、“lsdongjh”两位老师帮助解决问题!
在11楼又对需要汇总的列数据进行了补充,lsdongjh老师在13楼帮助圆满解决。
SQL法结合字典跨表汇总是利器。

跨表检索统计.rar

15.64 KB, 下载次数: 15

TA的精华主题

TA的得分主题

发表于 2018-9-6 16:06 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-9-6 16:08 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-6 17:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

敲键盘,代码有效,非常感谢老师!

老师,还有个问题:如果BX1表中F列”数量“后的G-K列数据也需要分别求和该怎么修改?

TA的精华主题

TA的得分主题

发表于 2018-9-6 17:50 | 显示全部楼层
feilv205 发表于 2018-9-6 17:37
敲键盘,代码有效,非常感谢老师!

老师,还有个问题:如果BX1表中F列”数量“后的G-K列数据也需要分 ...

如果多列需要统计,那建议存放数组

TA的精华主题

TA的得分主题

发表于 2018-9-6 18:04 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
字典加SQL
字典记录B01中B1表的产品编号所在的行号,
ADO+SQL 查询BX01中BX1的数据,并用GetRows方法转入二维数组
      SELECT  产品编号, Count(产品编号) AS 次数, Sum(数量) AS 总数 FROM [BX1$] GROUP BY 产品编号;

循环读取二维数组,根据编号所在的行,写入相关的内容(此时的二维数组,列对应行)

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-6 18:08 | 显示全部楼层
lsdongjh 发表于 2018-9-6 18:04
字典加SQL
字典记录B01中B1表的产品编号所在的行号,
ADO+SQL 查询BX01中BX1的数据,并用GetRows ...

老师,目前我只会依葫芦画瓢,劳驾帮帮忙!

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-6 18:10 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
不知道为什么 发表于 2018-9-6 17:50
如果多列需要统计,那建议存放数组

只会简单的,这个对我来说真弄不会啊。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-6 19:56 | 显示全部楼层
lsdongjh 发表于 2018-9-6 18:04
字典加SQL
字典记录B01中B1表的产品编号所在的行号,
ADO+SQL 查询BX01中BX1的数据,并用GetRows ...

老师,麻烦指导一下:

Sub BOB() 'SQL法
   Set cnn = CreateObject("ADODB.Connection")
   Set rst = CreateObject("ADODB.Recordset")
   Set wb = Workbooks.Open("d:\BX01.xlsx")
   cnn.Open "provider=microsoft.ace.oledb.12.0;extended properties='excel 12.0';data source=" & ThisWorkbook.FullName
   Sql = "select 产品编号,count(*),sum(数量),sum(投料累计数),sum(X1累计废品1),sum(X1累计废品2),sum(X1累计废品3),sum(X1累计成品数量),from[BX1$C1:k] group by 产品编号 "
   rst.Open Sql, cnn, 1, 8
   
   Sheets("B1").[e2].CopyFromRecordset rst
   rst.Close: Set rst = Nothing
   cnn.Close: Set cnn = Nothing
End Sub

TA的精华主题

TA的得分主题

发表于 2018-9-7 09:06 | 显示全部楼层
  1. Sub Test()
  2.     Dim shResult As Worksheet
  3.     Dim arrResult As Variant, arrSource As Variant, lngRow As Long, lngRowID As Long
  4.     Dim objDic As Object, strKey As String
  5.     Dim Conn As Object, Rst As Object, strPath As String
  6.     Dim strConn As String, strSQL As String

  7.     Set shResult = Sheets("B1")
  8.     lngRow = shResult.Range("B" & Rows.Count).End(xlUp).Row
  9.     arrResult = shResult.Range("B1:G" & lngRow)
  10.    
  11.     Set objDic = CreateObject("Scripting.Dictionary")
  12.     For lngRow = 2 To UBound(arrResult)
  13.         strKey = arrResult(lngRow, 1)
  14.         If strKey <> "" Then objDic(strKey) = lngRow
  15.     Next
  16.    
  17.     Set Conn = CreateObject("ADODB.Connection")
  18.     Set Rst = CreateObject("ADODB.Recordset")
  19.     strPath = "F:\Temp\666\BX01.xlsx" '这是BX01所在的路径及文件名!
  20.     Select Case Application.Version * 1
  21.         Case Is <= 11
  22.             strConn = "Provider=Microsoft.Jet.Oledb.4.0;Extended Properties=excel 8.0;Data source=" & strPath
  23.         Case Is >= 12
  24.             strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strPath & ";Extended Properties=""Excel 12.0;HDR=YES"";"""
  25.     End Select
  26.     Conn.Open strConn

  27.     strSQL = "SELECT  产品编号, Count(产品编号) AS 次数, Sum(数量) AS 总数 FROM [BX1$] GROUP BY 产品编号;"
  28.     Rst.Open strSQL, Conn, 3, 1
  29.     arrSource = Rst.getrows
  30.    
  31.     Rst.Close: Set Rst = Nothing
  32.     Conn.Close: Set Conn = Nothing
  33.    
  34.     For lngRow = LBound(arrSource, 2) To UBound(arrSource, 2)
  35.         strKey = arrSource(0, lngRow)
  36.         If objDic.Exists(strKey) Then
  37.             lngRowID = objDic(strKey)
  38.             arrResult(lngRowID, 5) = arrSource(1, lngRow)
  39.             arrResult(lngRowID, 6) = arrSource(2, lngRow)
  40.         End If
  41.     Next
  42.    
  43.     shResult.Range("B1").Resize(UBound(arrResult), UBound(arrResult, 2)) = arrResult
  44.    
  45.     MsgBox "OK!"
  46. End Sub
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-13 15:45 , Processed in 0.035755 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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