本例的问题描述:
1:源数据与提取的结果在同一个工作表里面;
2:提取K、M、O、Q列里面不重复的数据(注意,数据列里面有空白的行);
3:把提取出来的结果放在A2单元格的下方,不能有空白行;
源数据及目标结果如下:
解决的思路详解:
1:由于K、M、O、Q四列不连续,且中间还有数据(在截图的时候,中间的数据删除了,实际运用的时候,是有数据的)还有空白的单元格出现。所以arr = sht.Range("a1").CurrentRegion这种方法就不适用了;
2:获取一列的最后一个非空单元行,再用Range“K1:K100”)类似这样的方式来获取列的区域了;
3:由于四列的不连续,所以循环需要一点小的技巧,详见后续的代码;
4:提取不重复的值,相信看过之前的文章都知道,要用到字典了;
代码运行的结果如下:
代码如下:
Sub test()
Dim arr, col, i, j, dic
Set dic = CreateObject("scripting.dictionary")
col = Split("K m o q")
For i = 0 To UBound(col)
arr = Range(col(i) & "1").Resize(Cells(Rows.Count, col(i)).End(xlUp).Row)
For j = 3 To UBound(arr, 1)
If Len(arr(j, 1)) Then dic(arr(j, 1)) = j
Next j, i
[a2].Resize(dic.Count).ClearContents
[a2].Resize(dic.Count) = Application.Transpose(dic.keys)
End Sub
代码解析
1:2行 定义变量;
2:3行 后期绑定字典;
3:4行 把四列不连续的只放入col数组;
4:5~6行 遍历col数组,获取最后一列的非空单元格之后,与第一列的区域,赋值给arr数组;
5:7行 遍历arr数组;
6:8行 用len判断单元格的类容是否为非空,把不是空的单元格放入字典d;
7:10行 清除指定区域的内容;
8:11行 把结果赋值给指定的区域;
本例思考:
1:本例思维两点,是把不连续的列数据,用循环来提取。
小结:
解决本问题,需要用的知识点:
1:字典的经典运用;
2:split函数
延伸阅读:
Excel VBA 数组公式Split 和Join
Excel VBA 字典的常用方式
Excel VBA 字典入门key和item
Excel VBA 按照要求提取数据,数据及字典法