最近两周一直在讲解如何利用VBA,在EXCEL的多个工作表中进行大数据的查询。今天把两周的内容精炼总结一下,想利用这些程序的朋友,可以拷贝下面的代码,放在编译器中就可以直接使用啦。
1 Sub KK()
2 Sheets("SHEET1").Select
3 I = 2
4 Do WhileCells(I, 1) ""
5 Cells(I,1).Select
6 TT =Cells(I, 1)
7 Cells(I, 2) = ""
8
9 SetFJX =Sheets("A").Range("A1:A"&Sheets("A").Range("A1").End(xlDown).Row).Find(TT,AFTER:=[A1],LOOKAT:=xlWhole)
10 If NotFJXIs Nothing Then Cells(I, 2) = Sheets("A").Cells(FJX.Row, 2)
11
12 SetFJX =Sheets("B").Range("A1:A" &Sheets("B").Range("A1").End(xlDown).Row).Find(TT,AFTER:=[A1],LOOKAT:=xlWhole)
13 If Not FJXIs Nothing Then Cells(I, 2) =Sheets("B").Cells(FJX.Row, 2)
14
15 SetFJX =Sheets("C").Range("A1:A"&Sheets("C").Range("A1").End(xlDown).Row).Find(TT, AFTER:=[A1], LOOKAT:=xlWhole)
16 If Not FJXIs Nothing Then Cells(I, 2) =Sheets("C").Cells(FJX.Row, 2)
17
18 Set FJX=Sheets("D").Range("A1:A" &Sheets("D").Range("A1").End(xlDown).Row).Find(TT,AFTER:=[A1],LOOKAT:=xlWhole)
19 If Not FJXIs Nothing Then Cells(I, 2) =Sheets("D").Cells(FJX.Row, 2)
20 I = I + 1
21 Set FJX =Nothing
22 Loop
23End Sub
代码截图:
工作表截图:注意名称
下面对代码进行逐行讲解:
1 Sub KK()’KK给出程序的名称
2 Sheets("SHEET1").Select’指选择sheet1的工作表,并进行操作
3 I = 2’是对变量i赋初始值,一般要用Dim i as Integer 进行声明。这里可以仅用Dim i, 也可以再简单点,直接用也行。但这不是说Vba是动态语言,相反,这恰恰说明了VBA作为静态语言的灵活性。
4 Do While Cells(I, 1) ""’DOWHILE是一个循环,是循环的标识,回调语句是loop,WHILE跟循环条件,是指第i行第一个单元格不为空建立一个循环。 变量是i,条件是直到i行的第一个单元格是空值。
5 Cells(I, 1).Select’要对第I行一个单元格定位,这也是为了程序具有可视性。
6 TT = Cells(I, 1)’然后把它的值value取出赋給TT,这也是为了以后操作简单。这里TT也是直接用的,略去了声明语句。
7 Cells(I, 2) =""’要把第2个单元格清空,两个半角双引号,中间什么也没有就是空值,和空格不同,空格是" "。
8
9Set FJX=Sheets("A").Range("A1:A"&Sheets("A").Range("A1").End(xlDown).Row).Find(TT,AFTER:=[A1],LOOKAT:=xlWhole)
’SET是令FJX等于一个值,(这里也应先给FJX 事先声明此程序略去了),
sheets("A")是指名称为A的那个工作表;
Range("A1:A"& Sheets("A").Range("A1").End(xlDown).Row)是指从A1单元格开始向下直到最后一个不为空的单元格区域;
Sheets("A").Range("A1:A"& Sheets("A").Range("A1").End(xlDown).Row)是指A的工作表中在A1到最后一个不为空的单元格区域;
Find(TT,AFTER:=[A1], LOOKAT:=xlWhole)要查找值为TT的单元格,在A1的after后开始查询,是完全匹配,把区域和之后的操作间隔一个。
这样就把查找的结果赋给了FJX。
10 If Not FJXIs Nothing Then Cells(I, 2) = Sheets("A").Cells(FJX.Row, 2)
’if then语句, 如果...那么......。查询的结果放在FJX,FJX is Nothing就是说没有查到结果。给它一个逻辑否定,就是前面加个NOT,其意思就是FJX不为Nothing 就是查到了,查到了怎么办?fjx.Row是指查到数据的行号。Sheets("A").Cells(FJX.Row,2)就是在A工作表查到的行号的第2个单元格的值,Cells(I, 2) = Sheets("A")。Cells(FJX.Row, 2)即第i行第2个单元格的值将等于工作表A中查到的行号的第2个单元格的值 Cells(I, 2) 是哪个工作表呢?指Sheets("SHEET1")。
11
12 SetFJX =Sheets("B").Range("A1:A"&Sheets("A").Range("A1").End(xlDown).Row).Find(TT,AFTER:=[A1],LOOKAT:=xlWhole)
13 If Not FJX Is Nothing Then Cells(I, 2)=Sheets("B").Cells(FJX.Row, 2)’这两行类似于第9第10行,是处理当在B工作表中继续查找的操作。当查到后会有第13行的操作,和第10行的操作一样,这里要注意:第一,xlwhole是指单元格完全匹配的查找。第二,连接字符串的符号是&,不可用加号,当用到.cells时前面要用With,现在还没有用到,以后会有。
14
15 SetFJX =Sheets("C").Range("A1:A"&Sheets("C").Range("A1").End(xlDown).Row).Find(TT, AFTER:=[A1], LOOKAT:=xlWhole)
16 If Not FJXIs Nothing Then Cells(I, 2) =Sheets("C").Cells(FJX.Row, 2)
’15行和16行是在工作表“C”中进行的查找,也就是说:首先在工作表“A”中查找,然后就在“B”中查找,再次在"C"中查找。一旦查找到就执行将此行的第二个单元格的VALUE赋给 Sheets("SHEET1")的工作表的I行第二个单元格值,这样就实现了在多个工作表中的查询。
17
18 Set FJX=Sheets("D").Range("A1:A" &Sheets("D").Range("A1").End(xlDown).Row).Find(TT,AFTER:=[A1],LOOKAT:=xlWhole)
19If Not FJX Is Nothing Then Cells(I, 2)=Sheets("D").Cells(FJX.Row, 2)
’18行和19行是执行工作表D的查找。回顾一下,从第9行开始直到第19行总共运行了4个工作表
20I = I + 1’I指增加1
2121 Set FJX = Nothing’另FJX为空准备下轮的查找
22 Loop’程序回调到第4行 DO WHILE
23 End Sub’程序结束。
有兴趣的朋友可以试着使用一下,如果好用别忘了分享。如果有改进,别忘了晒晒代码。
分享成果,随喜正能量
领取专属 10元无门槛券
私享最新 技术干货