最近一直在讲解如何利用VBA,在EXCEL的多个工作表中进行大数据的查询。今天把近期内容精炼总结一下,想利用此程序的朋友可以拷贝下面的代码,放在编译器中就可以直接使用啦。

1 Sub KK()

2 Sheets("SHEET1").Select

3 I = 2

4 Do While Cells(I, 1) <> ""

5 Cells(I,1).Select

6 TT =Cells(I, 1)

7 Cells(I, 2) = ""

8

9 Set FJX =Sheets("A").Range("A1:A"&Sheets("A").Range("A1").End(xlDown).Row).Find(TT,AFTER:=[A1],LOOKAT:=xlWhole)

10 If Not FJXIs Nothing Then Cells(I, 2) = Sheets("A").Cells(FJX.Row, 2)

11

12 Set FJX

=Sheets("B").Range("A1:A" Sheets("B").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)

14

15 Set FJX

=Sheets("C").Range("A1:A"&Sheets("C").Range("A1").End(xlDown).Row).Find(TT,

AFTER:=[A1], LOOKAT:=xlWhole)

16 If Not FJX Is 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 FJX

Is Nothing Then Cells(I, 2) =Sheets("D").Cells(FJX.Row, 2)

20 I = I + 1

21 Set FJX =Nothing

22 Loop

23 End 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) <> ""

』DO WHILE是一个循环是循环的标识,回调语句是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

9 Set 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 Set FJX

=Sheets("C").Range("A1:A"&Sheets("C").Range("A1").End(xlDown).Row).Find(TT,

AFTER:=[A1], LOOKAT:=xlWhole)

16 If Not FJX Is 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)

19 If Not FJX Is Nothing Then Cells(I, 2)=Sheets("D").Cells(FJX.Row, 2)

』18、19 行时执行的工作表D的查找回顾一下从第9行开始直到第19行总共运行了4个工作表

20 I = I + 1 』I 指增加1

21

21 Set FJX = Nothing 』另FJX为空准备下轮的查找

22 Loop 』程序回调到第4行 DO WHILE

23 End Sub 』程序结束。

有兴趣的朋友可以试著使用一下,如果好用别忘了分享。如果有改进,别忘了晒晒代码。

分享成果,随喜正能量

推荐阅读:

相关文章