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个值

        数组索引不能是负数

        可以在一个数组变量中存储一个整数,字符串或字符。

    2.数组声明

        定义

            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#  '时间

    3.多维数组

        定义

            1. Dim arr(2,3)

        赋值

            arr(0,0) = "Apple"

            arr(0,1) = "Orange"

            arr(1,0) = "cucumber"

    4.数组方法

        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语句

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

    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

    1.单元格赋值

        Sub setVal()

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

        End Sub

    2.设置单元格的填充色

        Sub setColor()

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

        End Sub

    3.单元格的复制、粘贴

        Sub cut()

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

        End Sub

    4.单元格的剪切

        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语句中。

    过程调用函数:

        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

    函数调用过程

        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))

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容