|
- Sub 合并统计2()
- 'SQL方法
- Dim arrXL, arrKC, arrDD, arr, item, temp
- Dim FileXL$, FileKC$, FileDD$
- Dim result, iPos&, dataSource$
- Dim i&, j&
- Dim app As Object
- Dim t#
- temp = Array(1, 2, 3)
- FileXL = "销量.xlsx"
- FileKC = "库存.xlsx"
- FileDD = "订单.xlsx"
- arr = Array(FileDD, FileKC, FileXL)
- t = Timer
- 'On Error Resume Next
- For Each item In arr
- If Len(Dir(ThisWorkbook.Path & "" & item, vbNormal)) = 0 Then
- MsgBox item & " 不存在", vbCritical
- Exit Sub
- End If
- Next
- Dim AdoConn As Object, adorst As Object
- Dim strconn$, strsql$
- Set AdoConn = CreateObject("ADODB.Connection")
- strsql = "select * from [sheet1$]"
- For Each item In arr
- dataSource = ThisWorkbook.Path & "" & item
- Select Case Application.Version
- Case Is = "14.0":
- strconn = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & _
- dataSource & ";Extended Properties=""Excel 12.0;HDR=no;imex=1"";"""
- Case Is = "12.0"
- strconn = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & _
- dataSource & ";Extended Properties=""Excel 12.0;HDR=no;imex=1"";"""
- Case Else
- strconn = "Provider= Microsoft.Jet.OLEDB.4.0;" & _
- "Data Source=" & dataSource & "Extended Properties=""Excel 8.0;HDR=no;imex=1"";"
- End Select
- On Error Resume Next
- AdoConn.Open strconn
- If Err.Number <> 0 Then
- Err.Clear
- MsgBox dataSource & " 查询失败", vbCritical
- Set AdoConn = Nothing
- Exit Sub
- End If
- If AdoConn.State = 1 Then
- Set adorst = AdoConn.Execute(strsql)
- temp(i) = adorst.getrows
- i = i + 1
- AdoConn.Close
- 'Set adorst = Nothing
- End If
- Next
- Set adorst = Nothing
- Set AdoConn = Nothing
-
- arrXL = WorksheetFunction.Transpose(temp(2))
- arrKC = WorksheetFunction.Transpose(temp(1))
- arrDD = WorksheetFunction.Transpose(temp(0))
- If Err.Number <> 0 Then
- Err.Clear
- MsgBox "数据转置失败,请先清除源表格式重来", vbCritical
- Set AdoConn = Nothing
- Exit Sub
- End If
- ReDim result(1 To UBound(arrDD), 1 To 3)
- Dim dic As Object, dickc As Object
- Set dic = CreateObject("scripting.dictionary")
- Set dickc = CreateObject("scripting.dictionary")
- iPos = 1
- '订单统计
- For i = 2 To UBound(arrDD)
- If Not dic.exists(arrDD(i, 1)) Then
- iPos = iPos + 1
- result(iPos, 1) = arrDD(i, 1)
- result(iPos, 2) = arrDD(i, 2)
- dic(arrDD(i, 1)) = iPos
- Else
- j = dic(arrDD(i, 1))
- result(j, 2) = result(j, 2) + arrDD(i, 2)
- End If
- Next
- '销量统计
- For i = 2 To UBound(arrXL)
- If dic.exists(arrXL(i, 1)) Then
- iPos = dic(arrXL(i, 1))
- result(iPos, 3) = arrDD(i, 2)
- End If
- Next
- '库存统计
- iPos = UBound(result, 2)
- For i = 2 To UBound(arrKC)
- If Not dickc.exists(arrKC(i, 1)) Then
- iPos = iPos + 1
- ReDim Preserve result(1 To UBound(arrDD), 1 To iPos)
- result(dic(arrKC(i, 2)), iPos) = arrKC(i, 3)
- result(1, iPos) = "店面" & arrKC(i, 1) & "的库存"
- dickc(arrKC(i, 1)) = iPos
- Else
- j = dickc(arrKC(i, 1))
- result(dic(arrKC(i, 2)), j) = result(dic(arrKC(i, 2)), j) + arrKC(i, 3)
- End If
- Next
- '写回表格
- Range("a1").Resize(UBound(result), UBound(result, 2)) = result
- '表头
- Range("a1").Resize(1, 3) = Array("编码", "订货数量", "销量")
- Set dickc = Nothing
- Set dic = Nothing
- t = Timer - t
- MsgBox "合并合成" & vbCr & "一共费时 " & t & " 秒"
- End Sub
复制代码 重写了个,这个速度快将近10倍。
你有个数据表格式有问题,你把三个表的格式全清除,就不会报错了。
你把2个代码测试的时候到时贴个图,顺便把数据行有多少也贴下。 |
|