Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2414|回复: 9

[已解决]求助跨表汇总

[复制链接]
发表于 2013-1-2 22:48 | 显示全部楼层 |阅读模式
问题在附件里,谢谢
最佳答案
2013-1-3 00:05
本帖最后由 hwc2ycy 于 2013-1-3 00:18 编辑

问题在这里分析表 .rar (26.76 KB, 下载次数: 56)

求助跨表汇总.rar

23.33 KB, 下载次数: 30

发表于 2013-1-2 23:08 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2013-1-2 23:12 | 显示全部楼层
hwc2ycy 发表于 2013-1-2 23:08
最头疼的莫过于跨表,

啊连老师都头疼吗{:081:}
回复

使用道具 举报

发表于 2013-1-3 00:03 | 显示全部楼层
本帖最后由 hwc2ycy 于 2013-1-3 00:17 编辑
  1. Option Explicit

  2. Sub 合并统计()
  3.     Dim arrXL, arrKC, arrDD
  4.     Dim FileXL$, FileKC$, FileDD$
  5.     Dim result, iPos&
  6.     Dim i&, j&
  7.     Dim app As Object
  8.     Dim t#
  9.    
  10.     FileXL = "销量.xlsx"
  11.     FileKC = "库存.xlsx"
  12.     FileDD = "订单.xlsx"
  13.    
  14.     t = Timer
  15.     On Error Resume Next
  16.     Set app = CreateObject("excel.application")
  17.     app.AutomationSecurity = msoAutomationSecurityForceDisable
  18.    
  19.     '销量
  20.     app.Workbooks.Open ThisWorkbook.Path & "" & FileXL, False, True
  21.     If Len(app.Workbooks(FileXL).Name) = 0 Then
  22.         MsgBox FileXL & " 访问失败"
  23.         Exit Sub
  24.     End If
  25.     With app.Workbooks(FileXL).Worksheets("sheet1")
  26.         arrXL = .Range("a1").CurrentRegion
  27.     End With
  28.     app.Workbooks(FileXL).Close False

  29.     '库存
  30.     app.Workbooks.Open ThisWorkbook.Path & "" & FileKC, False, True
  31.     If Len(app.Workbooks(FileKC).Name) = 0 Then
  32.         MsgBox FileKC & " 访问失败"
  33.         Exit Sub
  34.     End If
  35.     With app.Workbooks(FileKC).Worksheets("sheet1")
  36.         arrKC = .Range("a1").CurrentRegion
  37.     End With
  38.     app.Workbooks(FileKC).Close False

  39.     '订单
  40.     app.Workbooks.Open ThisWorkbook.Path & "" & FileDD, False, True
  41.     If Len(app.Workbooks(FileDD).Name) = 0 Then
  42.         MsgBox FileDD & " 访问失败"
  43.         Exit Sub
  44.     End If
  45.     With app.Workbooks(FileDD).Worksheets("sheet1")
  46.         arrDD = .Range("a1").CurrentRegion
  47.     End With
  48.     app.Workbooks(FileDD).Close False

  49.     app.AutomationSecurity = msoAutomationSecurityByUI
  50.     Set app = Nothing

  51.     ReDim result(1 To UBound(arrDD), 1 To 3)
  52.     Dim dic As Object, dickc As Object
  53.     Set dic = CreateObject("scripting.dictionary")
  54.     Set dickc = CreateObject("scripting.dictionary")
  55.    
  56.     iPos = 1
  57.     '订单统计
  58.     For i = 2 To UBound(arrDD)
  59.         If Not dic.exists(arrDD(i, 1)) Then
  60.             iPos = iPos + 1
  61.             result(iPos, 1) = arrDD(i, 1)
  62.             result(iPos, 2) = arrDD(i, 2)
  63.             dic(arrDD(i, 1)) = iPos
  64.         Else
  65.             j = dic(arrDD(i, 1))
  66.             result(j, 2) = result(j, 2) + arrDD(i, 2)
  67.         End If
  68.     Next
  69.    
  70.     '销量统计
  71.     For i = 2 To UBound(arrXL)
  72.         If dic.exists(arrXL(i, 1)) Then
  73.             iPos = dic(arrXL(i, 1))
  74.             result(iPos, 3) = arrDD(i, 2)
  75.         End If
  76.     Next
  77.    
  78.     '库存统计
  79.     iPos = UBound(result, 2)
  80.     For i = 2 To UBound(arrKC)
  81.         If Not dickc.exists(arrKC(i, 1)) Then
  82.             iPos = iPos + 1
  83.             ReDim Preserve result(1 To UBound(arrDD), 1 To iPos)
  84.             result(dic(arrKC(i, 2)), iPos) = arrKC(i, 3)
  85.             result(1, iPos) = "店面" & arrKC(i, 1) & "的库存"
  86.             dickc(arrKC(i, 1)) = iPos
  87.         Else
  88.             j = dickc(arrKC(i, 1))
  89.             result(dic(arrKC(i, 2)), j) = result(dic(arrKC(i, 2)), j) + arrKC(i, 3)
  90.         End If
  91.     Next
  92.    
  93.     '写回表格
  94.     Range("a1").Resize(UBound(result), UBound(result, 2)) = result
  95.     '表头
  96.     Range("a1").Resize(1, 3) = Array("编码", "订货数量", "销量")
  97.     Set dickc = Nothing
  98.     Set dic = Nothing
  99.    
  100.     t = Timer - t
  101.     MsgBox "合并合成" & vbCr & "一共费时 " & t & " 秒"
  102. End Sub
复制代码
回复

使用道具 举报

发表于 2013-1-3 00:05 | 显示全部楼层    本楼为最佳答案   
本帖最后由 hwc2ycy 于 2013-1-3 00:18 编辑

问题在这里分析表 .rar (26.76 KB, 下载次数: 56)
回复

使用道具 举报

发表于 2013-1-3 00:06 | 显示全部楼层
把这个文件放到三个文件所在的位置。
回复

使用道具 举报

发表于 2013-1-3 00:07 | 显示全部楼层
晕,都0点过了,洗洗睡去。
回复

使用道具 举报

 楼主| 发表于 2013-1-3 08:33 | 显示全部楼层
hwc2ycy 发表于 2013-1-3 00:07
晕,都0点过了,洗洗睡去。

感谢老师,还是感谢老师
REPT("非常",9e+307)&"感谢hwc2ycy老师"

回复

使用道具 举报

发表于 2013-1-3 10:41 | 显示全部楼层
  1. Sub 合并统计2()
  2. 'SQL方法
  3.     Dim arrXL, arrKC, arrDD, arr, item, temp
  4.     Dim FileXL$, FileKC$, FileDD$
  5.     Dim result, iPos&, dataSource$
  6.     Dim i&, j&
  7.     Dim app As Object
  8.     Dim t#
  9.     temp = Array(1, 2, 3)

  10.     FileXL = "销量.xlsx"
  11.     FileKC = "库存.xlsx"
  12.     FileDD = "订单.xlsx"
  13.     arr = Array(FileDD, FileKC, FileXL)
  14.     t = Timer
  15.     'On Error Resume Next

  16.     For Each item In arr
  17.         If Len(Dir(ThisWorkbook.Path & "" & item, vbNormal)) = 0 Then
  18.             MsgBox item & " 不存在", vbCritical
  19.             Exit Sub
  20.         End If
  21.     Next


  22.     Dim AdoConn As Object, adorst As Object
  23.     Dim strconn$, strsql$
  24.     Set AdoConn = CreateObject("ADODB.Connection")
  25.     strsql = "select * from [sheet1$]"

  26.     For Each item In arr
  27.         dataSource = ThisWorkbook.Path & "" & item

  28.         Select Case Application.Version
  29.         Case Is = "14.0":
  30.             strconn = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & _
  31.                       dataSource & ";Extended Properties=""Excel 12.0;HDR=no;imex=1"";"""
  32.         Case Is = "12.0"
  33.             strconn = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & _
  34.                       dataSource & ";Extended Properties=""Excel 12.0;HDR=no;imex=1"";"""
  35.         Case Else
  36.             strconn = "Provider= Microsoft.Jet.OLEDB.4.0;" & _
  37.                       "Data Source=" & dataSource & "Extended Properties=""Excel 8.0;HDR=no;imex=1"";"

  38.         End Select

  39.         On Error Resume Next
  40.         AdoConn.Open strconn
  41.         If Err.Number <> 0 Then
  42.             Err.Clear
  43.             MsgBox dataSource & " 查询失败", vbCritical
  44.             Set AdoConn = Nothing
  45.             Exit Sub
  46.         End If

  47.         If AdoConn.State = 1 Then
  48.             Set adorst = AdoConn.Execute(strsql)
  49.             temp(i) = adorst.getrows
  50.             i = i + 1
  51.             AdoConn.Close
  52.             'Set adorst = Nothing
  53.         End If
  54.     Next


  55.     Set adorst = Nothing
  56.     Set AdoConn = Nothing
  57.    
  58.     arrXL = WorksheetFunction.Transpose(temp(2))
  59.     arrKC = WorksheetFunction.Transpose(temp(1))
  60.     arrDD = WorksheetFunction.Transpose(temp(0))
  61.     If Err.Number <> 0 Then
  62.         Err.Clear
  63.         MsgBox "数据转置失败,请先清除源表格式重来", vbCritical
  64.         Set AdoConn = Nothing
  65.         Exit Sub
  66.     End If

  67.     ReDim result(1 To UBound(arrDD), 1 To 3)
  68.     Dim dic As Object, dickc As Object
  69.     Set dic = CreateObject("scripting.dictionary")
  70.     Set dickc = CreateObject("scripting.dictionary")

  71.     iPos = 1
  72.     '订单统计
  73.     For i = 2 To UBound(arrDD)
  74.         If Not dic.exists(arrDD(i, 1)) Then
  75.             iPos = iPos + 1
  76.             result(iPos, 1) = arrDD(i, 1)
  77.             result(iPos, 2) = arrDD(i, 2)
  78.             dic(arrDD(i, 1)) = iPos
  79.         Else
  80.             j = dic(arrDD(i, 1))
  81.             result(j, 2) = result(j, 2) + arrDD(i, 2)
  82.         End If
  83.     Next

  84.     '销量统计
  85.     For i = 2 To UBound(arrXL)
  86.         If dic.exists(arrXL(i, 1)) Then
  87.             iPos = dic(arrXL(i, 1))
  88.             result(iPos, 3) = arrDD(i, 2)
  89.         End If
  90.     Next

  91.     '库存统计
  92.     iPos = UBound(result, 2)
  93.     For i = 2 To UBound(arrKC)
  94.         If Not dickc.exists(arrKC(i, 1)) Then
  95.             iPos = iPos + 1
  96.             ReDim Preserve result(1 To UBound(arrDD), 1 To iPos)
  97.             result(dic(arrKC(i, 2)), iPos) = arrKC(i, 3)
  98.             result(1, iPos) = "店面" & arrKC(i, 1) & "的库存"
  99.             dickc(arrKC(i, 1)) = iPos
  100.         Else
  101.             j = dickc(arrKC(i, 1))
  102.             result(dic(arrKC(i, 2)), j) = result(dic(arrKC(i, 2)), j) + arrKC(i, 3)
  103.         End If
  104.     Next

  105.     '写回表格
  106.     Range("a1").Resize(UBound(result), UBound(result, 2)) = result
  107.     '表头
  108.     Range("a1").Resize(1, 3) = Array("编码", "订货数量", "销量")
  109.     Set dickc = Nothing
  110.     Set dic = Nothing

  111.     t = Timer - t
  112.     MsgBox "合并合成" & vbCr & "一共费时 " & t & " 秒"
  113. End Sub
复制代码
重写了个,这个速度快将近10倍。
你有个数据表格式有问题,你把三个表的格式全清除,就不会报错了。
你把2个代码测试的时候到时贴个图,顺便把数据行有多少也贴下。
回复

使用道具 举报

发表于 2013-1-3 10:56 | 显示全部楼层
云影 发表于 2013-1-3 08:33
感谢老师,还是感谢老师
REPT("非常",9e+307)&"感谢hwc2ycy老师"

等"非常"看完,人都老了.....
纯粹不想让人知道答案.!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-27 06:02 , Processed in 0.388615 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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