当前位置 博文首页 > 初学VBA

    初学VBA

    作者:山水有相逢 时间:2021-01-08 15:02

    一个最基本的VBA程序 

    Sub test() //宏开始
    Dim ge As Range //定义变量
    
    For Each ge In Range("a1:a10") //从a1到a10遍历
    ge = 1//对每个单元格进行赋值
    Next//循环结束标志
    End Sub//宏结束标志

    基本语法:(对VBA来说,没有大小写之分,一律认为是小写,保留字等会在写完之后自动改变大小写)

    1.判断:

         if (判断条件,例:i = 1)Then

             (判断成立后执行)

         ElseIf (判断条件,例i=3) Then

           (判断成立后执行)

         Else

             (以上全不成立时执行)

         End if

    2.循环:

         a.for循环:(相当于java里的for循环)

               for (初始值,例:i=1)  to (循环结束条件,例:i=5)step (步长,可不写,例:2,相当于for循环中的i+=2)

                   (循环运行代码)

              next

        b.for each循环:(相当于while循环,一般是遍历时使用)

              for each (变量,例:ge(变量定义在dim里,如:dim ge as Range)) in (遍历范围,例:Range("a1:a10"))

                    (循环运行代码)

              next

    3.with语句:

            (大概类似于css里的style属性吧)

             with (单元格或表或其他属性的设置,例:sheet1(表1)/cells(所有单元格))

                  (对于单元格等其他的设置,例:.Range("a1")=1   .Range("a3")=5(注意前面有点))

             end with

    4.对文件操作:

            a.打开一个文件:

                 Workbooks.Open Filename:="(文件路径,例:C:\Users\zhengww\Desktop\MoveRule.xlsx)"(注意在等号之前有和冒号

            b.对当前打开文件进行操作:

                 ActiveWorkbook.Sheets(1).Range("a1") = "2222"(将当前文件的sheet1的单元格a1赋值为2222

            c.保存文件:

                ActiveWorkbook.Save

                ActiveWorkbook.SaveAs Filename:="(文件路径,例:C:\Users\zhengww\Desktop\MoveRule.xlsx)" (相当与另存为)

     

            d.关闭文件:

                ActiveWorkbook.Close

            e.新建文件:

               Workbooks.Add

    5.Dir函数:

           a.验证文件是否存在:

                Dir((文件的路径,例:"C:\Users\zhengww\Desktop\MoveRule.xlsx"))   (若该文件存在,返回值为文件名,若不存在,则返回空值,支持通配符*,类似正则

                在使用通配符时,若存在多个文件符合的,第二个接受时可不带参数,直到没有文件符合时,会返回空值,若再写,则程序出错

     

    //如存在文件MoveRule.xls和MoveRule.xlsx两个文件
    Sub test()
    //会返回MoveRule.xls(根据文件的先后顺序)
    Range("a1") = Dir("C:\Users\zhengww\Desktop\MoveRule.xls*")
    //返回MoveRule.xlsx
    Range("a2") = Dir
    //返回空值
    Range("a3") = Dir
    End Sub

      

    6.数组:

           a.数组的定义:

               dim arr() (不固定大小,一般将区域赋值给数组

              dim arr(1 to 4)  (表示数组大小是4,是将数值赋值给数组)

           b.数组的使用:

               存值:arr=Range("a1:d9")  (表示将单元格a1到d9里所 有的值赋给数组

               取值:Range("a12")=arr(5,1)   (相当于一个二维数组)

           c.数组的范围:

               数组的上限:UBound(arr)  (返回值为数组结束下标)   

               数组的下限:LBound(arr)     (返回值为数组开始的下标

    7.单元格的常用操作:

           a.单元格的引用方式:

               以下都表示单元格a10,[a10](里面只能用固定的值,不能用定义的变量)、

               cells(10,1) (两个值都可以是变量,前面表示列,后为行),

               range("a10")(只有后一个值为变量,前一个不能为变量),range("a10").value(带value表示单元格的值,默认情况下不带时也表示单元格的值

          b.单元格的相对引用:

               range("a1").offset(0,-1)(表示单元格a1左边的单元格),

               Range("a65536").End (xlUp(上边界)\xlDown(下边界)\xltoLeft(右边界)\xltoRight(左边界)),(通常用来表示计算使用多少单元格,

               例:Range("a65536".)End (xlUp),a65536表示以后缀xls结束的文件最长有65536行,这句话就表示最后一行的上边界,即有值的地方,若遍历时,就可以遍历全部有值的单元格

          c.扩散单元格的范围:

               range("a1").resize(1,4).select  (表示以单元格a1为头,扩散为四行一列并选中)

               Range("a1").EntireRow.select  (表示选择单元格a1所在的整行)

         d.单元格的复制:

              range("h7:l7").copy range("n7")  (表示单元格h7到n7复制到n7及之后的位置,但需要能放得下)

         e.单元格的合并:

             Range("a1:a2").Merge  (表示合并单元格a1和a2)

         f.单元格的查找:

             Range("(查找范围,例:d:d)").Find("(查找的内容,例:Name)")   (其返回值是一个单元格,即可以使用单元格的属性)

         g.单元格的清空:

            Range("a1").ClearContents  (将单元格a1的内容清空)

    8.对sheet的操作:

          a.对表的筛选:

               sheets(1).range("(筛选范围,例:a1:f1048)").AutoFilter field = (列号,例:4,即表示以第四列筛选), criterial:=(筛选的值,例:"1111",表示第四列等于"1111"时的所有数据)

          b.新建表:

               sheets.add after := Sheets(sheets.count)  (在表的最后面新建表(即新建sheet))

    9.事件的处理:

          a.建立事件程序:(在VBA编辑界面,点击要执行事件的表(sheet)或工作簿(ThisWorkbook),将上面的(General)改为Worksheet,在他的右边可以设置事件类型,如选区变化时执行等等)

               (注意:需要让excel表打开,不是最小化,最小化可能点击表格时无效)                    

          b.事件类型:

                 Change(表中任一单元格内容被改变时触发)

                 SelectionChange(表示选取发生改变)

                 Active(当前表被激活,即为点击表,该表变为当前工作表)

           c.常用事件函数:

                 ActiveWorkbook.RefreshAll   (刷新全部内容)

           d.保存副本:

                点击BeforeSave事件,利用SaveCopyAs "(保存路径地址,例:C:\data)"   (工作簿才有的事件类型,一般用于备份文档,只是将保存的文件备份到其他地址,不影响当前改的文档)

    10. 控件

          a. 插入控件的方式:在开发模式工具栏中,点击插入,可以看到两列可插入的控件,选择ActiveX下的控件插入,写事件时可以和9相似,找到在那个表里添加的控件

     

          b. 控件的一些属性:

                 Sheets(1).CommandButton1.Caption  (可以更改控件按钮上的文字,也可以得到控件按钮上的文字

                 Sheets(1).OptionButton4.Visible = False隐藏控件,此为单选控件,其他控件类似

                 下拉框添加内容:ComboBox1.AddItem "昆山";

       //根据TextBox1输入的内容联想表格sheets(1)里a栏的内容,在输入四个以上字符时开始查找,
    //如果有则让列表框中出现所有的含有输入字符的内容,
    //如果没有则不显示列表框,每次改变TextBox1就会自动运行这个事件

    Private Sub TextBox1_Change() Dim i As Integer Me.ListBox1.Clear//清空列表框 Me.ListBox1.Visible
    = False//隐藏列表框 If Len(Me.TextBox1) > 3 Then//当当前输入的字符大于3个时才会开始查找 For i = 1 To 7 If InStr(Sheets(1).Range("a" & i), Me.TextBox1.Value) Then//匹配输入字符 Me.ListBox1.AddItem Sheets(1).Range("a" & i)//将符合条件的添加到列表框中 End If Next End If If Me.ListBox1.ListCount Then Me.ListBox1.Visible = True//当列表框里有内容时,显示列表框 End If End Sub

     

          c. 界面布置:

                 ca.创建方式:与之前插入模块类似,点击插入窗口,即可开始编写窗口;窗口打开时,禁止点击下层的方法:将属性ShowModal改为false

                 cb.关于界面设置的一些方法:

                        cba. 隐藏excal表格,只显示窗口:Application.Visible = False隐藏某个表:Sheets(2).Visible = False或者Sheets(2).Visible = xlSheetHidden,显示某个表:Sheets(2).Visible = true或者Sheets(2).Visible = xlSheetVisible

                        cbb. 关闭excel表格: Application.Exit

                        cbc. 在打开excel工作簿时打开窗口:在thisworkbook里的open事件写 UserForm1(窗口的名字).Show

                        cbd. 解开被保护的表:Sheets(2).Unprotect "test" ; 开启保护的表:Sheets(2).Protect "test"

                        cbe. 输入框TextBox设置成输入类似于输入密码的设置方式,在属性PasswordChar 改为 " * "

          d. 

    11.常用的一些小方法:

         a. 关闭excel里删除表格时要点确认:Application.DisplayAlerts = False(打开时将值改为true

         b. 关闭屏幕更新:Application.ScreenUpdating = False(打开时将值改为true,因为打开文件关闭文件时,会出现屏幕闪烁的问题,关闭屏幕更新就能解决这个问题

         c. 选中某个单元格:Range("a1").select

         d. 删除某个单元格:Range("a1").delete(删除单元格或者删除sheet时,切记要从后向前删或者其他方法,因为若将单元格a1删除,之前的a2将变成a1

         e. 恢复筛选前或开始筛选状态:sheet1.range("a1:f1048").AutoFilter

         f.  弹出框的使用:msgbox "(弹出文字,例:hello!)"'

               以下为可选属性:

     

     

               使用方法: i=MsgBox("你好吗?",1+48)  (表示弹出框里的文字是"你好吗?",弹出框的样式是带有是和否两个按钮,带有警示图标,i可以接收用户点击是或否的按钮,返回值为6或7,i也可不写

     

         g. 输入框:InputBox "(输入文字,例:hello!)",可直接定义变量接收,

                  例:Dim i As Integer  

                         i = InputBox("(输入框文本内容,例:hello?)","(输入框的标题,例:输入框)","(输入框里的默认值,例:请输入内容...)",(输入框的横向位置,例:200),(输入框的纵向位置,例:200))  (后四项为非必填项

                         另一种输入框,可限制输入内容:i = Application.InputBox("(输入框的内容)", , , , , , , 1 + 2(表示数字和文本都可输入))   (中间逗号是省略要填写的内容,与inputBox一样,只是在最后多了限制输入框的内容)


     

                  与MsgBox弹出框类似: 0  表示  公式                              1  表示  数字    

                                                         2  表示  文本(字符串)            4  表示   逻辑值(True或False)

                                                         8  表示  单元格引用,作为一个Range对象    

                                                        16 表示  错误值,如#N/A           64 表示  数值数组


           h. 将一个对象赋值给另一个对象,需要使用set 

        例:(新建一个sheet)
    Sub test() Dim s As Worksheet Set s
    = Sheets.Add s.Name = "Name" End Sub

          i. 循环退出:Exit For  ,结束程序 Exit Sub

          j. 截取字符串函数split("(字符串,例:Name.xlsx)","(截取标志,例:.)")(0)   (表示Name.xlsx以.截取,要第一段Name)

          k. 对象判空方式:

         Sub test()
            Dim rng As Range
            If (Not) rng Is Nothing Then//判断单元格是否为空值,若加上Not表示不为空时
    
            End If
         End Sub

           l. 查找数组里的最大值:Range("a1").Application.WorksheetFunction.Max (arr)  (arr是一个数组)

          m. 以值查找数组下标,返回第一个为该值的下标:

                Range("c1")=Application.WorksheetFunction.Match((查找的值,例:Range("a4")), (从该数组中查找,例:arr), (查找到该值第几次出现,0就是第一次出现的位置,例:0))

          n. 使用函数时,类似于C语言中的 函数名(),利用call 关键字,例:call (函数名,例:gys(gys是函数名,也就是sub gys() end sub))

          o. 停止事件响应:Application.EnableEvents = False (一般用于change事件时,单元格一旦改变就会引发change事件,打开时改为true

          p. 获得当前时间函数:Now();修改时间的格式:Format(Now(), "(时间的格式,例:yyyy-mm-dd hh:mm:ss)")

          q. 计算指定表格的总数:

                   计算非空表格的总数:Application.WorksheetFunction.CountA ((表格的范围,例:Range("a:a"))) (可简写时去掉Application

                   计算指定内容表格的总数:Range("d1") = Application.WorksheetFunction.CountIf((计算的范围,例:Range("a:a")),(指定查找的内容,例:"1")) 

          r. 查询表:

                   在某张表中查找对应的单元格Range("c1")= Application.WorksheetFunction.VLookup((要查找的东西,例:sheet1.Range("a1")),(查找的范围,例:sheet2.Range("a:h")),(从这一列得到对于的值,例:5),(是否精确查找,例:0))

     

           Sub test()//在二表中查找一表a2值所对应的列,返回二表第二列对于的值,精确查找
              Range("c1") = Application
    .WorksheetFunction.VLookup(Sheets(1).Range("a2"), Sheets(2).Range("a:b"), 2, 0) End Sub

     

          s. 错误回避:On Error Resume Next  (代码出错时,一般用于会返回空值时,代码运行中断,使用这句话遇见错误不会中断代码,跳过运行下一句话

          t.  判断一个没有定义的变量类型的变量是否为数字类型:VBA.Information.IsNumeric ((定义的变量,例:a))     (返回值为false或true,可简写为IsNumeric()

          u. 将变量转化为数字型变量:a=val(a),也可以写为a=a*1 

          v. 查找文本里的某个字符所在的位置:

                 Range("c1") = VBA.Strings.InStr((查找单元格的内容,例:Range("b1")),(要在Range("b1")中查找的字符位置,例:"@"))

                 Range("d1") = Application.WorksheetFunction.Find((要查找的字符,例:"@"), (查找单元格的内容,例:Range("b1")))

          w. 支持函数的写法:

          Function test()//可带参,可不带参,在sub里可以直接调用
    
          End Function
    -------------------------
    //带有返回值的写法
    Sub zimu()//主程序
      For i = 1 To 6
        Range("c" & i) = test(Range("a" & i))
      Next
    End Sub
    Function test(str As String)//处理函数
       If str = "1" Then
          test = "A"//返回值的写法
       Else
          test = "B"
       End If
    End Function

           x.单元格内容的长度:len((单元格,例:Range("a1")))  (返回值为整数)

           y.

    易错点:

        a.选择某个excel里的某个sheet里面的某个单元格进行操作时,不能直接写Sheets(j).Range("a1").Select,必须先选中sheet,即先写Sheets(j).Select

        b.定义sheet时,要用Dim she As Worksheet

    下一篇:没有了