|
1.用字法计算比较快的,我把代码改了一下;用第三个表的数据源,没有从外面工作簿取数据
"Sub 读取库存与销售数据()
Application.ScreenUpdating = False
Set d = CreateObject("scripting.dictionary") '引用字典
Sheets("数据分析表").Range("i2:w5000").ClearContents '重新计算前,清除原先该区域数据
arr = Sheets("数据分析表").[a1].CurrentRegion '重新取得以空行与空列的组合为边界的区域,与清除前区域未变
For i = 2 To UBound(arr)
If Len(arr(i, 3)) > 0 Then
d(Trim(arr(i, 3))) = i '把第三列循环结果赋给字典d
End If
Next i
brr = Sheets("库存汇总查询1").Range("a1").CurrentRegion '定义数组brr
ReDim br(1 To UBound(brr), 1 To UBound(brr, 2)) '定义数组br
ReDim cr(1 To UBound(brr), 1 To UBound(brr, 2))
For i = 2 To UBound(brr)
If Trim(brr(i, 1)) = "B重庆仓库CQ" Then
n = n + 1 '获取已有数据的笔数
For j = 1 To UBound(brr, 2) '循环"库存汇总查询1"表的第二列的行数
br(n, j) = brr(i, j) '赋值br为已有数笔数对应库存汇总查询1表行数和列数的字典
Next j
End If
If InStr(Trim(brr(i, 1)), "CQ") > 0 Then '这种查询包含了前面一种结果,
'Trim清删除第一列仓库单元格前后空字符,InStr指定一字符串在另一字符串中最先出现的位置。string1 为零长度返回零
m = m + 1 '获取包含CQ内容的笔数
For j = 1 To UBound(brr, 2)
cr(m, j) = brr(i, j) '赋值cr为包含CQ内容的笔数为字典
Next j
End If
Next i '退出i的循环
For i = 1 To n '再循环已查询重庆仓库的次数
m1 = d(Trim(br(i, 4))) '把br第四列赋给字典m1
If m1 <> "" Then
arr(m1, 9) = arr(m1, 9) + br(i, 10)
End If
Next i
For i = 1 To m
m2 = d(Trim(cr(i, 4))) '把cr第四列赋给字典m2
If m2 <> "" Then
arr(m2, 10) = (arr(m2, 10) + cr(i, 10))
'第10列的值等于字典的值,
End If
Next i
For i = 2 To UBound(arr)
arr(i, 10) = arr(i, 10) - arr(i, 9) '包含CQ内容的数量减去已含"B重庆仓库CQ"第九列的数量
Next i
Sheets("数据分析表").[a1].CurrentRegion = arr '重新赋值区域,原区域9-10列添加数据后
Application.ScreenUpdating = True
End Sub" |
|