VBA基础知识整理

作者:chenlvzhou
来源:CSDN
原文:https://blog.csdn.net/chenlvzhou/article/details/78820842
版权声明:本文为博主原创文章,转载请附上博文链接!

最近由于项目的需要,需要在Excel自定义一些函数,来完成特殊的处理,为了完成工作,就囫囵吞枣的写了一些代码,现在闲暇下来,就好好的学习一下,VBA的基础知识。

1.变量

(1) Dim <<variable_name>> As <<variable_type>>
(2)规则

变量名称必须使用一个字母作为第一个字符。
变量名称不能使用空格,句点(.),感叹号(!)或字符@,&,$,#。
变量名称的长度不能超过255个字符。
不能使用Visual Basic保留关键字作为变量名称。

(3)

Sub var()
        Dim str As String
        str = "string"
        MsgBox (str)
    End Sub

2.常量

(1)Const <<constant_name>> As <<constant_type>> = <<constant_value>>
(2)规则

常量名称必须使用一个字母作为第一个字符。
常量名称不能在名称中使用空格,句点(.),感叹号(!)或字符@,&,$,#。
常量名称的长度不能超过255个字符。
不能使用Visual Basic保留关键字作为常量名称。

(3)

    Sub const_var()
        Const MyInteger As Integer = 720
        MsgBox (MyInteger)
    End Sub

3.数组

(1)数组声明的方式与声明变量相同,只是数组变量的声明使用括号
(2)规则
若数组大小被指定为5,但是当数组索引从零开始时,它可以保持6个值
数组索引不能是负数
可以在一个数组变量中存储一个整数,字符串或字符。

(3)数组声明
定义

    1. Dim arr1()  
    2. Dim arr2(5)
    3. arr3 = Array("apple","Orange","Grapes")

赋值

  Dim arr(5)
    arr(0) = "1"
    arr(2) = 100 
    arr(3) = 2.45
    arr(4) = #10/07/2013#   ’日期
    arr(5) = #12.45 PM#  '时间

(4)多维数组
定义

 1. Dim arr(2,3)

赋值

    arr(0,0) = "Apple" 
    arr(0,1) = "Orange"
    arr(1,0) = "cucumber"

(5)数组方法

  • LBound(ArrayName[,dimension])
    '返回指定数组的最小下标,数组的LBound的结果是零。
    MsgBox ("Line 1 : " & LBound(Array(5, 2, 3)))

  • UBound(ArrayName[,dimension])
    '返回指定数组的最大下标。
    MsgBox ("Line 1 : " & UBound(Array(5, 2, 3)))

  • Split(expression[,delimiter[,count[,compare]]])
    '返回一个数组,其中包含基于分隔符分割的特定数量的值。
    Split(“Red $ Blue $ Yellow”,"$")

  • Join(List[,delimiter])
    '返回一个包含数组中指定数量的子串的字符串
    MsgBox (“Line 1” & " is :" & Join(Array(“Red”, “Blue”, “Yellow”), “—”))

  • Filter(inputstrings,value[,include[,compare]])
    '函数返回一个基于零的数组,其中包含基于特定过滤条件的字符串数组的子集。

  • IsArray(variablename)
    '返回一个布尔值,指示指定的输入变量是否是数组变量
    msgbox("Line 1 : " & IsArray(Array(1,2,3)))
    msgbox("Line 1 : " & IsArray(“sdfadd”))

4.ReDim语句

(1)用于声明动态数组变量并分配或重新分配存储空间

(2) ReDim [Preserve] varname(subscripts) [, varname(subscripts)]

 Sub Constant_demo_Click()
       Dim a() as variant
       i = 0
       redim a(5)
       a(0) = "XYZ"
       a(1) = 41.25
       a(2) = 22

       REDIM PRESERVE a(7)
       For i = 3 to 7
       a(i) = i
       Next

       'to Fetch the output
       For i = 0 to ubound(a)
          Msgbox a(i)
       Next
    End Sub

5.运算符

1.算术操作符

    + : 两个操作数相加
    - : 两个操作数相减
    * : 两个操作数相乘
    / : 两个操作数相除
    % : 模运算符,整数除法后的余数
    ^ : 指数运算符

2.比较运算符

     = : 检查两个操作数的值是否相等。如果是,那么条件是真。   
    <> : 检查两个操作数的值是否不相等。如果值不相等,则条件为真。   
    > : 检查左操作数的值是否大于右操作数的值。如果是,那么条件是真。  
    < : 检查左操作数的值是否小于右操作数的值。如果是,那么条件是真。  
    >= : 检查左操作数的值是否大于或等于右操作数的值。 如果是,那么条件是真。 
    <= : 检查左操作数的值是否小于或等于右操作数的值。如果是,那么条件是真。 

3.逻辑运算符

    AND : 两个条件都为真,则表达式为真。
    OR : 如果两个条件中的任何一个为真,则条件为真。
    NOT : 用于反转其操作数的逻辑状态。 如果条件成立,那么逻辑非运算符结果是条件不成立。
    XOR : 如果表达式中只有一个表达式的值为True,则结果为True。

4.连接操作符

   & : 连接两个值
        1 & 2 = 12
        "1" & "2" = 12
    + : 将两个值添加为变量,其值是数字
        1 + 2 = 3
        "1" + "2" = 12

6.单元格的格式方法

1.Range
    Range("A1")  '表示A1单元格
    Range("A1:A9")    '表示A1-A9单元格
2.[]
    [A1]    '表示A1单元格
    [A1:A9]     '表示A1到A9单元格
3.Cells(第几行,第几列)
    Cells(1,1)   '表达第一行第一列的单元格

7.VBA对单元格的操作

(1)获取单元格的值

Sub alert()
        'A1 = Sheets(1).[a1]    '获取第一个工作表(表名为工作表1)中A1的值赋值给X
        'A1 = Sheets("工作表1").[a1]
        'A1 = Sheets(1).Cells(1, 1)
        'A1 = Sheets("工作表1").Cells(1, 1)
        A1Range("A1").Value    '获取当前工作表A1的值
        MsgBox (A1)   '弹出对话框
    End Sub

(2)单元格赋值

Sub setVal()
    Range("A1").Value = 100   '点击VBAProject窗口的'运行子过程'
End Sub

(3)设置单元格的填充色

   Sub setColor()
        Range("B3").Interior.ColorIndex = 3   '值有1-56,代表56种颜色
    End Sub

(4)单元格的复制、粘贴

   Sub cut()
        Range("B3").copy Range("C3")   '将B3的值,复制到C3单元格
    End Sub

(5)单元格的剪切

Sub cut()
    Range("A1").cut Range("B3")  '将A1的值,剪切到B3单元格
End Sub

8.条件判断结构

if then 语句
    Sub if_test()
        B3 = Range("B3").Value
        If B3 > 10 Then
            MsgBox ("大于10")    '弹出字符串时,必须为双引号
        ElseIf B3 < 10 Then
            MsgBox ("小于10")
        Else
            MsgBox ("aaaa")
        End If
        MsgBox (B3)
    End Sub

9.选择判断结构

Select Case 语句
    Sub select_test()
        B3 = Range("B3").Value
        Select Case B3
        Case 1 To 10
            msg = "1到10之间"
        Case 11 To 20
            msg = "11到20之间"
        Case 21, 22
            msg = "21,22的值"
        Case Else
            msg = "其他的值"
        End Select
        MsgBox (msg)
    End Sub

10.循环结构

  • for next 语句
     Sub for_test()
            For i = 1 To 10 Step 1
                If i > 5 Then    
                    Exit For    '跳出for循环
                End If
                Range("D" & i).Value = i    '循环赋值给D1-D10
            Next i
        End Sub
  • for each 语句:用于为数组或集合中的每个元素

      Sub for_ecah_test()
          fruits = Array("苹果", "香蕉", "雪梨")
          For Each Item In fruits
              MsgBox (Item)
          Next
      End Sub
    
  • do while loop

    Sub do_while_loop_test()
             Do While i < 5    '在循环开始时,判断条件是否符合
                If i > 3 Then
                    MsgBox ("跳出循环")
                    Exit Do
                End If
                i = i + 1
                MsgBox ("The value of i is : " & i)
             Loop
          End Sub
          Sub do_while_loop_test()
             Do 
                If i > 3 Then
                    MsgBox ("跳出循环")
                    Exit Do
                End If
                i = i + 1
                MsgBox ("The value of i is : " & i)
             Loop While i < 5    '在循环结束时,判断条件是否符合
          End Sub
    

11.sub 与 function 的区别

  • 子过程不需要有返回一个值,而函数可能会或可能不会有返回一个值。
  • 子程序可以不用call关键字来调用。
  • 子程序总是包含在Sub和End Sub语句中。
    (1)过程调用函数:
    Function function_test(ByVal col, ByVal start_row, ByVal end_row)
        total = 0
            For i = start_row To end_row Step 1
                total = total + Range(col & i).Value
            Next i
        function_test = total
    End Function
    Sub call_function()
        MsgBox ("总和为:" & function_test("A", 1, 5))
    End Sub
    

(2) 函数调用过程

Sub test(name As String, age As Integer)
   MsgBox ("姓名:" & name & "年龄 :" & age)
End Sub
Function call_sub()
    test "aaa", 22
End Function

12.字符串函数

  • InStr([start,]string1,string2[,compare])
    '函数返回一个字符串第一次出现在一个字符串,从左到右搜索。返回搜索到的字符索引位置。
    MsgBox ("Line 1 : " & InStr(1, “safdfasdf”, “s”))

  • InStrRev(string1,string2[,start,[compare]])
    '函数返回一个字符串在另一个字符串中的第一次出现。搜索从右到左
    msgbox("Line 1 : " & InStrRev(“asdfasdf”,“s”,10))

  • Lcase(String)
    '将字符串转换为小写字母后返回字符串
    msgbox("Line 1 : " & LCase(“DJUEG”))

  • UCase(String)
    '将字符串转换为大写字母后返回字符串
    msgbox("Line 1 : " & LCase(“ioek”))

  • Left(String, Length)
    '从字符串的左侧返回指定数量的字符
    msgbox("Line 1 : " & Left(“adfasdf”,2))

  • Right(String, Length)
    '从字符串的右侧返回指定数量的字符
    msgbox("Line 1 : " & Right(“adfasdf”,2))

  • Mid(String,start[,Length])
    ’返回给定输入字符串中指定数量的字符
    msgbox("Line 1 : " & Mid(“adfsd”,2))

  • Ltrim(String)
    '删除字符串左侧的空格。
    msgbox “After Ltrim : " & LTrim(” adfasdfsd")

  • RTrim(String)
    '删除字符串右侧的空格
    msgbox "After Ltrim : " & RTrim("adfasdfsd ")

  • Trim(String)
    '删除给定输入字符串的前导空格和尾随空格
    msgbox “After Ltrim : " & RTrim(” adfasdfsd ")

  • Len(String)
    '返回给定输入字符串的长度,包括空格
    msgbox("Length of var1 is : " & Len("sdf sdfsd "))

  • space(number)
    '用特定数量的空格填充字符串
    msgbox(“aaa” & Space(2)& “bbb”)

  • StrComp(string1,string2[,compare])
    '比较两个给定字符串后,返回一个整数值。
    msgbox(“Line 1 :” & StrComp(“Microsoft”,“Microsoft”))

  • Replace ( string1, find, replacement, [start, [count, [compare]]] )
    '用另一个字符串替换字符串后返回字符串。
    msgbox(“Line 1 :” & Replace(“alphabet”, “a”, “e”, 1, 1))

  • String(number,character)
    '使用指定的字符填充指定次数的字符串
    msgbox(“Line 1 :” & String(3,"$"))

  • StrReverse(string)
    '反转指定的字符串
    msgbox("Line 1 : " & StrReverse(“VBSCRIPT”))

13.日期函数

  • date()
    '返回当前的系统日期
    msgbox("The Value of a : " & a)

  • cdate(date)
    '将有效的日期和时间表达式转换为类型日期
    MsgBox ("The Value of a : " & CDate(“Jan 01 2020”))

  • DateAdd(interval,number,date)
    '将有效的日期和时间表达式转换为类型日期
    msgbox("Line 1 : " &DateAdd(“h”,1,“01-Jan-2013 12:00:00”))

  • DateDiff(interval, date1, date2 [,firstdayofweek[, firstweekofyear]])
    '返回两个指定的时间间隔之间的差值。
    msgbox("Line 2 : " &DateDiff(“q”,“01-Jan-09 00:00:00”,“01-Jan-10 23:59:00”))

  • DatePart(interval,date[,firstdayofweek[,firstweekofyear]])
    '返回给定日期的特定部分
    msgbox("Line 4 : " & DatePart(“m”,“2013-01-15”))

  • Day(date)
    '返回1到31之间的数字,表示指定日期的一天
    msgbox(Day(“2018-06-30”))

  • DateSerial(year,month,day)
    '返回指定的日期,月份和年份参数的日期
    msgbox(DateSerial(2018,5,10))

  • FormatDateTime(date,format)
    '格式化并返回有效的日期和时间表达式
    msgbox("Line 5 : " & FormatDateTime(“2018-08-15 20:25”,4))

  • IsDate(expression)
    '判断是否为日期,它都会返回一个布尔值
    msgbox("Line 1 : " & IsDate(“Nov 03, 1950”))

  • Month(date)
    '返回1到12之间的数字,表示指定日期的月份。
    msgbox(“当前的月份的值是:”&Month(“2018-06-30”))

  • Year(date)
    '返回一个表示指定日期的年份的整数
    msgbox(Year(“2018-06-30”))

  • MonthName(month[,toabbreviate])
    '回指定日期的月份名称。
    msgbox("Line 1 : " & MonthName(01,True))
    msgbox("Line 2 : " & MonthName(01,false))

  • Weekday(date[,firstdayofweek])
    '返回一个从1到7的整数,表示指定日期的星期几。
    msgbox("Line 1: " & Weekday(“2013-05-16”,1))

  • WeekdayName(weekday[,abbreviate[,firstdayofweek]])
    '返回指定日期的工作日名称
    msgbox("Line 2 : " &WeekdayName(2,True))
    msgbox("Line 3 : " &WeekdayName(1,False))
    msgbox("Line 4 : " &WeekdayName(2,True,0))
    msgbox("Line 5 : " &WeekdayName(1,False,1))

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值