|
楼主 |
发表于 2024-2-28 10:56
|
显示全部楼层
谢谢您的帮助!VBA是真的好用,所有回答中,这个代码是运行速度最快的(受益于使用了数组)。看了您这个案例后,我以后可能更愿意去使用vba了。结合我自己的学习和理解,对代码进行了注释:
- Sub 整理()
- Dim arr, i, n, m
- m = Cells(Rows.Count, "a").End(3).Row
- 'End(3)等价于End(xlUp)
- arr = Range("a2:b" & m)
- '从"A"列的第二行到最后一个有数据的行之间的数据(包括第二行)读入一个二维数组arr中。
- '然后,通过一个循环遍历数组arr中的每一行数据进行条件判断和整理。
- ReDim b(1 To UBound(arr), 1 To 8)
- For i = 2 To UBound(arr)
- '以下循环的逻辑:
- '如果某行数据的第1列的第3至第9位是 "0000000",那么将该行数据的前6位和第2列的值分别赋值给se1和se2。
- '如果某行数据的第1列的第5至第9位是 "00000",那么将该行数据的前6位和第2列的值分别赋值给si1和si2。
- '如果某行数据的第1列的第7至第9位是 "000",那么将该行数据的前6位和第2列的值分别赋值给x1和x2。
- '如果都不满足上述条件,将该行数据的前6位和第2列的值存入新的数组b中,并递增n。
-
- If Mid(arr(i, 1), 3, 7) = "0000000" Then ''''''''''1,第1个if语句,下同
- se1 = Mid(arr(i, 1), 1, 6): se2 = arr(i, 2)
- '用冒号:可以将多行短代码合并成一行代码
- Else
- If Mid(arr(i, 1), 5, 5) = "00000" Then ''''''''''2
- si1 = Mid(arr(i, 1), 1, 6): si2 = arr(i, 2)
- Else
- If Mid(arr(i, 1), 7, 3) = "000" Then ''''''''''3
- x1 = Mid(arr(i, 1), 1, 6): x2 = arr(i, 2)
- Else
- n = n + 1 ''''''''''4,将内容放到数组中
- b(n, 1) = se1: b(n, 2) = se2
- b(n, 3) = si1: b(n, 4) = si2
- b(n, 5) = x1: b(n, 6) = x2
- b(n, 7) = arr(i, 1): b(n, 8) = arr(i, 2)
- End If ''''''''''3
- End If ''''''''''2
- End If ''''''''''1
- '横向堆叠的时候,容易把省、市、县的内容在镇级中重新堆叠一次,出现镇列与原数据相同的情况,
- '这里特别巧妙,用循环结构把这种情况排除出去了,只要行政区划代码的最后7位是0,就不会运行代码4,因此也就不用考虑错行的问题
- Next
- '清空"E4:L"区域的内容,然后将整理好的数组b写入到"E3"开始的区域中,共n行8列
- Range("E4:L" & Rows.Count).ClearContents
- Range("e3").Resize(n, 8) = b
-
- End Sub
复制代码 |
|