初学VBA

 

一个最基本的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:UserszhengwwDesktopMoveRule.xlsx)"(注意在等号之前有和冒号

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

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

        c.保存文件:

            ActiveWorkbook.Save

            ActiveWorkbook.SaveAs Filename:="(文件路径,例:C:UserszhengwwDesktopMoveRule.xlsx)" (相当与另存为)

        d.关闭文件:

            ActiveWorkbook.Close

        e.新建文件:

           Workbooks.Add

5.Dir函数:

       a.验证文件是否存在:

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

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

复制代码
//如存在文件MoveRule.xls和MoveRule.xlsx两个文件
Sub test()
//会返回MoveRule.xls(根据文件的先后顺序)
Range("a1") = Dir("C:UserszhengwwDesktopMoveRule.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))  (后四项为非必填项


              与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

原文地址:https://www.cnblogs.com/shiyueyangne/p/14251288.html