|
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
我的代码其实很好理解,就是一般思路,一行行、一列列比对。
希望我的注释不会让大家糊涂了。- Const r = 4
- '定义常量r=4,因为所有的行列都从4开始,这是为了程序的可读性,否则一直加3、加4不好理解
- Sub cc()
- Dim i&, j&, k&, m&, n&, x&, rng, Arr, brr, Sh As Worksheet, d As Object
- Application.ScreenUpdating = False
- '停止屏幕更新
- Range(Cells(2, 2), Cells(2, 100)).Replace "Z", "V"
- '将表格中第一行里的"Z"换成"V"
- rng = [b1].CurrentRegion
- '将总表中单元格区域传递给数组rng
- For i = r To UBound(rng) - 1
- If rng(i, 1) = "" Then rng(i, 1) = rng(i - 1, 1)
- Next
- '因为是合并单元格(例如广东,"A4:A14",只有A4不为空),所以把省份为空值的变为与前一数值相同
- For i = r To UBound(rng, 2) - 1
- If rng(2, i) = "" Then rng(2, i) = rng(2, i - 1)
- Next
- '同上一段代码用途,这里是把手机机型为空的变为与前一数值相同
- For Each Sh In ThisWorkbook.Sheets
- '在各个表中循环
- If Sh.Name <> "总表" Then
- t = 0
- '设置变量t为0
- Set d = CreateObject("scripting.dictionary")
- '建立字典,这是的字典用途和那几位老师的不同,只是为了方便剔除总表中有而分表中没有的机型,加快速度
- Arr = Sh.[b1].CurrentRegion
- '将分表中单元格区域传递给数组arr
- For i = r To UBound(Arr) - 1
- If Arr(i, 1) = "" Then Arr(i, 1) = Arr(i - 1, 1)
- Next
- '与总表中一样,把省份为空的变为与前一数值相同
- For i = r To UBound(Arr, 2)
- If Arr(2, i - 1) = "" Then Arr(2, i - 1) = Arr(2, i - 2)
- d(Arr(2, i - 1) & Arr(3, i - 1)) = ""
- Next
- '与总表中一样,把机型为空的变为与前一数值相同,并把分表中的机型放入字典
- '当总表中的机型分表中没有,则跳过,节省时间
- n = 0
- For k = r To UBound(rng, 2) - 1
- m = 0
- x = 0
- y = 0
- '设置变量m,x,y为0
- 'm是用来在数组rng中的纵列递增的
- 'x,y是用来在数组arr中的纵列递增的
- '以上用法用来减少循环层数
- Do While t < UBound(rng, 2) - 2
- '它的意思不用说了,主要说明它的用途,因为我的代码就是让两个数组纵向比对之后,再横向比对
- 't就用来控制在数组rng的横向比对中不要出界,所以t的最大值是UBound(rng, 2) - 3
- j = j + 1
- 'j是用来控制在数组rng的纵向比对中不要出界的,所以j的最大值是UBound(rng) - 3
- Stop
- If d.exists(rng(2, t + 2) & rng(3, t + 2)) Then
- '当数组arr(分表)中包含rng(总表)中的机型与颜色(机型与颜色同时比对)时,继续运行下行代码
- If j = UBound(rng) - 3 Then m = 0: n = n + 1: GoTo 0
- 'j达到最大值UBound(rng) - 3时,m清零,因为一个纵列中所有行已经比对完成了,下一列从头开始
- 'n的作用与t相同,将数组arr一列一列提取比对,接着运行标识“0”后面的代码
- m = m + 1
- If rng(r + m - 1, 1) & rng(r + m - 1, 2) = Arr(r + x, 1) & Arr(r + x, 2) Then
- '当数组arr(分表)中与含rng(总表)中的省份与销售网点相同(省份与销售网点同时比对)时,继续运行下行代码
- y = y + 1
- If rng(2, t + 2) & rng(3, t + 2) = Arr(2, r + n - 1) & Arr(3, r + n - 1) Then
- '当数组arr(分表)中与含rng(总表)中的机型与颜色相同时,继续运行下行代码
- rng(m + 3, t + 2) = rng(m + 3, t + 2) + Arr(3 + y, r + n - 1)
- '将数组arr中的销售数量与rng中省份与销售网点相同、机型与颜色相同的数量相加
- 'Cells(m + 3, t + 3) = Cells(m + 3, t + 3) + Arr(3 + y, r + n - 1)
- '上面这行是当时测试代码时,在单元格中填充数值验证对错用的
- x = x + 1
- 'x递增,继续比对arr中的某列中的下一行
- End If
- End If
- Else
- 0
- t = t + 1
- x = 0
- j = 0
- y = 0
- '列递数增加1,行递增数清零
- End If
- Loop
- n = n + 1
- If n = UBound(Arr, 2) Then n = 0
- '当n达到最大值是,清零
- Next
- End If
- Set d = Nothing
- '清除字典中的内容,因为下一个工作表还要用
- Next
- [b1].Resize(UBound(rng) - 1, UBound(rng, 2) - 1) = rng
- '填充数组rng到总表,但跳过最后一行和一列,因为它们有公式。
- Range(Cells(2, 2), Cells(2, 100)).Replace "V", "Z"
- '把总表中原先替换的再换回来
- Application.ScreenUpdating = True
- '打开屏幕更新
- End Sub
复制代码 |
评分
-
1
查看全部评分
-
|