|
Sub test0() '最好自己发帖,不要寄生在别人的帖子中。 可先列出单位,别重复,也可不列出,自动生成。 代码仅针对楼主附件
Dim ar(), br, i As Long, rowSize As Long
Dim Conn As Object, rs As Object, Dic As Object, Dict As Object
Dim s As String, p As String, f As String
Dim strConn As String, SQL As String
Sheet1.Activate
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")
Set Dict = CreateObject("Scripting.Dictionary")
Set Conn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
With Range("A1").CurrentRegion.Resize(1003, 6) '假设有1000个单位,6个统计项。
.Offset(3, 2).ClearContents '可这样,.Offset(3).ClearContents 清空后全自动 。
ar = Intersect(.Offset(0), .Offset(3)).Value
End With
For i = 1 To UBound(ar)
If Len(Trim(ar(i, 2))) Then
rowSize = rowSize + 1
Dict.Add Trim(ar(i, 2)), rowSize '特意这样写,出错则意味着 单位重复。
End If
Next
s = "Excel 12.0;HDR=YES;Database="
If Application.Version < 12 Then
s = Replace(s, "12.0", "8.0")
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source="
Else
strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source="
End If
Conn.Open strConn & ThisWorkbook.FullName
p = ThisWorkbook.Path & "\收回文件\"
f = Dir(p & "*.xls*")
SQL = "SELECT * FROM [" & s & p & "[.f]].[$A3:F] WHERE `学 校` IS NOT NULL"
Do
If ThisWorkbook.FullName <> p & f Then
Dic.Add Replace(SQL, "[.f]", f), vbNullString
If Dic.Count = 49 Then
Set rs = Conn.Execute(Join(Dic.Keys, " UNION ALL "))
br = rs.GetRows
Processingdata ar, br, Dict, rowSize
Dic.RemoveAll
End If
End If
f = Dir()
Loop While Len(f)
If Dic.Count Then
Set rs = Conn.Execute(Join(Dic.Keys, " UNION ALL "))
br = rs.GetRows
Processingdata ar, br, Dict, rowSize
Dic.RemoveAll
End If
Range("A4").Resize(UBound(ar), UBound(ar, 2)) = ar
rs.Close
Set rs = Nothing
Conn.Close
Set Conn = Nothing
Set Dict = Nothing
Set Dic = Nothing
Application.ScreenUpdating = True
Beep
End Sub
Function Processingdata(ar, br, Dict As Object, rowSize As Long)
Dim i As Long, j As Long, posRow As Long, posCol As Long, s As String
For i = 0 To UBound(br, 2)
s = Trim(br(1, i))
If Not Dict.Exists(s) Then
rowSize = rowSize + 1
Dict.Add s, rowSize
For j = 0 To 1
ar(rowSize, 1 + j) = br(j, i)
Next
End If
posRow = Dict(s)
For j = 2 To UBound(br) - 1
If Not IsNull(br(j, i)) Then ar(posRow, 1 + j) = ar(posRow, 1 + j) + Val(br(j, i)) '各单位数值唯一,不要串填,否则数值累加。
Next
ar(posRow, 1 + j) = ar(posRow, 1 + j) & br(j, i) '各单位备注唯一,不要串填,否则字符串叠加。
Next
End Function |
|