精华内容
下载资源
问答
  • excel-vba的常用功能普通功能变量定义日期计算插入链接与图片如何插入一段漂亮的代码片生成一个...如果不定义变量,默认变量的数据类型是Variant格式,这样会占据大量的内存空间。 变量的几种分类: Date、String、In

    1.普通功能

    1.1.变量定义

    在进行vba操作前,一般需要定义变量。如果不定义变量,默认变量的数据类型是Variant格式,这样会占据大量的内存空间。

    1. 变量的几种分类: Date、String、Integer、Double、Long、Variant
    2. 定义变量: Dim lastDate As Date
    3. 多个变量同时定义: Dim lastDateStr As String, todayStr As String
    4. 变量的数据类型: Debug.Print TypeName(lastDate)
      ’ 实现打印信息的功能。其中,Debug.Print 可以输出信息(TypeName(lastDate))到立即窗口。

    1.2.日期计算

    1. 今天: Debug.Print Date
    2. 昨天: Debug.Print VBA.DateAdd(“d”, -1, Date)
    3. 今天的日期格式转换为字符串: Debug.Print Format(Date, “yyyymmdd”)
      ’ 输出 20210422。或者可以使用Format(Date, “yyyy/m/d”) ,输出 2021/4/22。
    4. 计算本月一共有多少天:
      第1个步骤:计算下一个月的第一天,减掉1天就是本月的最后一天。
      第2格步骤:计算最后一天的日期是几号。
      toMonth = DateSerial(Year(Date), month(DateAdd(“m”, 1, Date)), 1) ’ toMonth 是下月的1号。
      monthDays = Day(DateAdd(“d”, -1, toMonth)) ’ 用于记录本月有几天。
    5. 计算当前日期相对整个月的时间进度情况: monthPre = Day(Date) / monthDays ’ 输出是一个小数,需要使用Double或者Long进行存放。
    6. 计算当前日期相对整个月在第几周: NowWeek = DateDiff(“ww”, DateSerial(Year(Date), month(Date), 1), Date)

    1.3.复制、粘贴、清空、删除

    1. 复制
      Selection.Copy
    2. 粘贴(包括公式和内容)
      ActiveSheet.Paste
    3. 选择性粘贴
      Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks :=False, Transpose:=False
    4. 清空内容,不清除格式
      Selection.ClearContents
    5. 删除
      Selection.Delete Shift:=xlUp ’ 下方表格上移
      Selection.Delete Shift:=xlToLeft ’ 右方表格左移
    6. 页面显示左上角的单元格
      Range(“A1”).Select
      ActiveWindow.ScrollRow = 1 '设置当前工作表最上面显示的行号
      ActiveWindow.ScrollColumn = 1 '设置当前工作表最左边显示的列号
    7. 显示第1个的行分组,第1个的列分组
      ActiveSheet.Outline.ShowLevels RowLevels:=1
      ActiveSheet.Outline.ShowLevels RowLevels:=0, ColumnLevels:=1

    2.进阶功能

    2.1.计算相关

    1. 数据刷新,公式重算
      ActiveWorkbook.RefreshAll
      Calculate
    2. 使用公式手动计算,加快vba运行速度
      Application.Calculation = xlCalculationManual
      Application.Calculation = xlCalculationAutomatic ’ 记得切换回自动计算
      (备注:提速小方法http://blog.sina.cn/dpool/blog/s/blog_a575eb9401018pvp.html)

    2.2.其他

    1. 代码报错,仍继续执行
      On Error Resume Next '忽略错误继续执行VBA代码,避免出现错误消息导致代码停止运行
    2. 等待3秒后继续运行
      Application.Wait (Now + TimeValue(“0:00:03”))
    3. 清空剪贴板
      Application.CutCopyMode = False
    4. 不切换屏幕
      Application.ScreenUpdating = False
      Application.ScreenUpdating = True ’ 结束时,记得加上屏幕刷新
    5. 让错误提示不出现
      Application.EnableEvents=False ’ 让事件失效
      Application.EnableEvents=True ’ 结束时,记得加上让事件生效
    展开全文
  • 不过,实验发现,VBA变量类型没有进行严格的管控,不管哪种情况,定义类型和实际使用中赋值类型并没有什么关系,也就是说定义为integer的变量同样赋值字符串,反之也然。 这样的结果往往会在程序中产生歧义,...

    作者:iamlaosong

        VBA中变量可以先定义后使用,也可以不定义直接使用。如果模块前面加了Option Explicit语句,则变量必须先定义后使用。不过,实验发现,VBA对变量类型没有进行严格的管控,不管哪种情况,定义的类型和实际使用中赋值类型并没有什么关系,也就是说定义为integer的变量同样赋值字符串,反之也然。

    这样的结果往往会在程序中产生歧义,导致错误的运行结果。例如下面的语句:

        Dim  Scan(3000), BarCode As String

        。。。

        BarCode = Cells(row2, 5)

        If Scan(row1) = BarCode Then

        。。。

    这时BarCode保存值的类型由单元格的类型决定,特别是单元格的内容为数字时,BarCode保存值的可能是字符,也可能是数字,这很容易混淆,当你用BarCode和其它变量比较时,如果类型不对,即便数字相同,也会不等,所以编程中要特别注意,对这种可能引起混淆的情况,要强制进行转换,防止出错,即:

        BarCode = CStr(Cells(2, 5))


    展开全文
  • VBA研究】VBA数据类型定义与效果

    千次阅读 2015-08-07 11:55:27
    作者:iamlaosong 数据类型是对同一类数据的统称,如文本、日期、数值等。VBA里的数据类型有:字节... VBA数据类型定义的管控并不强,比如定义成整数型的变量同样可以赋值字符串,但是如果不注意,就会导致逻辑错误。

    作者:iamlaosong

    数据类型是对同一类数据的统称,如文本、日期、数值等。VBA里的数据类型有:字节型(Byte),整数型(Integer),长整数型(Long),单精度浮点型(Single),双精度浮点型(Double),货币型(Currency),小数型(Decimal),字符串型(文本型)(String),日期型(Date),布尔型(Boolean)。 VBA对数据类型的管控并不强,有一个Variant万金油类型,这种类型的变量干啥都行。此外,用Dim定义类型时,存在一个陷井,稍不注意就会掉落其中。

    1、测试结果

    通过测试发现,如果一条语句定义多个变量,只有最后一个变量有效果,比如下面的程序是不会报错的,也能实现其功能:

    Sub tt()
        Dim ss, a, b, c, d As Integer
        a = 100
        b = 200
        c = a + b
        ss = "sum=" & c
        
        Cells(5, 1) = a
        Cells(5, 2) = b
        Cells(5, 3) = c
        Cells(5, 4) = ss
        
        a = 87654
        b = 12348
        c = a + b
        ss = "sum=" & c
        
        Cells(5, 5) = a
        Cells(5, 6) = b
        Cells(5, 7) = c
        Cells(5, 8) = ss
        
    End Sub
    

    执行结果是正常的:

    100200300   sum=3008765412348100002    sum=100002

    不过,如果定义写成:Dim ss, a, b, c As Integer,则会报“溢出”错误(c是整型)。

    同样,如果定义写成:Dim a, b, css As Integer,则会报“类型不匹配”错误(ss是整型)。也就是说,只对定义中最后一个变量进行管控,这一点从C语言转过来的人有点想不通。

    2、真实含义

    实际上Dim a, b,c,ss As Integer的意思是:

    dim a, dim b, dim c, dim ss as integer

    变量a、b、c没有类型说明,那么VB就会给你使用默认的类型Variant。

    3、严格管控

    要严格的进行变量类型管控,一次只能定义一个变量,也可以写成下列形式:

    Dim a As Integer, b As Integer, c As Integerss As String

    ===========================

    附:VBA中的数据类型 

    据类型(名称)

    大小(字节)

    描述

    Boolean

    2

    逻辑值True或False

    Byte

    1

    0到255的整数

    Integer

    2

    –32,768到32,767的整数

    Long

    4

    –2,147,483,648到2,147,483,647的整数

    Single

    4

    单精度浮点数值

    负数:–3.402823E38到–1.401298E–45

    正数:1.401298E–45到3.402823E38

    Double

    8

    双精度浮点数值

    负数:–1.79769313486231E308到–4.94065645841247E–324

    正数:4.94065645841247E–324到1.79769313486231E308

    Currency

    8

    (放大的整数(译者:整数除以10000得到的数值,参见VBA帮助))使用在定点计算中:

    –922,337,203,685,477.5808到922,337,203,685,477.5807

    Decimal

    14

    +/–79,228,162,514,264,337,593,543,950,335没有小数点;

    +/–7.9228162514264337593543950335小数点后有28位数字;

    最小的非0数字是

    +/–0.0000000000000000000000000001

    Date

    8

    从100年1月1日到9999年12月31日的日期

    String(变长字符串)

    10字节+字符串长度

    变长字符串最多可包含大约 20 亿 ( 2^31)个字符。

    String(定长字符串)

    字符串长度

    定长字符串最多可包含大约65,400 个字符。

    Object

    4

    对象变量用来引用Excel中的任何对象

    Variant(带数字)

    16

    最高范围到Double类型的任何数值

    Variant(带字母)

    22字节+字符串长度

    和变长字符串的范围一样

    用户定义类型

    (使用Type)

    成员所需的数值

    每个成员的范围和它的数据类型的范围一致



    展开全文
  •  vba是编程语言,宏是用vba代码保存下来的程序。录制的宏是vba里最简单的程序,正因为如此,录制宏存在许多缺陷:如无法进行判断和循环,不能显示用户窗体,不能进行人机交互……  解决录制宏的这些问题,需要...

     

    转载自:https://www.cnblogs.com/wzh313/articles/9737573.html

     

     

    一、VBA介绍

    1、宏和VBA的关系

      vba是编程语言,宏是用vba代码保存下来的程序。录制的宏是vba里最简单的程序,正因为如此,录制宏存在许多缺陷:如无法进行判断和循环,不能显示用户窗体,不能进行人机交互……

      解决录制宏的这些问题,需要掌握vbs编程的方法,自主的编写vba程序。

    2VBA程序结构

    • 代码:vba程序由代码组成。
    • 过程:例如Sub过程、Function过程
    • 模块:保存过程的地方,一个模块可以保存多个不同类型的过程
    • 对象:用代码操作或控制的东西即为对象,例如工作簿、工作表、单元格、图片、图表、透视表等
    • 对象的属性:每个对象都有属性,属性是对象包含的内容或特点,例如A1单元格的内容:A1.内容,代码表达为Range("A1).Value
    • 对象的方法:方法是指在对象上执行的某个动作,例如Range("A1").Select
    • 关键字:关键字是vba中的保留字或符号,例如语句名称、函数名称、运算符等都是关键字

    3VBE介绍

      VBEVisual Basic EditorVBA的编程环境

      1)打开VBE编辑器

        Alt+F11Alt+F8是查看宏)

        依次执行:(2003版本)工具————Visual Basic编辑器,(2007以上版本)在视图下的选项卡下

        右键单击工作表标签,执行查看代码命令

      2)主窗口:包含工程资源管理器属性窗口菜单栏工具栏代码窗口立即窗口

         https://img2018.cnblogs.com/blog/1165829/201810/1165829-20181002210913019-557680448.png

      3)菜单栏:包含VBE中各种组件的命令

      4)工具栏:可以在视图”——“工具栏菜单里显示或隐藏

      5)工程资源管理器:在这里可以看到所有打开的Excel工作簿和已加载的宏,一个Excel的工作簿就是一个工程,工程名称为“VBA Project(工作簿名称),这里最多可以显示工程里的4类对象,即Excel对象(包括sheet对象和ThisWorkbook对象)、窗体对象、模块对象和类模块对象。

        https://img2018.cnblogs.com/blog/1165829/201810/1165829-20181002211529739-304468028.png

      6)属性窗口:在这里查看或设置对象的属性

      7)代码窗口:包含对象列表框、过程列表框、边界标识条、视图按钮、代码编辑区、过程分界线。

        https://img2018.cnblogs.com/blog/1165829/201810/1165829-20181002211942405-869746445.png

      8)立即窗口:一个重要用途是用来调试代码,想显示立即窗口,可以在视图选项卡中选择或者用快捷键“Ctrl+G”

    4、牛刀小试:用vba生成工资条

    Sub 生成工资条()

    '

    ' 生成工资条 宏

    '

    ' 快捷键: Ctrl+m

    '

        Application.ScreenUpdating = False

        For i = 2 To 7

            ActiveCell.Rows("1:1").EntireRow.Select

            Selection.Copy

            ActiveCell.Offset(2, 0).Rows("1:1").EntireRow.Select

            Selection.Insert Shift:=xlDown

            ActiveCell.Select

        Next

    End Sub

    https://img2018.cnblogs.com/blog/1165829/201810/1165829-20181002204434394-832372585.png

     

    二、VBA数据类型

    1VBA中的数据类型

    数据类型就是对同一组数据的统称,如文本、日期、数值等。

    VBA里的数据类型有:字节型(Byte)、整数型(Integer)、长整数型(Long)、单精度浮点型(Single)、双精度浮点型(Double)、货币型(Currency)、小数型(Decimal)、字符串型(String)、日期型(Date)、布尔型(Boolean)等,如表3-1

     类型声明符:用特殊符号代替变量类型进行变量类型声明,例如Dim str$   $代表String类型。只有部分数据类型可以使用类型声明符。

    https://img2018.cnblogs.com/blog/1165829/201810/1165829-20181002223718617-1432867911.png

     

    三、VBA变量、常量

    1、变量命名要求

    变量必须以字母或汉字开头,不能包含空格、句号、感叹号、@&$#,最长不能超过255个字符(一个汉字计2个字符)

    2、声明变量

    • 单变量定义:Dim 变量名 As 数据类型  

      示例:

      Dim str As String  声明一个String类型(变长)的变量,名称是str

      Dim str As String*10  声明一个String类型(定长,最大存储10个字符)的变量,名称为str

      Dim str$  声明一个String(变长)类型变量,$变量类型声明符,代表String

    • 多变量定义(变量类型相同):Dim 变量1,变量2,…… As 数据类型

      Dim x, y, z As String

    • 多变量定义(变量类型不同):Dim 变量1 As 数据类型1,变量2 As 数据类型2

      Dim str As String,nu As Integer  不同变量之间用逗号隔开

    •   不指定类型的变量定义,默认为Variant类型

      Dim str  每个变量都要指定数据类型,如果不指定,默认为Variant类型

    3、声明常量

    常量定义:Const 变量名称 As 数据类型=数值

    示例:

    Const pi As Single=3.14 

     

    4、变量的作用域

    Public 变量名称  As 数据类型  【公有变量】

    Private 变量名称  As 数据类型   【私有变量】

    Static 变量名称 As 数据类型  【静态变量,整个代码运行期间值不变】

     

    单个变量:本地变量

    单个模块:模块级变量,用DimPrivate

    所有模块:公共变量,用Public

     

    5、强制声明所有变量(未定义变量则提示,否则不提示)

    Option Explicit  在模块的第一句表示。

    可以在VBE下的工具”——“选项”——“编辑器选项卡中进行设置,这里设置后,每个模块的第一句会自动写下“Option Explicit”,无需手动输入。

    https://img2018.cnblogs.com/blog/1165829/201810/1165829-20181002225028761-680101331.png

     

    6、给变量赋值

    • 给文本、数值、日期等数据类型变量赋值

      语句为:[Let]变量名称 = 数据  这里的Let可以省略,即:变量名称=数据

      例如:

      Dim str As String

      Let str = “一起来学习VBA”

     

    • 给对象变量(object型,例如单元格)赋值

      语句为:Set 变量名称=对象  这里Set千万不能少。

      例如:

      Dim rng = Range    '声明rng变量为Range类型

      Set rng = Worksheets("sheet1").Range("A1")  '给变量rng赋值

      rng.Value="欢迎来到ExcelHome论坛"    '将文本写入变量指定的单元格

     

    四、VBA数组

    1、一维数组 

    声明:Public|Dim 数组名(a to b) As 数据类型

    示例:

    Dim 6(1 to 50) As String  '声明一个String类型的数组,名称为6,可以存储50个元素。

    等价于:

    Public|Dim Arr(0 to 49) As String

    Public|Dim Arr(49) As String   '数组索引默认是从0开始计数,如果在模块的第一句写“Option Base 1”,则数组的起始索引从1开始,而不是0.

     

     6(1)="张青"

     6(2)="邓城"

    ……

     6(50)="冯吉"

     

    2、多维数组:

    Dim 酱油(1 to 3,1 to 20)  

    等价于

    Dim 酱油(2,19)

     

    3、多维动态数组

      不确定数组中存储多少个元素,即不能预知元素的大小,可以在首次定义数组时括号内为空,写成:

      Dim 数组名称() 

    例子:

    Sub dtsz()

        Dim arr() As String '定义多维动态数组

        Dim n As Long

        '统计A列有多少非空单元格

        n = Application.WorksheetFunction.CountA(Range("A:A"))

        MsgBox n

        '使用Dim语句声明变量时,括号内的参数不能是变量,所以必须使用ReDim语句重新指定大小

        ReDim arr(1 To n) As String '重新定义数组的大小

    End Sub

     

    4、其他常用的创建数组的方式

      1)使用Array函数创建数据 

    Sub ArrayTest()

        Dim arr As Variant '定义变量

        '将1-10的自然数赋给数组

        arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

        MsgBox "arr数组的第2个元素为:" & arr(1)

    End Sub

      2)使用split创建数组 

    Sub ArrayTest()

        Dim arr As Variant '定义变量

        '无论是否在模块中写入Option Base 1,Split函数返回的数组的最小索引都是0

        arr = Split("邓成,林梅,张青,孔丽,冯吉维,孔佳", ",") '第一个参数包含分隔符或字符串变量,第二个参数是分隔符

        MsgBox "arr数组的第2个元素为:" & arr(1)

    End Sub

      3)通过Range对象直接创建数组 

    Sub ArrayTest()

        Dim arr As Variant '定义变量

        arr = Range("A1:C3").Value '将A1:C3单元格内容存储到数组arr里

        Range("E1:G3").Value = arr '将数组arr的数据写入大E1:G3

        '将数组的值写入到单元格区域时,单元格区域的大小必须与数组相同

    End Sub

     

    5、数组相关函数:UBoundLBound函数

    UBound(arr) 获取数组arr的最大索引号

    LBound(arr)  获取数组arr的最小索引号

    数组的元素个数可以表示为:UBound(arr)-LBound(arr)+1

    Sub arrcount()

        Dim arr(10 To 50)

        'Char(13)表示回车,_表示代码换行连接符

        MsgBox "数组的最大索引号是:" & UBound(arr) & Chr(13) _

        & "数组最小的索引号是:" & LBound(arr) & Chr(13) _

        & "数组的元素个数是:" & UBound(arr) - LBound(arr) + 1

    End Sub

    https://img2018.cnblogs.com/blog/1165829/201810/1165829-20181002235350493-1504250372.png

    Sub arrcount()

        Dim arr(1 To 10, 1 To 100)

        'Char(13)表示回车,_表示代码换行连接符

        MsgBox "第一维的最大索引号是:" & UBound(arr, 1) & Chr(13) _

        & "第二维的最小索引号是:" & LBound(arr, 2)

    End Sub

    https://img2018.cnblogs.com/blog/1165829/201810/1165829-20181002235645264-1737423969.png

     

    6、数组相关函数:Join函数

    将一个以为数组里的元素使用指定的分隔符连接成一个新的字符串

    Sub joinTest()

        Dim arr As Variant, txt As String

        arr = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

        '分割符@可以省略,如果省略,默认使用空格作为分隔符

        txt = Join(arr, "@")

        MsgBox txt

    End Sub

    https://img2018.cnblogs.com/blog/1165829/201810/1165829-20181003000058373-1493022281.png

    将数组写入单元格区域

    Sub ArrToRng1()

        Dim arr As Variant

        arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)

        '将一维数组写入单元格区域,单元格区域必须在同一行。如果要写入垂直的一列单元格区域,必须先使用工作表的Transpose函数进行转换

        Range("A1:A9").Value = Application.WorksheetFunction.Transpose(arr)

    End Sub

    https://img2018.cnblogs.com/blog/1165829/201810/1165829-20181003000505174-465361899.png

     

    五、VBA运算符

    1、算术运算符

     用于算术运算,返回值类型为数值型。

    https://img2018.cnblogs.com/blog/1165829/201810/1165829-20181003081801754-2028738841.png

    2、比较运算符

     用于比较运算

    https://img2018.cnblogs.com/blog/1165829/201810/1165829-20181003082450327-1924794428.png

    3、连接运算符

     连接运算符用来连接两个文本字符串,有+&两种

    示例:

    a="欢迎来到"

    b="ExcelHome论坛!"

    ?a+b       '问号?告诉VBA在立即窗口中显示问号后面命令的结果,可以用Print关键字代替问号。

    欢迎来到ExcelHome论坛!

    ?a & b

    欢迎来到ExcelHome论坛!

    ?4+5 '符号+两边都是数值,执行算术运算

    9

    ?"4"+5 '其中5是数值,执行算术运算

    9

    ?"4"+"5" '两个都是文本,执行连接运算

    45 

    4、逻辑运算符

    逻辑运算符用于判断逻辑运算式的真假,参与逻辑运算的数据为逻辑型数据,返回结果为Boolean型,只能为TrueFalse 

    https://img2018.cnblogs.com/blog/1165829/201810/1165829-20181003084543124-894204369.png

    5VBA中的通配符 

     https://img2018.cnblogs.com/blog/1165829/201810/1165829-20181003083108565-1181009932.png 

    6、运算符优先级

     VBA中要优先处理蒜素运算符,接着处理连接运算符,然后处理比较运算符,最后再处理逻辑运算符,可以用括号来改变运算顺序。

    https://img2018.cnblogs.com/blog/1165829/201810/1165829-20181003085551348-1987099985.png 

    7、换行符 

    VBA中字符换行显示需要使用换行符来完成。下面是常用的换行符

       'chr(10) 可以生成换行符

       'chr(13) 可以生成回车符

       'vbcrlf 换行符和回车符

       'vbCr 等同于chr(10)

       'vblf 等同于chr(13)

    '例:

    Sub test3()

      MsgBox "我爱" & Chr(10) & "Excel"

     ' MsgBox "我爱你" & Chr(13) & "Excel"

     ' MsgBox "今天" & vbCrLf & "我是大王"

     

    End Sub

    六、VBA内置函数

    使用VBA中内置函数与在工作表中使用工作表函数类似。

    例如,我们想知道当前系统时间

    Sub NowTime()

        MsgBox "现在的时间是:" & Time()

    End Sub

     

    VBA中的内置函数有哪些?查看VBA内置函数的方法:

    1、在VBE帮助(H”——“Microsoft Visual Basic 帮助(H F1”——“Visual Basic 语言参考”——“函数或者在VBE下快捷键“F1”

    地址:https://docs.microsoft.com/zh-cn/office/vba/language/reference/functions-visual-basic-for-applications

    https://img2018.cnblogs.com/blog/1165829/201810/1165829-20181003105413753-1268765509.png

    2、在VBE代码窗口中首先键入“VBA.”系统会自动提示函数列表,如图

    https://img2018.cnblogs.com/blog/1165829/201810/1165829-20181003105127248-2074359819.png

     

    七、VBA控制结构

     1If…Then语句 

    Sub SayHello1()

        If Time < 0.5 Then MsgBox "早上好!"

        If Time >= 0.5 Then MsgBox "下午好!"

    End Sub

     

    Sub SayHello2()

        If Time < 0.5 Then

            MsgBox "早上好!"

        Else

            MsgBox "下午好!"

        End If

    End Sub

     

    Sub SayHello3()

        If Time < 0.5 Then

            MsgBox "早上好!"

        ElseIf Time > 0.75 Then

            MsgBox "晚上好!"

        Else

            MsgBox "下午好!"

        End If

    End Sub

    2Select Case语句 

    Sub SayHello1()

        Select Case Time

            Case Is < 0.5

                MsgBox "早上好!"

            Case Is > 0.75

                MsgBox "晚上!"

        End Select

    End Sub

     

    Sub SayHello2()

        Select Case Time

            Case Is < 0.5

                MsgBox "早上好!"

            Case Is > 0.75

                MsgBox "晚上!"

            Case Else

                MsgBox "下午好!"

        End Select

    End Sub

     

    Sub xingji()

        Dim xj As String

        Select Case Cells(2, "H")

            Case Is < 85

                xj = "不评定"

            Case Is < 100

                xj = "一星级"

            Case Is < 115

                xj = "二星级"

            Case Is < 130

                xj = "三星级"

            Case Is < 150

                xj = "四星级"

            Case Else

                xj = "五星级"

        End Select

        Cells(2, "I") = xj

    End Sub

    3For…Next语句

     语法结构:

    For <循环变量>=<初值>To<终值> [Step 步长值]

      <循环体>

            [Exit For'可以在循环体中任意处加一句或多句Exit For,当遇到这个语句,退出For循环,执行Next后语句

      <循环体>

    Next [循环变量]

     

    Sub xingji()

        Dim xj As String, i As Integer

        For i = 2 To 19 Step 1

            Select Case Cells(i, "H")

                Case Is < 85

                    xj = "不评定"

                Case Is < 100

                    xj = "一星级"

                Case Is < 115

                    xj = "二星级"

                Case Is < 130

                    xj = "三星级"

                Case Is < 150

                    xj = "四星级"

                Case Else

                    xj = "五星级"

            End Select

            Cells(i, "I") = xj

        Next i

    End Sub

    4Do While语句

    • 语法结构1

    Do [While 逻辑表达式]

        <循环体>

        [Exit Do]

        [循环体]

    Loop

    对应示例:

    Sub xingji()

        Dim xj As String, i As Integer

        i = 2

        Do While Cells(i, "H") <> ""

            Select Case Cells(i, "H")

                Case Is < 85

                    xj = "不评定"

                Case Is < 100

                    xj = "一星级"

                Case Is < 115

                    xj = "二星级"

                Case Is < 130

                    xj = "三星级"

                Case Is < 150

                    xj = "四星级"

                Case Else

                    xj = "五星级"

            End Select

            Cells(i, "I") = xj

        i = i + 1

        Loop

    End Sub

    • 语法结构2

    Do

        <循环体>

        [Exit Do]

        [循环体]

    Loop  [While 逻辑表达式]

    对应示例:

    Sub xingji()

        Dim xj As String, i As Integer

        i = 2

        Do

            Select Case Cells(i, "H")

                Case Is < 85

                    xj = "不评定"

                Case Is < 100

                    xj = "一星级"

                Case Is < 115

                    xj = "二星级"

                Case Is < 130

                    xj = "三星级"

                Case Is < 150

                    xj = "四星级"

                Case Else

                    xj = "五星级"

            End Select

            Cells(i, "I") = xj

        i = i + 1

        Loop While Cells(i, "H") <> ""

    End Sub

     

    5Do Until语句

      do Until 后的逻辑表达式为False则执行循环体,否则退出循环,跟Do While相反。

    • 语法结构1

    Do [Until 逻辑表达式]

        <循环体>

        [Exit Do]

        [循环体]

    Loop

     对应示例: 

    Sub xingji()

        Dim xj As String, i As Integer

        i = 2

        Do Until Cells(i, "H") = ""

            Select Case Cells(i, "H")

                Case Is < 85

                    xj = "不评定"

                Case Is < 100

                    xj = "一星级"

                Case Is < 115

                    xj = "二星级"

                Case Is < 130

                    xj = "三星级"

                Case Is < 150

                    xj = "四星级"

                Case Else

                    xj = "五星级"

            End Select

            Cells(i, "I") = xj

        i = i + 1

        Loop

    End Sub

    • 语法结构2

    Do

        <循环体>

        [Exit Do]

        [循环体]

    Loop [Until 逻辑表达式]

     对应示例:

    Sub xingji()

        Dim xj As String, i As Integer

        i = 2

        Do

            Select Case Cells(i, "H")

                Case Is < 85

                    xj = "不评定"

                Case Is < 100

                    xj = "一星级"

                Case Is < 115

                    xj = "二星级"

                Case Is < 130

                    xj = "三星级"

                Case Is < 150

                    xj = "四星级"

                Case Else

                    xj = "五星级"

            End Select

            Cells(i, "I") = xj

        i = i + 1

        Loop Until Cells(i, "H") = ""

    End Sub

    6For Each…Next语句

    当前活动工作簿中有许多工作表,但并不知道数量。如果要把所有工作表的名称按次序写入活动工作表的A列,For Each…Next是更适合的循环。

    For Each 元素变量 In 集合名称或数组名称

        <语句块1>

        [Exit For]

        [语句块2]

    Next [元素变量]

    示例1

    Sub shtName()

        Dim sht As Worksheet, i As Integer

        i = 1

        For Each sht In Worksheets

            Cells(i, "A") = sht.Name

            i = i + 1

        Next sht

    End Sub

    示例2

    Sub shtName()

        Dim c As Range, i As Integer

        i = 1

        For Each c In Range("A1:A10")

            c.Value = i

            i = i + 1

        Next c

    End Sub

    7GoTo语句

     “去到指定地点,用来让程序转到另外一条语句去执行。

    Sub he()

        Dim mysum As Long, i As String

        i = 1

    x:    mysum = mysum + i

        i = i + 1

        If i <= 100 Then GoTo x

        MsgBox "1到100的自然数和是:" & mysun

       

    End Sub

    8With语句

     当需要对相同的对象进行多次操作时,会编写一些重复代码

    Sub FontSet()

        With Worksheets("sheet1").Range("A1").Font

            .Name = "仿宋"

            .Size = 12

            .Bold = True

            .ColorIndex = 3

        End With  '这里的With语句结束标志,不可缺少

    End Sub 

    八、过程Sub

    1Sub定义语句

    声明sub过程的规范语句

    '所有[]内容都是可选的

    'Exit Sub:可选语句,执行它将中断执行并退出过程

    '如果选用Static,运行程序的过程中将保存该过程里声明的本地变量

    'Private和Public用于声明过程的作用域名,如果省略,过程默认为公共过程

    [Private|Public][Static] Sub 过程名([参数列表])

        [语句块]

        [Exit Sub]

        [语句块]

    End Sub 

    2Sub间调用

    被调用过程定义:

    Sub SayHello()

        If Time < 0.5 Then

            MsgBox "早上好!"

        ElseIf Time > 0.75 Then

            MsgBox "晚上好!"

        Else

            MsgBox "下午好!"

        End If

    End Sub

    方法一:过程名[参数1,参数2…]

    Sub RunSub()

        SayHello

    End Sub

    带参数调用

    Sub PrintInfo(info)

        MsgBox info

    End Sub

     

    Sub RunPara()

        PrintInfo ("Hello World")

    End Sub

    方法二:Call 过程名[(参数1,参数2…)]

    Sub RunSub()

        Call SayHello

    End Sub

    方法三:利用Application对象的Run方法,Application.Run 表示过程名的字符串(或字符串变量)[,参数1,参数2…]

    Sub RunSub()

        Application.Run "SayHello"

    End Sub

    3、过程的作用域

     公共过程:可以跨模块调用,用Public 或省略不写。

    Public Sub gggc()

        MsgBox "我是公共过程"

    End Sub

     私有过程:只能在模块内调用,用Private

    Private Sub gggc()

        MsgBox "我是私有过程"

    End Sub

     

    九、自定义Function

     Function过程也称为函数过程,编写一个Function过程,就是编写一个函数。

    1、定义语法格式 

    '最后必须将结果赋值给函数名称

    [Private|Public][Static] Function 函数名([参数列表])[As 数据类型]

        [语句块]

        [函数名=过程结果]

        [Exit Function]

        [语句块]

        [函数名=过程结果]

    End Function

    2、定义函数

    定义函数:生成1-10之间的随机整数

    Public Function Fun()

        Fun = Int(Rnd() * 10) + 1

    End Function

    3、使用函数

    • 使用函数方法一:直接在单元格加“=”调用

    https://img2018.cnblogs.com/blog/1165829/201810/1165829-20181003175415145-1555827260.png

    • 使用函数方法二:通过函数”——“用户定义选择

    https://img2018.cnblogs.com/blog/1165829/201810/1165829-20181003175650768-2071988064.png

    • 用户定义函数可以和其他函数嵌套使用

    https://img2018.cnblogs.com/blog/1165829/201810/1165829-20181003175813829-130215427.png

    •  VBA过程中使用自定义函数

    Sub msg()

        MsgBox Fun()

    End Sub

    4、函数实例

     RGB函数中,R代表红色,G代表绿色,B代表蓝色

     RGB(255,255,0)  表示黄色

    • 判断单元格是否是黄色,是则返回1,否则返回0

    '最后必须将结果赋值给函数名称

    Function CountColor()

        If Range("A1").Interior.Color = RGB(255, 255, 0) Then

            CountColor = 1 '如果是黄色,函数值等于1

        Else

            CountColor = 0

        End If

    End Function

    • 统计指定颜色的单元格个数

    '最后必须将结果赋值给函数名称

    Function CountColor()

        Dim rng As Range

        For Each rng In Range("A1:A10")

            If rng.Interior.Color = RGB(255, 255, 0) Then

                CountColor = CountColor + 1

            End If

        Next rng

    End Function

    • 用参数指定计算区域

    '最后必须将结果赋值给函数名称

    Function CountColor(arr As Range)

        Dim rng As Range

        For Each rng In arr

            If rng.Interior.Color = RGB(255, 255, 0) Then

                CountColor = CountColor + 1

            End If

        Next rng

    End Function

    • 给自定义函数第2个参数

    '最后必须将结果赋值给函数名称

    Function CountColor(arr As Range, c As Range)

        Dim rng As Range

        For Each rng In arr

            If rng.Interior.Color = c.Interior.Color Then

                CountColor = CountColor + 1

            End If

        Next rng

    End Function

    • 设置自定义函数为易失性函数

    工作表重新计算(按F9重新计算,或重启工作簿)之后,自定义函数并不会重新计算。

    如果将自定义函数设置为易失性函数,无论何时重新计算工作表,函数都会重新计算。

    使用命令:Application.Volatile True

    '最后必须将结果赋值给函数名称

    Function CountColor(arr As Range, c As Range)

        Application.Volatile True

        Dim rng As Range

        For Each rng In arr

            If rng.Interior.Color = c.Interior.Color Then

                CountColor = CountColor + 1

            End If

        Next rng

    End Function 

    十、代码美化

    合理缩进:tab

    取消缩进:Shift+Tab

    更改长行代码为短行代码,在子句后面输入一个空格和一个下划线(_),然后换行,这就把一行代码分成两行。

    Sub test()

        Application.Workbooks("Book1").Worksheets("sheet1") _

                .Range("A1:D100").Font.Bold = True

    End Sub

    把多行合并为一行,在第一行代码后加上英文冒号(:),可以接着写第二行代码

    Sub test()

        Dim a%, b%, c%: a = 1: b = 2: c = 3

    End Sub

    注释:用英文单引号(')表示后面的语句为注释

    注释Rem:用Rem注释只能注释一整行,注释行不能有代码逻辑

    Sub test()

        '=================注释

        Application.Workbooks("Book1").Worksheets("sheet1") _

                .Range("A1:D100").Font.Bold = True

        Rem ==============注释

    End Sub

    批量注释:在VBE窗口中,视图”——“工具”——“编辑”——“设置注释块”  【或解除注释块】

    https://img2018.cnblogs.com/blog/1165829/201810/1165829-20181003194316892-1287805115.png

     

    十一、VBE其他设置

    自动列出成员设置:VBE工具”——“选项”——“编辑器选项卡下——“自动列出成员

    https://img2018.cnblogs.com/blog/1165829/201810/1165829-20181003090440979-1804395796.png

     

    展开全文
  • VBA自定义数据类型(结构体使用)

    万次阅读 2017-08-30 17:28:57
    VBA中结构体不能定义在函数或者过程中,要定义在模块中,否则会提示无效内部过程,或者类型未定义 语法 Type InPutStruct Name As String Id As Integer End TypeDim InPutStructRow As InPutStruct InputStruct...
  • 输入数据:声明(定义)数据,赋初值---声明变量数据类型,赋初值等就是第一部分,定义和输入数据! 处理数据 输出数据(返回结果) 1.2 常量和变量严格声明 默认是不强制声明 在模块的开头写上 opti...
  • VBA中,可以通过Dim语句定义变量,在程序运行的过程中,定义的变量可以随时赋值或读取。 目录 步骤1 步骤2 步骤3 步骤4 说明 声明变量 变量名的命名规则 VBA数据类型 数据类型的分类及表示方式 (1)...
  • 首先欢迎众多的朋友来我这个平台,或是学习,或者提出问题,我都欢迎。为了更好的和大家交流,分享知识,我会不...这期专题共解答有三个问题:问题一 :如果程序中所有变量,都不事先定义,有什么不好?(VBA)问题二 ...
  • Excel VBA String 数据类型

    千次阅读 2020-02-11 13:45:55
    Excel VBA String 数据类型 字符串有两种类型:可变长度字符串和固定长度字符串。 可变长度字符串最多可以包含大约 20 亿 (2^31) 个字符。 固定长度的字符串可以包含1到大约 64 K (2 ^ 16) 个字符。 ' 使用两个双...
  • Boolean 数据类型 Boolean 变量存储为 16 位(2 个字节)的数值形式,但只能是 True 或是 False。Boolean 变量的值显示为 True 或 False(在使用 Print 的时候),或者 #TRUE# 或 #FALSE#(在使用 Write # 的时候)...
  • 最近一直在讲数,数在人们日常生活中不可缺少,却很少有人能仔细的研究这其间的规律,因为太枯燥了,单单是一个分类就有很多,今日讲VBA数据类型。一 字符串类型,符号:String字符串是用于保存文本数据的,字符...
  • 各种数据类型 2.VBA定义公共数组(全局都可以使用) 3.读写文件 SJIS 写入 UTF8 写入 读取 SJIS 读取 UTF-8 4.异常处理 5.忽略错误 6.其他常用1 7.其他常用2:读取(多个)Excel文件 1.各种数据类型 --- '* * * * * ...
  • 他山之石——VBA中的数据类型转换

    千次阅读 2018-06-26 00:14:43
    发现这节的内容相比正则表达式... '在VBA中的数据类型有整数、文本、对象等类型。这些不同的类型有着特定的作用,在进行运算时也会占用 '不同大小的内存,所以我们在编写程序时为了提高运行效率,一般都要定义数据...
  • Excel VBA - 自定义数据类型及其它

    万次阅读 2011-11-01 09:57:42
    →用户自定义数据类型需要使用Type语句 Type lianxiren name As String sex As String age As Integer phone As String address As String department As String End Type Sub AddressList() Dim rec
  • (接上讲)3.类模块 类模块是面向对象编程的基础,可以在类模块中编写代码,为并着手建设,为...标准模块只包含代码,而类模块包含代码又包含数据,可视为没有物理表示的控件。什么是没有物理表示呢?看过我之前章节...
  • vba数据类型

    2018-03-14 10:36:00
    VBA共有12种数据类型,具体见下表,此外用户还可以根据以下类型用Type自定义数据类型。 1)VBA允许使用未定义的变量,默认是变体变量。2)在模块通用说明部份,加入 Option Explicit 语句可以强迫用户进行变量...
  • 大家好,在我之前的教程中分别讲了“VBA代码解决方案”“VBA数据库方案”“VBA字典和数组方案”,通过对这三套教程的学习,我们对VBA的基本知识和基本的操作能有了一定的了解。这套教材是在前面教材基础上的讲解,...
  • 2VBA里无法用%这种数据类型来计算 VBA里没有 %百分数这种数据类型 VBA里无法用%这种数据类型,来计算 如果在VBE里输入 5% 会自动变成 5 VBA里最多可以像文本一样显示百分数,比如 text(a,"0.00%") 3 %在VBA里...
  • Excel VBA(07)数据类型和转换

    千次阅读 2020-04-29 12:27:28
    一、vba 数据类型 1、基本数据类型 整数类型:byte、integer、long、long long 小数类型:single、double 布尔类型:boolean 字符型:string 万能类型:variant 其他类型:date、object 2、...
  • 变量初始值与变量声明类型直接相关,再次说明了数据类型的重要性和基础性。变量声明类型(Declared Type) 初始值/默认值(Initial Data Value) Boolean FALSE Byte, Currency, Double, Integer, Long, LongLong 0 ...
  • 其中表头为caseid,casetile,create,怎么固定这几个字段的值为integer型,其它的默认为String
  • sub 宏名称() dim id%,name as string,haoma as string*18,money# end sub 变量明细 使用缩写的时候,直接在名名列后跟即可,无缩写,则 as 变量类型;const 用法,给列定义类型及赋值,使用双引号
  • VBA全局变量

    万次阅读 2017-06-25 23:05:10
    VBA的全局变量在模块的开头定义,即可在整个工作簿使用,包括sheet、其它模块、userform等所有控件都可以调用。定义方法是在模块的开头输入Option Explicit,声明你需要定义变量,比如定义一个Variant变量K: ...
  • vba 数据类型 if判断

    千次阅读 2018-09-16 19:15:13
    1.数据类型 '------------------------------------------------------------------- '1.VBA中的常见数据类型: ' 类型 注释 简写 占用内存 ' Integer 整型 % ...
  • VBA 静态变量 全局变量

    千次阅读 2019-05-21 17:30:39
    我的理解static跟dim是两种相对的赋值方式,动态变量程序结束后释放,静态变量workbook结束后释放 dim i1 as integer =1 static i2 as integer =1 声明全局变量可以在文档任何位置(For循环、If判断内除外)。...
  • 你已选中了添加链接的内容蓝字关注,加微信NZ9668获资料信息VBA解决方案 系列丛书作者头条百家平台 VBA...代码存储在模块中,在VBA中提供了三种类型的模块:窗体模块、标准模块和类模块。一 各个模块的分工我们在...
  • 最近开发编写一个测试设备的程序(C程序),在定义一个全局变量的时候,之前我喜欢在定义的时候直接赋值,如这样:unsigned char a=0;//这里直接给变量a定义并赋值void main_function(){//在这里使用a...}不过这样做的...
  • VBA函数定义及说明

    千次阅读 2020-06-24 11:18:28
    函数定义,函数返回对象,默认参数,不定长参数

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,682
精华内容 3,872
关键字:

vba定义变量类型