精华内容
下载资源
问答
  • VBA中的标识符,常量和变量

    千次阅读 2018-06-07 23:33:52
    标识符: 在程序运行过程,通常需要将计算结果保存下来,在后面使用,程序使用数据都保存在计算机内存。数据保存在内存,需要使用某种方式引用它,就必须给这些内存一个名称,这就是标识符。定义...

     标识符:

         在程序运行的过程中,通常需要将计算结果保存下来,在后面使用,程序中使用的数据都保存在计算机的内存中。数据保存在内存中,需要使用某种方式引用它,就必须给这些内存一个名称,这就是标识符。

    定义标识符时应该遵循以下规则:

    1、以字符开头,包含字母、数字和下划线,不区分大小写。

    2、长度不能超过255个字符

    3、不能使用VBA的关键字

    4、同一个过程内不能使用重复的名称

    常量

         在程序运行过程中值不能发生变化的数据是常量,常量的值在程序执行之前已经确定,在程序执行的过程中是不能被改变的。

    分为两类常数与符号常量

          常数是一个唯一的所见即所得的数据,根据数据类型的不同,常数可以分为数值型常数、字符串常数、日期型常数和布尔型常数。

    数值型常数:由数字、小数点和正负号所组成的常数。数值型常数包括整型、浮点型、货币型几种。

    例:

    520是整型常数,

    520.1314是浮点型常数,

    20180520.1314货币型常数是为财务数据的表示和计算而设置的,它的取值范围可以达到小数点前15位,小数点后保留4位。

    字符串常数字符串常数是由一对“”界定的,可以包括数字、字符、特殊符号和汉字的字符串。

    例:

    “VBA程序设计”、“abcedfg”、 “10+20=30”都是正确的字符串常数。

    日期型常数日期型常数是用一对“”或者一对#界定的,里面以日期和时间的形式表示。日期的年、月、日之间的分隔符用“/”或“-”,顺序为年月日或月日年。

    例:

    “2017/7/30”、#12-24-2016#、“2009年9月9日”等都是正确的表示日期的方法。

    布尔型常数:布尔型常数也叫逻辑常数,只有两个值True和False,表示真和假。

    符号常量:

          如果在程序中需要反复使用某一个常数,可以用一个标识符来命名这个常数,在需要使用该常数的地方用其名称即可,这就叫符号常量。

          符号常量可以保持常量的性质,其值在程序运行过程中不能被改变。

          使用符号常量的优点在于见名知其意,符号常数一般都是有意义的名字,可以提高程序的可读性;符号常量可以代替冗长的常数,简化输入,并易于修改。符号常量分为两种,一种是系统提供的符号常量,一种是用户自定义的符号常量。

          系统提供的符号常量是VBA系统内部提供的各种不同用途的符号常量,往往与应用程序的对象、方法或属性相结合使用,有确定的标识符和值。

          在VBA中,系统符号常量一般采用大小写混合的格式,前缀表示常量的对象库名。例如在Excel中系统符号常量都是以xl作为前缀,而VB中的系统常量通常以vb作为前缀。 “vbBlack”表示黑色,“xlWorkBook”表示Excel的一个工作薄。

           用户自定义的符号常量声明的语句格式如下:

                                                            Const符号常量名=符号常量值/符号常量表达式

      符号常量的命名规则与标识符的命名规则一样。

    注意:

    1、自定义的符号常量不能使用系统符号常量相同的名称;

    2、等号的右边可以是一个常数,也可以是由常量和运算符组成的表达式,但这个表达式要可以计算出唯一的确定的值;

    3、可以在一行中声明若干个符号常量,不同的符号常量之间以逗号隔开。

    Const PI=3.1415926           '声明一个常数

    Const name=”李平”        ‘a声明一个字符串常数

    Const area=3.14*6*6          '用表达式声明一个常数

    Const a=10,b=15,c=20         '声明多个符号常量

    变量:

           在程序运行过程中,值可以被改变的量叫做变量。

           变量和常量不同,在程序运行的过程中,变量保存的值可以被改变。

           变量在使用之前应该先声明,让VBA知道该变量的名称和数据类型,变量的命名规则与标识符的命名规则相同

            VBA中可以使用Dim语句来声明变量,语法格式如下:

                                                                          Dim变量名[as 数据类型]

           变量在声明的时候可以不指定数据类型,变量的声明可以放在程序的任何地方,但一定要在变量使用之前,一般变量的声明都集中放在程序的开头。每个变量可以在单独的一行进行声明,也可以在同一行声明多个变量,声明时用逗号将各变量隔开。

    Dim str as String                

    '定义一个字符串型变量str

    Dim a as integer, b as Boolean     

    '定义两个变量:整型变量a,布尔型变量b












    展开全文
  • 1.Application对象 该对象代表PowerPoint应用程序,通过该对象可访问PowerPoint中的其他所有对象。 (1)Active属性:返回指定窗格是否被激活。 (2)ActivePresentation属性:返回Presentation对象,代表活动窗口中打开...
  • VBA语言基础认识

    2020-07-01 23:23:57
    VBA是现在可用最容易学习、最容易使用同时也是最复杂应用程序自动化语言(过去常常称为宏语言)之一。 VBA语言基础认识 第一节:标识符 一、定义 标识符是一种标识变量、常量、过程、函数、类等语言构成...

    VBA是现在可用的最容易学习、最容易使用同时也是最复杂的应用程序自动化语言(过去常常称为宏语言)之一。

    VBA语言的基础认识

    第一节:标识符

    一、定义

    标识符是一种标识变量、常量、过程、函数、类等语言构成单位的符号,利用它可以完成对变量、常量、过程、函数、类等引用。

    二、命名规则

    (1)字母打头,由字母、数字和下划线组成,如A987b_23Abc

    (2)字符长度小于40,(Excel2002以上中文版本等,可以用汉字且长度可达254个字符)

    (3)不能与VB保留字重名,如public,private,dim,goto,next,with,integer,single等

     

    第二节:运算符

    定义:运算符是代表VB某种运算功能的符号。

    (1)赋值运算符  =

    (2)数学运算符 &、+ (字符连接符)、+(加)、-(减)、Mod(取余)、\(整除)、*(乘)、/(除)、-(负号)、^(指数)

    (3)逻辑运算符 Not(非)、And(与)、Or(或)、Xor(异或)、Eqv(相等)、Imp(隐含)

    (4)关系运算符 = (相同)、<>(不等)、>(大于)、<(小于)、>=(不小于)、<=(不大于)、Like、Is

    (5)位运算符  Not(逻辑非)、And(逻辑与)、Or(逻辑或)、Xor(逻辑异或)、Eqv(逻辑等)、Imp(隐含)

     

    第三节:数据类型

    VBA共有12种数据类型,具体见下表,此外用户还可以根据以下类型用Type自定义数据类型。

    VBA数据类型

     

    第四节:变量与常量

    (1)VBA允许使用未定义的变量,默认是变体变量

    (2)在模块通用说明部分,加入Option Explicit语句可以强迫用户进行变量定义

    (3)变量定义语句及变量作用域

    一般变量作用域的原则是,那部分定义就在那部分起作用,模块中定义则在该模块那作用。

    (4)常量为变量的一种特例,用Const定义,且定义时赋值,程序中不能改变值,作用域也如同变量作用域。如下定义:Const Pi=3.1415926 as single

     

    第五节:数组

    数组是包含相同数据类型的一组变量的集合,对数组中的单个变量引用通过数组索引下标进行。在内存中表现为一个连续的内存块,必须用Global或Dim语句来定义。定义规则如下:


    Dim 数组名([lower to ]upper [, [lower to ]upper, ….]) as type ;Lower缺省值为0。二
    维数组是按行列排列,如XYZ(行,列)。


    除了以上固定数组外,VBA 还有一种功能强大的动态数组,定义时无大小维数声明;在程序中再利用Redim语句来重新改变数组大小,原来数组内容可以通过加preserve关键字来保留。


    如下例:
    Dim array1() as double : Redim array1(5) : array1(3)=250 : Redim preserve array1(5,10)

     

    第六节:注释和赋值语句

    (1)注释语句是用来说明程序中某些语句的功能和作用;VBA中有两种方法标识为注释语句。


    √单引号 ’  ;如:’定义全局变量;可以位于别的语句之尾,也可单独一行


    √Rem ;如:Rem定义全局变量;只能单独一行


    (2)赋值语句是进行对变量或对象属性赋值的语句,采用赋值号 =,如X=123:Form1.caption=”我的窗口”


    对对象的赋值采用:set myobject=object 或  myobject:=object

     

    第七节:书写规范

    (1)VBA不区分标识符的字母大小写,一律认为是小写字母;


    (2)一行可以书写多条语句,各语句之间以冒号 :  分开;


    (3)一条语句可以多行书写,以空格加下划线 _  来标识下行为续行;


    (4)标识符最好能简洁明了,不造成歧义。

     

    第八节:判断语句

    (1)If…Then…Else语句


    If condition Then [statements][Else elsestatements]


    如1:If A>B And C<D Then A=B+2 Else  A=C+2
    如2:If x>250 Then  x=x-100


    或者,可以使用块形式的语法:


    If condition Then
    [statements]
    [ElseIf condition-n Then
    [elseifstatements] ...
    [Else
    [elsestatements]]
    End If


    如1:

    If Number < 10  Then
         Digits = 1
    ElseIf Number < 100  Then
         Digits = 2
    Else
         Digits = 3
    End If

    (2)Select Case…Case…End Case语句


    如1:

    Select Case  Pid
       Case  “A101”
       Price=200
       Case  “A102”
       Price=300
       ……
       Case Else
       Price=900
    End Case

    (3)Choose 函数
    choose(index, choce-1,choice-2,…,choice-n),可以用来选择自变量串列中的一个值,并将其返回,index 必要参数,数值表达式或字段,它的运算结果是一个数值,且界于 1 和可选择的项目数之间。choice 必要参数,Variant表达式,包含可选择项目的其中之一。如:GetChoice = Choose(Ind, "Speedy", "United", "Federal")
     

    (4)Switch函数
    Switch(expr-1, value-1[, expr-2, value-2 _ [, expr-n,value-n]])switch 函数和 Choose 函数类似,但它是以两个一组的方式返回所要的值,在串列中,最先为
    TRUE 的值会被返回。 expr 必要参数,要加以计算的 Variant 表达式。value 必要参数。如果相关的表达式为 True,则返回此部分的数值或表达式,没有一个表达式为 True,Switch 会返回一个 Null值。

     

    第九节:循环语句

    (1)For Next语句  以指定次数来重复执行一组语句

    For counter = start To end [Step step]                  'step 缺省值为1
    [statements]
    [Exit For]
    [statements]
    Next [counter]

    如1:

    For Words = 10 To 1 Step  -1                               '建立 10 次循环 
          For Chars = 0 To 9                                   '建立 10 次循环
               MyString = MyString & Chars                     '将数字添加到字符串中
          Next Chars                                           'Increment counter
    
          MyString = MyString & " "                            '添加一个空格
    Next  Words

    (2)For Each…Next 语句  主要功能是对一个数组或集合对象进行,让所有元素重复执行一次语句
     

    For Each element In  group
    Statements
    [Exit for]
    Statements
    Next  [element]
     

    如1:

    For Each rang2 In  range1
         With range2.interior
                 .colorindex=6
                 .pattern=xlSolid
         End with
    Next

    这上面一例中用到了 With…End With  语句,目的是省去对象多次调用,加快速度;

     

    语法为:
    With object
    [statements]
    End With
     

    (3)Do…loop语句 在条件为true时,重复执行区块命令


    Do {while |until} condition' while 为当型循环,until为直到型循环,顾名思义,不多说啦
    Statements
    Exit do
    Statements
    Loop


    或者使用下面语法:
    Do                                    ' 先do 再判断,即不论如何先干一次再说
    Statements
    Exit do
    Statements
    Loop {while |until} condition

     

    第十节 其他类语句和错误语句处理

    一.其他循环语句
    结构化程序使用以上判断和循环语句已经足够,建议不要轻易使用下面的语句,虽然 VBA 还支持。


    (1)Goto line 该语句为跳转到line语句行


    (2) On expression gosub destinatioinlist 或者 on expression goto destinationlist 语句为根据 exprssion表达式值来跳转到所要的行号或行标记


    (3)Gosub line…line…Return语句,  Return 返回到 Gosub line行,如下例:

    Sub gosubtry()
          Dim num
          Num=inputbox(“输入一个数字,此值将会被判断循环”)
          If num>0 then Gosub Routine1 :Debug.print num:Exit  sub
          Routine1:
          Num=num/5
          Return
    End sub


    (4)while…wend语句,只要条件为TRUE,循环就执行,这是以前VB老语法保留下来的,如下
     

    例:
    while condition      ‘while I<50
    [statements]        ‘I=I+1
    wend                  ‘Wend
     

    二.错误语句处理
    执行阶段有时会有错误的情况发生,利用OnError语句来处理错误,启动一个错误的处理程序。
    语法如下:


    On Error Goto Line        ‘当错误发生时,会立刻转移到line行去
    On Error Resume Next    ‘当错误发生时,会立刻转移到发生错误的下一行去
    On Erro Goto 0             ‘当错误发生时,会立刻停止过程中任何错误处理过程

     

    第十一节 过程和函数

    过程是构成程序的一个模块,往往用来完成一个相对独立的功能。过程可以使程序更清晰、更具结构性。VBA具有四种过程:Sub 过程、Function函数、Property属性过程和Event事件过程。
     

    一.Sub过程
    Sub 过程的参数有两种传递方式:按值传递(ByVal)和按地址传递(ByRef)。如下例:
     

    Sub password (ByVal x as integer, ByRef y as integer)
          If y=100 then y=x+y else y=x-y
          x=x+100
    End sub
    Sub call_password ()
          Dim x1 as integer
          Dim y1 as integer
          x1=12
          y1=100
          Callpassword(x1,y1)     ‘调用过程方式:1.Call   过程名(参数1,  参数2…);2.  过程名 参数1, 参数2…
          debug.print x1,y1       ‘结果是12、112,y1按地址传递改变了值,而x1按值传递,未改变原值
    End sub


    二.Function函数
    函数实际是实现一种映射,它通过一定的映射规则,完成运算并返回结果。参数传递也两种:按值传递(ByVal)和按地址传递(ByRef)。如下例:

    Function password(ByVal x as integer, byref y as integer) as boolean
           If y=100 then y=x+y else y=x-y
           x=x+100
           if y=150 then password=true else password=false
    End Function
    Sub call_password ()
          Dim x1 as integer
          Dim y1 as integer
          x1=12
          y1=100
          if password then     ‘调用函数:1. 作为一个表达式放在=右端 ; 2. 作为参数使用
          debug.print x1
          end if
    End sub

    三.Property属性过程和Event事件过程


    这是VB在对象功能上添加的两个过程,与对象特征密切相关,也是VBA比较重要组成,技术比较复杂,可以参考相关书籍。

     

    第十二节内部函数

    在VBA程序语言中有许多内置函数,可以帮助程序代码设计和减少代码的编写工作。


    一.测试函数
    IsNumeric(x)          ‘是否为数字,  返回Boolean结果,True  or False      
    IsDate(x)              ‘是否是日期,  返回Boolean结果,True  or False
    IsEmpty(x)         ‘是否为Empty, 返回Boolean结果,True  or False
    IsArray(x)             ‘指出变量是否为一个数组。
    IsError(expression)  ‘指出表达式是否为一个错误值
    IsNull(expression)    ‘指出表达式是否不包含任何有效数据 (Null)。
    IsObject(identifier)  ‘指出标识符是否表示对象变量


    二.数学函数
    Sin(X)、Cos(X)、Tan(X)、Atan(x)  三角函数,单位为弧度
    Log(x) 返回x的自然对数
    Exp(x)返回 
    Abs(x) 返回绝对值
    Int(number)、Fix(number) 都返回参数的整数部分,区别:Int 将 -8.4 转换成 -9,而 Fix 将
    -8.4 转换成 -8
    Sgn(number) 返回一个 Variant (Integer),指出参数的正负号
    Sqr(number) 返回一个 Double,指定参数的平方根
    VarType(varname) 返回一个 Integer,指出变量的子类型
    Rnd(x)返回0-1之间的单精度数据,x为随机种子


    三.字符串函数
    Trim(string)                       去掉string左右两端空白
    Ltrim(string)                      去掉string左端空白
    Rtrim(string)                      去掉string右端空白
    Len(string)                        计算string长度
    Left(string, x)                    取string左段x个字符组成的字符串
    Right(string, x)                   取string右段x个字符组成的字符串
    Mid(string, start,x)              取string从start位开始的x个字符组成的字符串
    Ucase(string)                     转换为大写
    Lcase(string)                      转换为小写
    Space(x)                           返回x个空白的字符串
    Asc(string)                         返回一个 integer,代表字符串中首字母的字符代码
    Chr(charcode)                     返回 string,其中包含有与指定的字符代码相关的字符

    四.转换函数
    CBool(expression)                   转换为Boolean型
    CByte(expression)                  转换为Byte型
    CCur(expression)                    转换为Currency型
    CDate(expression)                  转换为Date型
    CDbl(expression)                    转换为Double型
    CDec(expression)                   转换为Decemal型
    CInt(expression)                    转换为Integer型
    CLng(expression)                   转换为Long型
    CSng(expression)                   转换为Single型
    CStr(expression)                    转换为String型
    CVar(expression)                    转换为Variant型
    Val(string)                             转换为数据型
    Str(number)                           转换为String
     

    五.时间函数
    Now            返回一个 Variant (Date),根据计算机系统设置的日期和时间来指定日期和时间。


    Date           返回包含系统日期的 Variant (Date)。


    Time           返回一个指明当前系统时间的 Variant (Date)。


    Timer          返回一个 Single,代表从午夜开始到现在经过的秒数。


    TimeSerial(hour, minute, second) 返回一个 Variant (Date),包含具有具体时、分、秒的时间。


    DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]]) 返回 Variant(Long) 的值,表示两个指定日期间的时间间隔数目


    Second(time) 返回一个 Variant (Integer),其值为 0 到 59 之间的整数,表示一分钟之中的某个秒


    Minute(time) 返回一个 Variant (Integer),其值为 0 到 59 之间的整数,表示一小时中的某分钟


    Hour(time)  返回一个 Variant(Integer),其值为 0 到 23 之间的整数,表示一天之中的某一钟点


    Day(date)   返回一个 Variant(Integer),其值为 1 到 31 之间的整数,表示一个月中的某一日


    Month(date) 返回一个 Variant(Integer),其值为 1 到 12 之间的整数,表示一年中的某月


    Year(date)  返回 Variant (Integer),包含表示年份的整数。


    Weekday(date, [firstdayofweek]) 返回一个 Variant (Integer),包含一个整数,代表某个日期是星期几
     

    第十三节 文件操作

    文件
    Dir[(pathname[,attributes])] ;pathname 可选参数,用来指定文件名的字符串表达式,可能包含目录或文件夹、以及驱动器。如果没有找到  pathname,则会返回零长度字符串 ("");
     

    attributes 可选参数。常数或数值表达式,其总和用来指定文件属性。如果省略,则会返回匹配 pathname 但不包含属性的文件。
     

    删除
    Kill pathname   从磁盘中删除文件, pathname 参数是用来指定一个文件名
     

    RmDir pathname  从磁盘中删除目录,pathname 参数是用来指定一个文件夹
    打开
     

    Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength] 能够对文件输入/输出 (I/O)。


    pathname 必要。字符串表达式,指定文件名,该文件名可能还包括目录、文件夹及驱动器。

    mode 必要。关键字,指定文件方式,有 Append、Binary、Input、Output、或 Random 方式。如果未指定方式,则以 Random 访问方式打开文件。
     

    access 可选。关键字,说明打开的文件可以进行的操作,有 Read、Write、或 ReadWrite 操作。


    lock 可选。关键字,说明限定于其它进程打开的文件的操作,有 Shared、LockRead、LockWrite、和 Lock Read Write 操作。


    filenumber 必要。一个有效的文件号,范围在 1 到 511 之间。使用 FreeFile 函数可得到下一个可用的文件号。 reclength 可选。小于或等于 32,767(字节)的一个数。对于用随机访问方式打开的文件,该值就是记录长度。对于顺序文件,该值就是缓冲字符数。


    说明 对文件做任何 I/O 操作之前都必须先打开文件。Open  语句分配一个缓冲区供文件进行I/O 之用,并决定缓冲区所使用的访问方式。如果 pathname 指定的文件不存在,那么,在用Append、Binary、Output、或 Random 方式打开文件时,可以建立这一文件。如果文件已由其它进程打开,而且不允许指定的访问类型,则 Open 操作失败,而且会有错误发生。如果 mode是 Binary 方式,则 Len 子句会被忽略掉。


    重要 在 Binary、Input 和 Random 方式下可以用不同的文件号打开同一文件,而不必先将该文件关闭。在 Append 和 Output 方式下,如果要用不同的文件号打开同一文件,则必须在打开文件之前先关闭该文件。
     

    读入
    Input #filenumber, varlist 从已打开的顺序文件中读出数据并将数据指定给变量
    Get [#]filenumber, [recnumber], varname将一个已打开的磁盘文件读入一个变量之中。
     

    写入
    Write #filenumber, [outputlist] 将数据写入顺序文件
    Print #filenumber, [outputlist] 将格式化显示的数据写入顺序文件中
    Put [#]filenumber, [recnumber], varname 将一个变量的数据写入磁盘文件中。
     

    关闭
    Close [filenumberlist] 关闭 Open 语句所打开的输入/输出 (I/O) 文件
    注意 如果今后想用 Input # 语句读出文件的数据,就要用 Write # 语句而不用 Print # 语句将数据写入文件。因为在使用 Write# 时,将数据域分界就可确保每个数据域的完整性,因此可用 Input# 再将数据读出来。使用 Write#  还能确保任何地区的数据都被正确读出。Write与 Print # 语句不同,当要将数据写入文件时,Write # 语句会在项目和用来标记字符串的引号之间插入逗号。Write # 语句在将 outputlist 中的最后一个字符写入文件后会插入一个新行字符,即回车换行符,(Chr(13) + Chr(10))。
     

    其他文件函数
    LOF(filenumber)  返回一个 Long,表示用 Open 语句打开的文件的大小,该大小以字节为单
    位。


    EOF(filenumber)  返回一个 Integer,它包含 Boolean 值 True,表明已经到达为 Random 或
    顺序 Input 打开的文件的结尾。


    Loc(filenumber)   返回一个 Long,在已打开的文件中指定当前读/写位置


    Seek(filenumber)  返回一个 Long,在 Open 语句打开的文件中指定当前的读/写位

    展开全文
  • 一个工程最多可以包含32,000 个"标识符"(非保留字),它们包括(但不限于)窗体、...VB和VBA中的变量名不多于 255 个字符。窗体、控件、模块和类名不多于 40 个字符。 控件 可同时存在的窗口总数受到系统可用资源的...

    VB和VBA工程的一些限制,自己从来没有遇到过此类情况,Blog有回复遇到此类问题,供大家参考。

    一个工程最多可以包含32,000 个"标识符"(非保留字),它们包括(但不限于)窗体、控件、模块、变量、常量、过程、函数和对象,但实际的标识符数受可用内存的限制。

    VB和VBA中的变量名不多于 255 个字符。

    窗体、控件、模块和类名不多于 40 个字符。 

    控件

    可同时存在的窗口总数受到系统可用资源的限制。

    控件数组索引的限制是在 0 到 32,767 的范围之内。

    如果在每个控件的顶层上再安放控件,例如在框架中嵌套框架控件,VisualBasic 一般只接受不多于 25 层的嵌套控件。
      
    List和ListCount列表框控件和组合框控件:项数最多为32K,对每项大小的限制为1K(1024 字节);
    Text文本框控件:限制为64K;
    Caption标签控件:限于1024字节;
    命令按钮控件、复选框控件、框架控件和选项按钮控件:限于255个字符,任何超过这些限制的标题均被截尾;
    自定义控件属性的标题:限于32K
    菜单控件:限于235个字符
    Tag所有控件:仅限于可用的内存大小
    Name所有控件:限于40个字符

    注意,在 Visual Basic 中,控件属性名限于 30 个字符。 

    代码限制

    可被加载到窗体、类或标准模块的代码总数限于 65,534 行。一行代码限于1023 个字节。在一行中的实际文本之前最多只能有 256 个空格的前导,在一个逻辑行中最多只能有 25 个续行符 ( _)。

    对每个模块的过程数没有限制。每个过程可包含至多 64K 的代码。如果过程或模块超过这一限制,Visual Basic 便产生编译时间错误。如果遇到这种错误,可将特别大的过程分割成若干个较小的过程,或将模块级声明移到另一模块,来避免此类错误发生。Visual Basic 用表来保存代码中的标识符名(变量、过程、常量等)。每个表限于 64K。

    转载于:https://www.cnblogs.com/maweifeng/archive/2006/05/21/405632.html

    展开全文
  • VBA入门教程

    2020-09-08 10:09:26
    1.1 VBA中有哪些数据类型 VBA里数据类型有:字节型(Byte)、整数型(Integer), 长整数型(Long), 单精度浮点型(Single), 双精度浮点型(Double),货币型(Currency)等等 数据类型 类型标识符 字节 ...

    VBA

    1、 语法,编程的基础

    1.1 VBA中有哪些数据类型

    VBA里的数据类型有:字节型(Byte)、整数型(Integer), 长整数型(Long), 单精度浮点型(Single), 双精度浮点型(Double),货币型(Currency)等等

    数据类型 类型标识符 字节
    字符串型 String $ 字符长度0-64500
    字节型 Byte 1
    布尔型 Boolean 2
    整数型 Integer % 2
    长整型 Long & 4
    单精度型 Single 4
    双精度型 Double # 8
    日期型 Date 8
    货币型 Currency @ 8
    小数点型 Decimal 14
    变体型 Variant 以上任意类型
    对象型 Objecrt 4

    2、 存储数据的容器:常量和变量

    2.1 声明变量
    • 语法:Dim 变量名 As 数据类型
    Dim Str As String  //(Str就是装String类型的数据)
    Dim str As String*10 //(表示最多装10个字节数据)
    

    使用变量类型声明符(简写模式)如上图所示类型标识符

    Dim Str$ (这里$字符串, 原来美元就是一个字符串丫)

    • 声明多个变量(逗号隔开)

      Dim str As String, num As Integer,
      

    相当于:

    Dim str As String
    Dim num As Integer
    
    • 如果不指定变量类型

    Dim Str (默认是Variant类型)

    什么是Variant

    所有数据类型统称,它表现所有数据类型,意味它很大(一般不要声明为Variant,你计算都不知道应该给你这个变量分配多少内存,杀鸡焉用牛刀一个道理)

    • 强制声明所有变量

    方法一:在模块的第一句手动输入代码:“Option Explicit”,它会强制检查。

    方法二:在工具菜单栏中有设置选项,在每一次插入模块自动会添加 Option Explicit

    还可以声明变量的作用域(也就是变量在哪里有效)

    语法一: Public 变量名 As 数据类型

    语法二:Private 变量 As 数据类型

    语法三:Static 变量名As 数据类型

    例如:

    Public str As String 
    Private str As String
    Static str As String
    
    • 变量的作用域
    作用域 描述
    单个过程
    单个模块
    所有模块

    把数量存储到变量里

    2.2 基本数据类型变量赋值
    • 语法 【Let】 变量名称 =数据 (【】表示可以省略)

    简写为 变量名称=数据

    Option Explicit ‘强制语法检查
    
    Sub 第一个宏()
        Dim str As String     '声明变量名为str,类型为String
    	Let str = "一起来学VBA"  '将“一起来学VBA”赋值给str变量,那么str就代表这个字符串
    	Range("A1").Value = str   '将字符串转换填充单元格A1
    End Sub
    
    • 给对象变量赋值语法

    Set 变量名称 = 对象(Set不能省略)

    Option Explicit
    
    Sub 第一个宏()
       Dim rng As Range       '声明一个Range变量,可以表示单元格
       Set rng = Worksheets("Sheet2").Range("A1")  '将工作表Sheet1的A1单元格对象赋值给rng
       rng.Value = "学习VBA就是这么简单"    '这时候rng就代表A1单元格
    End Sub
    

    2.3 使用常量

    常量通常用来存储一些固定的不会被修改的值,如圆周率π,各种税率 (其实就是取有意义变量代替值)

    所以只能赋值一次

    • 语法: Const 变量名称 As 数据类型 = 数值

    常量作用域类似变量,在过程中定义,过程内可用(本地常量),过程外定义,模块级常量, public + 过程外定义 公共常量

    2.4、 使用数组

    2.4.1 什么是数组

    数组类似你买一盒饼干,分成几个格,每一个的饼都是一样的。

    数组特点:

    数据共享同一个名称,即数组名
    数组有多个同种类型的变量组成
    数组中的元素按次序存储在数组中,通过索引号进行区分
    数组也是变量

    2.4.2 语法:
    • 一维数组

    Dim 数组名(a to b) As 数据类型

    Dim num (1 to 50) As String (表示50个字符串打包成的数组)。

    给数组赋值

    num(1) = “1号” (序号为1 放入一个字符串为"1号")

    num(2)=“2号” (序号为2 放入一个字符串为 “2号”)

    简写 Dim arr(49) As String 相对于 Dim arr(0 to 49) As String (注意是从0开始的)

    例子:

    Option Explicit
    
    Sub 第一个宏()
      Dim num(1 To 10) As String
      num(1) = "1号"
      num(2) = "2号"
      num(3) = "3号"
      Range("A1") = num(1)
      Range("A2") = num(2)
      Range("A3") = num(3)
    End Sub
    

    以上是一维数组,就像排队买早餐

    • 二维数组

    Dim 数组名(a to b,c to d) As 数据类型

    如果要在电影院确定你位置这时候需要二维数组,也就是第几排第几列

    Dim 电影院 (1 to 10, 1 to 30) As String (表示电影院10行,每行30十个座位)

    简写 Dim 电影院(9, 29) As String (因为从0开始,所以减一)

    三维数组类似: 空间坐标, x,y,z轴

    Dim 坐标 (1 to 10, 1 to 20, 1 to 2) As String (可以认为是x轴范围1到10, y轴范围为1到20, z轴坐标1到2所组成所有点)

    当然还有四维数组、五维数组等等。一般用的最多的只有一、二数组。

    2.4.3 声明动态数组

    语法: Dim 数组名称 ()

    (既然动态,表示刚开始时候不知道到底装多少元素,所以括号里什么也没有写,只知道是数组数据类型)

    如果知道确定大小之后可以采用 ReDim (Re 在英语中就是再一次意思) 关键词进行定义大小

    代码:

    Option Explicit
    
    Sub 统计单元格()
        Dim arr() As String
        Dim n As Long
        '统计A列有多少个非空单元格
        n = Application.WorksheetFunction.CountA(Range("A:A"))
        MsgBox ("A列所有单元格的数量:" & n)
        '重新定义数组大小
        ReDim arr(1 To n) As String
    End Sub
    
    2.4.4其他常用的创建数组的方式

    方法一: 使用Array函数创建数组

    语法:Array(元素1,元素2) (注意括号和逗号都是英文,记住一点就是设计涉及软件都是英文的状态的符号,这是也是刚开始最容易犯的错误,怎么也找不到错误的位置)

    Option Explicit
    
    Sub ArrayTest()
       Dim arr As Variant
       '将1到10十个自然数赋给数组arr
       arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
       MsgBox "arr数组的第二个元素为(注意编号从0开始):" & arr(1)
    End Sub
    

    方法二: 使用Split 函数创建数组 (Split:就是分割意思)

    语法: Split(“字符串”, “以字符作为分割线”)

    Option Explicit
    
    Sub SplitTest()
    
       Dim arr As Variant
    
       '利用split 生成数组
       arr = Split("坚持不懈,直到成功", ",")
       MsgBox "arr数组的第二个元素为(注意编号从0开始):" & arr(1)
        
    End Sub
    

    方法三: 通过Range对象直接创建数组 (Range是VBA用得最多,它代表单元格范围,可以单个,也可以是多个)

    Option Explicit
    
    Sub RngArrTest()
       Dim arr As Variant    '定义变量
    
       arr = Range("A3:C11").Value  '首先将单元A3到C11存到变量arr中
    
       Range("A13:C17").Value = arr '然后将新的值写入单元格中
    
    
    End Sub
    
    • UBound和LBound函数 (计算索引值)

    用到数组最关心的数组什么时候数组最后一个元素,所有这个用这个函数解决你疑虑

    语法: UBound(arr) (upper取第一个字母,表示大,也就是数组最后一个元素的序号是多少)

    LBound(arr) (Lower 取第一个字母,表示小, 也就是数组第一个元素的序号是多少)

    那么数组中有多少个元素呢?

    UBound(arr) - LBound(arr) + 1

    Option Explicit
    
    Sub RngArrTest()
       Dim arr(10 To 50)  '定义数组,从10到50
       MsgBox "数组的最大索引号是: " & UBound(arr) & Chr(13) _
        & "数组的最小索引号是:" & LBound(arr) & Chr(13) _
        & "数组的元素个数是:" & UBound(arr) - LBound(arr) + 1
    
    
    End Sub
    

    对于多维数组求索引号

    Option Explicit
    
    Sub RngArrTest()
       Dim arr(1 To 10, 1 To 100)  '定义二维数组
    
       MsgBox "第一维的最大索引号是:" & UBound(arr, 1) & Chr(13) _
        & "第二维的最小索引号是:" & LBound(arr, 2)
        
    End Sub
    

    Join 函数,(这个函数和Split函数刚好相反,它将字符串连成一个字符串 )

    语法: Join (数组 , “连接符”)

    Option Explicit
    
    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
    
    
    

    将数组写入单元格区域

    批量写入数据,利用转置(也就是行变成列,列变成行)

    Option Explicit
    
    Sub ArrToRng1()
       Dim arr As Variant
    
       arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
    
       '将数组批量写入单元格
    
       Range("A1:A9").Value = Application.WorksheetFunction.Transpose(arr)
    
       Range("B1:B9").Value = arr
    
    End Sub
    

    3、运算符

    3.1 算术运算符

    3.2 比较运算符

    3.3 连接运算符

    只有两种 *&**+*

    &: 只能字符串拼接

    +:会根据两个表达式判断,如果两个表达式是数字,它会执行加法算法,其他情况和&一样功能字符串拼接

    3.4 逻辑运算符

    4、条件分支

    4.1 方法一:If … then

    语法:
    if  条件  then
    
    执行语句1  (当条件满足的执行,也就是条件=true)
    
    Else     
    
    执行语句2   (当条件不满足的执行,也就是条件=false)
    
    End if      (结束if语句结构)
    

    举例:

    Option Explicit
     
    Sub iftest()  
       If Range("A1") = "" Then        
            MsgBox "单元格A1为空"   
       Else   
            MsgBox "单元格A1有值"   
       End If
    End Sub
    

    4.2 方法二:Select Case 语句

    语法:
    Select Case  值(条件可以数值表达式或字符串表达式)
    Case   (含有Is或To 表达式)
    语句1                          (上面为true执行) 
    Case   (含有Is或To 表达式)
    语句2                         (上面为true执行) 
      ......
    Case Else 
    语句 n
    End Select 
    
    

    案例:

    Option Explicit
     
    Sub caseTest()
     
      Dim score As String    '定义变量保存结果
      
      Select Case Range("A1")   '获取单元格A1的值
      
      Case Is >= 90
      
        score = "优"
        
      Case Is >= 80
        
        score = "良"
     
      Case Is >= 70
        
        score = "中"
        
      Case Is >= 60
      
        score = "及格"
        
     Case Else
     
        score = "不及格"
        
    End Select
     
        Range("B1") = score   '将值写到单元格B1
     
    End Sub
    
    

    5 、循环结构

    5.1 方法一:For … Next 语句

    语法:
    
    For  循环变量    Step  数字             (Step表示步长,每隔多少数字,这个是可选的)
    
      循环体
    
    Next     (下一个)
    

    案例:

    Option Explicit
     
    Sub caseTest()
     
      Dim score As String, i#    '定义变量保存结果,你是否记得#代表整数
      
      For i = 1 To 10 Step 1
      
          Select Case Range("A" & i) '获取单元格Ai的值
          
              Case Is >= 90
              
                score = "优"
                
              Case Is >= 80
                
                score = "良"
            
              Case Is >= 70
                
                score = "中"
                
              Case Is >= 60
              
                score = "及格"
                
             Case Else
             
                score = "不及格"
            
        End Select
         
        Range("B" & i) = score  '将值写到单元格Bi
     
    Next i
    End Sub
    

    5.2 方法二:Do While

    Do  [While  逻辑表达式]    (为true执行,这是可选的)
    
    <循环体>
    
    [Exit Do]        (退出循环)
    
    [循环体]
    
    Loop
    
    备注:“[]” 表示可选
    

    案例

    Option Explicit
     
    Sub caseTest()
     
      Dim score As String, i#    '定义变量保存结果,你是否记得#代表整数
     
     i = 1
     
     Do While Range("A" & i) <> ""  '表示A列直到为空单元格
      
          Select Case Range("A" & i) '获取单元格Ai的值
          
              Case Is >= 90
              
                score = "优"
                
              Case Is >= 80
                
                score = "良"
            
              Case Is >= 70
                
                score = "中"
                
              Case Is >= 60
              
                score = "及格"
                
             Case Else
             
                score = "不及格"
            
        End Select
         
        Range("B" & i) = score  '将值写到单元格Bi
        
        i = i + 1
        
     Loop
     
    End Sub
    
    

    5.3 Do Until 语句

    #### 语法1:
    Do [Until 逻辑表达式]  
    
    <循环体>
    
    [Exit Do]
    
    [循环体]
    
    Loop
    
    备注:“[]” 可选的
    
    ##### 语法2:
    
    Do 
    
    <循环体>
    
    [Exit Do]
    
    [循环体]
    
    Loop [Until 逻辑表达式]
    

    案例:

    Option Explicit
     
    Sub caseTest()
     
      Dim score As String, i#    '定义变量保存结果,你是否记得#代表整数
     
     i = 1
     
     Do Until Range("A" & i) = ""  '表示A列直到为空单元格(条件满足是退出循环)
      
          Select Case Range("A" & i) '获取单元格Ai的值
          
              Case Is >= 90
              
                score = "优"
                
              Case Is >= 80
                
                score = "良"
            
              Case Is >= 70
                
                score = "中"
                
              Case Is >= 60
              
                score = "及格"
                
             Case Else
             
                score = "不及格"
            
        End Select
         
        Range("B" & i) = score  '将值写到单元格Bi
        
        i = i + 1
        
     Loop
     
    End Sub
    

    5.4 For Each … Next 语句

    打印工作簿中所有工作表

    Option Explicit
     
    '打印工作簿中所有工作表 
    Sub forEachTest()
     
        Dim sht As Worksheet, i As Integer
        
        i = 1
        
        For Each sht In Worksheets
        
            Range("A" & i) = sht.Name
            
            i = i + 1
            
        Next sht
        
     
    End Sub
    
    

    6 其他的常用语句

    6.1 GoTo语句, 让程序转到另一条语句去执行

    尽量不要用,虽然用起来灵活,但是可读性差,尽量将GoTo转换成其他结构选择结构和循环结构(所以这里不打算涉及)

    6.2 With语句,让代码更加简单

    Option Explicit
     
    Sub notWithTest()
     
        Worksheets("Sheet2").Range("A1").Font.Name = "仿宋"  '设置字体
        
        Worksheets("Sheet2").Range("A1").Font.Size = 12   '设置字号
        
        Worksheets("Sheet2").Range("A1").Font.Bold = True '字体加粗
        
        Worksheets("Sheet2").Range("A1").Font.ColorIndex = 3 '设置字体颜色
     
        
     
    End Sub
     
     
     
    Sub withTest()
        
        With Worksheets("Sheet2").Range("A1").Font
        
            .Name = "仿宋"
            
            .Size = 12
            
            .Bold = True
            
            .ColorIndex = 3
            
        End With
     
    End Sub
    
    

    7 Sub过程

    语法:
    [Private|Public] [Static] Sub 过程名([参数列表])  (如果不写默认是Public, Static表示保存该过程里声明的本地变量)
    
    [语句块]
    
    [Exit Sub]    (退出过程)
    
    [语句块]
    
    End Sub
    

    7.1 过程的调用

    ###方法一:输入过程名以及参数、参数用逗号隔开
    
    Sub caseTest()
      
     Dim i#    '定义变量保存结果,你是否记得#代表整数
        
    For i = 1 To 10 Step 1
      
     rank (i)
      
    Next i
     
    End Sub
     
     
    Sub rank(i)
     
        Dim score As String
        
         Select Case Range("A" & i) '获取单元格Ai的值
            
              Case Is >= 90
                
                score = "优"
                  
              Case Is >= 80
                  
                score = "良"
              
              Case Is >= 70
                  
                score = "中"
                  
              Case Is >= 60
                
                score = "及格"
                  
             Case Else
               
                score = "不及格"
              
        End Select
        
        Range("B" & i) = score  '将值写到单元格Bi
       
    End Sub
    
    
    ###方法二:在过程名称以及参数前使用Call关键字,参数用括号括起来,并用逗号隔开
    
    语法: Call 过程名 [(参数1,参数2,...)]
    
    上面例子只要将 rank(i)   修改成 Call rank(i) 即可
    
    ###方法三:利用 Application 对象的Run方法
    
    语法:  Application.Run 表示过程名的字符串(或字符串变量) , 变量一,变量二。。。。
    
    上面例子:将rank(i)  修改成 Application.Run "rank", i
    

    8 自定义函数、Function过程

    Function与Sub的区别就是Function有返回值,而Sub没有
    
    语法:
    
    [Public | Private] [Static] Function 函数名([参数列表])     (As 数据类型)
    
    [语句块]
    
    [函数名=过程结果]
    
    [Exit Function]
    
    [语句块]
    
    [函数名=过程结果]
    
    End Function
    

    案例:

    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
    
    

    9代码排版

    9.1 更改长行代码为短行代码

    采用 “ _” 空格下划线进行换行,多行合并为一行

    Sub test()
        Application.Workbooks("Book1").Worksheets("Sheet1") _ 
            .Range("A1:D100").Font.Bold = True
      
    End Sub
    

    9.2 合并为一行

    Sub test()
       Dim a%, b%, c%: a = 1: b = 2: c=3
    End Sub
    

    10 ASCII码的表格chr()

    chr(10) 换行符
    chr(13) 回车
    chr(32) 空格
    chr(9) tab
    chr(34) 双引号

    11 案例分析

    11.1 下划线转驼峰命名

    Sub 下划线转驼峰()
    '获取下划线的值,并全部转换为小写
    For i = 1 To 100 Step 1
        If Not IsEmpty(Cells(i, 1)) Then
             x = LCase(Cells(i, 1))
             '按下划线取值
             arr = Split(x, "_")
             For j = 1 To (UBound(arr) - LBound(arr)) Step 1
                Cells(i, 2) = arr(0) & UCase(Left(arr(j), 1)) & Right(arr(j), Len(arr(j)) - 1)
                Cells(i, 3) = UCase(Left(arr(0), 1)) & Right(arr(0), Len(arr(0)) - 1) & UCase(Left(arr(j), 1)) & Right(arr(j), Len(arr(j)) - 1)
             Next
        End If
    Next
    End Sub
    
    展开全文
  • Vba一共有12数据类型。 变量与常量定义 变量定义: 不能在定义同时赋值,需要分开来写: Dim changeFlag As Boolean Public Sub test() changeFlag = False End Sub 或者用更简单定义方式:...
  • VBA常用技巧

    2014-12-21 16:39:28
    技巧3 获得指定行、列中的最后一个非空单元格 12 技巧4 定位单元格 12 技巧5 查找单元格 12 5-1 使用Find方法 12 5-2 使用Like运算符 12 技巧6 替换单元格内字符串 12 技巧7 复制单元格区域 12 技巧8 仅复制数值到另...
  • Excel_VBA教程

    2014-09-22 11:36:34
    第六章 在VBA中重复操作 123 1.DO LOOPS: DO…WHILE和DO…UNTIL 123 2.观察过程执行 126 3.WHILE…WEND循环 127 4.FOR…NEXT 循环 128 5.FOR EACH…NEXT循环 129 7.提前跳出循环 130 8.循环嵌套 131 9.接下来… 131 ...
  • VBA编程技巧大全

    2013-08-05 09:03:19
    技巧3 获得指定行、列中的最后一个非空单元格 17 技巧4 定位单元格 20 技巧5 查找单元格 21 5-1 使用Find方法 21 5-2 使用Like运算符 25 技巧6 替换单元格内字符串 26 技巧7 复制单元格区域 27 技巧8 仅复制数值到另...
  • excelperfect执行在功能区和不在功能区中的命令在上篇文章中,通过下面的语句来执行MinimizeRibbon命令:Application.CommandBars.ExecuteMso(idMso)该方法仅接受1个参数:idMso,指定命令的名称(也被称作该控件...
  • EXCEL编程VBA高级教程

    2015-04-16 11:40:55
    1.2EXCEL环境基于应用程序自动化优点................................................................................1 1.3录制简单宏....................................................................
  • 依据 1939.2 理解表达式中的元素 1949.2.1 操作符 1949.2.2 文字 1979.2.3 标识符 1989.2.4 函数 1989.2.5 固有的和命名常数 2059.3 创建Access表达式 2059.3.1 创建默认值的表达式 2069.3.2 使用表达式进行数据有效...
  • 1939.2 理解表达式中的元素 1949.2.1 操作符 1949.2.2 文字 1979.2.3 标识符 1989.2.4 函数 1989.2.5 固有的和命名常数 2059.3 创建Access表达式 2059.3.1 创建默认值的表达式 2069.3.2 使用表达式进行数据有效性...
  • 1939.2 理解表达式中的元素 1949.2.1 操作符 1949.2.2 文字 1979.2.3 标识符 1989.2.4 函数 1989.2.5 固有的和命名常数 2059.3 创建Access表达式 2059.3.1 创建默认值的表达式 2069.3.2 使用表达式进行数据有效性...
  • 1939.2 理解表达式中的元素 1949.2.1 操作符 1949.2.2 文字 1979.2.3 标识符 1989.2.4 函数 1989.2.5 固有的和命名常数 2059.3 创建Access表达式 2059.3.1 创建默认值的表达式 2069.3.2 使用表达式进行数据有效性...
  • 4.2.2.4 枚举存储对象中的元素 4.2.3 流对象和IStream接口 4.2.4 结构化存储示例——例程StructStore 4.3 永久对象 4.3.1 永久接口 4.3.2 永久对象编程——例程PersistText 4.3.3 永久对象客户编程——例程...
  • 1.8 C#在.NET企业体系结构中的作用 1.9 小结 第2章 C#基础 2.1 引言 2.2 第一个C#程序 2.2.1 代码 2.2.2 编译并运行程序 2.2.3 详细介绍 2.3 变量 2.3.1 变量的初始化 2.3.2 类型推断 2.3.3 变量的作用域 2.3.4 常量...
  • 1.8 C#在.NET企业体系结构中的作用 1.9 小结 第2章 C#基础 2.1 引言 2.2 第一个C#程序 2.2.1 代码 2.2.2 编译并运行程序 2.2.3 详细介绍 2.3 变量 2.3.1 变量的初始化 2.3.2 类型推断 2.3.3 变量的作用域 2.3.4 常量...
  • C#高级编程(第6版)

    2011-05-11 11:10:30
     1.8 C#在.NET企业体系结构中的作用  1.9 小结  第2章 C#基础  2.1 引言  2.2 第一个C#程序  2.2.1 代码  2.2.2 编译并运行程序  2.2.3 详细介绍  2.3 变量  2.3.1 变量的初始化  2.3.2 类型推断  2.3.3...
  •  1.8 C#在.NET企业体系结构中的作用  1.9 小结  第2章 C#基础  2.1 引言  2.2 第一个C#程序  2.2.1 代码  2.2.2 编译并运行程序  2.2.3 详细介绍  2.3 变量  2.3.1 变量的初始化  2.3.2 类型推断  2.3.3...

空空如也

空空如也

1 2
收藏数 21
精华内容 8
热门标签
关键字:

vba中的标识符