很多初学者学完课本或者看完视频,往往找不到练手的实际例子。 这里我给大家分享一些例子(这些例子都是我在线答疑或者代工的过程中遇到的),着重于使用循环。如果这几个例子掌握了,基本也就算入门了。 因为我觉得【VBA的入门=学会循环】←猛戳学会循环,可跳转循环专题。 下面的例子,着重看思路!!!着重看思路!!!着重看思路!!! 因为思路必须自己大脑理解清楚,思路百度不出来。其余代码都可以通过百度解决。 看看循环上下限如何取,还有IF条件怎么转化为代码的。
最简单的For...Next循环应用,实际解决问题中,基本都是多个循环嵌套。所以最基础的一定要回,这个用好了是进行循环嵌套的基础。
■思路:利用For循环,从第一行(循环上限)循环到已使用的最大行数(循环下限),在C列写入值。 ■具体代码如下: Sub AB列相加求和() a = Cells(Rows.Count, 1).End(3).Row For i = 1 To a Cells(i, 3) = Cells(i, 1) + Cells(i, 2) Next End Sub
下面升级一下难度,For...Next循环嵌套IF判断语句。这种结构是比较常见的组合,循环+判断。这个例子的要求:删除名字是2个字或者名字是叠字的人所在的行。
■思路:利用For循环,从第一行(循环上限)循环到已使用的最大行数(循环下限)。当姓名是两个字或者姓名是叠字的时候(IF判断语句的条件,具体书写需要字符串处理函数),删除该行数据。 ■具体代码如下: Sub 删除特定的行() Application.ScreenUpdating = False row1 = ActiveSheet.Cells(Rows.Count, 1).End(3).Row For i = row1 To 1 Step -1 a = Cells(i, 1) b = Mid(a, Len(a) - 1, 1) If Len(a) = 2 Or b = Right(a, 1) Then Cells(i, 3).EntireRow.Delete Else End If Next Application.ScreenUpdating = True End Sub
两个For...Next...循环嵌套,再加一个If判断语句 下面再升级一下难度,两个For...Next...循环嵌套,再加一个If判断语句。这种结构如果你能写出来了,并且思路很清楚为什么这么写,就算入门了。 ■思路:利用For循环,从第一行(循环上限)循环到已使用的最大行数(循环下限)。当找到Sheet2中A列某个名字等于Sheet1中A列名字的时候,直接把名字后面的具体数据复制到Sheet1。 ■具体代码如下: Sub 查询() r1 = Worksheets("Sheet1").Cells(Rows.Count, 1).End(3).Row r2 = Worksheets("Sheet2").Cells(Rows.Count, 1).End(3).Row For x = 2 To r1 For y = 2 To r2 If Worksheets("Sheet2").Cells(y, 1) = Worksheets("Sheet1").Cells(x, 1) Then Worksheets("Sheet2").Cells(y, 2).Resize(1, 8).Copy Worksheets("Sheet1").Cells(x, 2) Else End If Next Next MsgBox "完成!" End Sub
■上述代码中是利用循环逐个查找的笨办法,快的办法是利用Find直接在Sheet2 A列查找是否有某个名字。效率会大大提高。 Sub 查询2() r1 = Worksheets("Sheet1").Cells(Rows.Count, 1).End(3).Row For x = 2 To r1 Set Rng = Worksheets("Sheet2").Range("a:a").Find(Worksheets("Sheet1").Cells(x, 1).Value, , xlValues, xlWhole, , , True, True) If Not Rng Is Nothing Then Rng.Resize(1, 8).Copy Worksheets("Sheet1").Cells(x, 1) Else End If Next MsgBox "完成!" End Sub
上面的学会了,下面的就很简单了。最最典型的汇总工作簿的例子。所有文件数据《汇总》工作簿 文件结构 ■具体代码如下: Sub 循环打开工作簿() Application.ScreenUpdating = False myname = Dir(ThisWorkbook.Path & "\" & "*.xls*") Do While myname <> "" If myname <> ThisWorkbook.Name Then Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & myname) Set sht = wb.Worksheets(1) r = sht.Range("a65536").End(3).Row sht.Range("a2:f" & r).Copy ThisWorkbook.Worksheets("sheet1").Range("a65536").End(3).Offset(1, 0) wb.Close False Else End If myname = Dir Loop Application.ScreenUpdating = True MsgBox "完成!" End Sub
|