分享

【新手必备】VBA练手专题

 VBA说 2020-04-07

很多初学者学完课本或者看完视频,往往找不到练手的实际例子。

这里我给大家分享一些例子(这些例子都是我在线答疑或者代工的过程中遇到的),着重于使用循环。如果这几个例子掌握了,基本也就算入门了。

因为我觉得【VBA的入门=学会循环】←猛戳学会循环,可跳转循环专题。

下面的例子,着重看思路!!!着重看思路!!!着重看思路!!!

因为思路必须自己大脑理解清楚,思路百度不出来。其余代码都可以通过百度解决。

看看循环上下限如何取,还有IF条件怎么转化为代码的。

For...Next...循环

最简单的For...Next循环应用,实际解决问题中,基本都是多个循环嵌套。所以最基础的一定要回,这个用好了是进行循环嵌套的基础。

思路:利用For循环,从第一行(循环上限)循环到已使用的最大行数(循环下限),在C列写入值。

具体代码如下:

Sub AB列相加求和()
a = Cells(Rows.Count, 1).End(3).Row '求得A列已使用的最大行号,赋值给变量a
    For i = 1 To a 'a作为循环下限
        Cells(i, 3) = Cells(i, 1) + Cells(i, 2'AB列相加,结果放在C列
    Next
End Sub

For...Next...循环嵌套If判断语句

下面升级一下难度,For...Next循环嵌套IF判断语句。这种结构是比较常见的组合,循环+判断。这个例子的要求:删除名字是2个字或者名字是叠字的人所在的行。

思路:利用For循环,从第一行(循环上限)循环到已使用的最大行数(循环下限)。当姓名是两个字或者姓名是叠字的时候(IF判断语句的条件,具体书写需要字符串处理函数),删除该行数据。

具体代码如下:

Sub 删除特定的行()
Application.ScreenUpdating = False
    row1 = ActiveSheet.Cells(Rows.Count, 1).End(3).Row '获取A列已使用的最大行号
    For i = row1 To 1 Step -1 'For循环,只要涉及到删除行的操作,都要从后往前【从大到小】循环。
        a = Cells(i, 1'A列数据赋值给变量a
        b = Mid(a, Len(a) - 11'取得名字倒数第二个字
        If Len(a) = 2 Or b = Right(a, 1Then '条件:如果名字是两个字以及重叠字的名字
            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 '取得Sheet1已使用的最大行号
    r2 = Worksheets("Sheet2").Cells(Rows.Count, 1).End(3).Row '取得Sheet2已使用的最大行号
    For x = 2 To r1 '对Sheet1 A列数据进行循环
        For y = 2 To r2 '对Sheet2 A列数据进行循环
            If Worksheets("Sheet2").Cells(y, 1) = Worksheets("Sheet1").Cells(x, 1Then '如果Sheet2中A列某个单元格名字=Sheet1中A列第x行的名字
                Worksheets("Sheet2").Cells(y, 2).Resize(18).Copy Worksheets("Sheet1").Cells(x, 2'复制Sheet2中第y行A-I列数据到Sheet1
            Else
            End If
        Next
    Next
    MsgBox "完成!"
End Sub

■上述代码中是利用循环逐个查找的笨办法,快的办法是利用Find直接在Sheet2 A列查找是否有某个名字。效率会大大提高。

Sub 查询2()
    r1 = Worksheets("Sheet1").Cells(Rows.Count, 1).End(3).Row '取得Sheet1已使用的最大行号
    For x = 2 To r1 '对Sheet1 A列数据进行循环
        Set Rng = Worksheets("Sheet2").Range("a:a").Find(Worksheets("Sheet1").Cells(x, 1).Value, , xlValues, xlWhole, , , TrueTrue)
        If Not Rng Is Nothing Then
            Rng.Resize(18).Copy Worksheets("Sheet1").Cells(x, 1'复制Sheet2中第y行B-I列数据到Sheet1
        Else
        End If
    Next
    MsgBox "完成!"
End Sub

综合案例:汇总工作簿

上面的学会了,下面的就很简单了。最最典型的汇总工作簿的例子。

思路:循环打开工作簿框架参考之前的文章【经验】快速学习VBA【收藏备用】工作簿(表)合并拆分那些事。符合条件,复制数据。


所有文件数据《汇总》工作簿

文件结构

具体代码如下:

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(10)
            wb.Close False
        Else
        End If
        myname = Dir
    Loop
    Application.ScreenUpdating = True
    MsgBox "完成!"
End Sub

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多