精华内容
下载资源
问答
  • Excel VBA 基础部分 一、定义语句 '定义变量和分配存储空间 Dim [ WithEvents ] varname [ ( [ subscripts ] ) ] [ As [ New ] type ] . . . 部分 说明 withEvents 可选。该关键字指定varname是对象变量,...

    Excel VBA 基础部分

    一、变量声明语句

    '定义变量和分配存储空间
    Dim [ WithEvents ] varname [ ( [ subscripts ] ) ] [ As [ New ] type ] . . .
    
    部分说明
    withEvents可选。该关键字指定varname是对象变量,用于响应触发一个ActiveX对象。WithEvents只在类模块有效。使用它你可以定义多个独立的对象,但是不能使用该关键字创建数组,也不能与New关键字一起使用。
    varname必需。变量名称
    subscripts可选。数组变量的维数;最多可达60维。 该subscripts参数使用以下语法: [ lower To ] upper [ , [ lower To ] upper ] . . . 。
    如果没有使用explicity语句,数组的最低维数 lower由可选的Base语句控制。如果没有可选的Base语句存在,则最低的数组维数是0.
    New可选。该关键字能显示创建一个对象。如果在定义对象变量时使用New,则创建了该对象的一个实例。 所以,不必使用Set语句来赋值该对象的引用。New不能定义内置的数据类型。
    type可选。变量的数据类型;可以指定的有:Byte, Boolean, Integer, Long, Currency(货币型), Single(单精度), Double(双精度), Decimal (当前不支持), Date, String (可变长度), String length (固定的字符串长度), Object, Variant, 用于自定义类型, or an object type。
    备注如果定义在模块界别,则在该模块上的函数都可用;如果定义在函数内,则只有函数内可用。
    在定义对象变量时,如果没有使用New关键字,则在对该变量赋值时必须使用Set关键字。并在赋值前该变量的值是Nothing。
    在定义一个数组变量时不带小括号,则该变量是可变数组变量,在函数中可以Redim具体指定数组的维数。

    示例

    ' 定义AnyValue 和 MyValue为 Variant,默认赋值为Empty。 
    Dim AnyValue, MyValue 
     
     '显示定义一个整数类型的变量
    Dim Number As Integer 
     
    ' 在一行中定义多个变量。 由于没有指定类型,所以AnotherVar的类型是Variant。
    Dim AnotherVar, Choice As Boolean, BirthDate As Date 
     
    ' DayArray是有51个索引的数组变量,如果可选Base设置为0(默认),则索引从0至50。
    Dim DayArray(50) 
     
    ' Matrix 是二维整数数组。 
    Dim Matrix(3, 4) As Integer 
     
    ' MyMatrix 是double类型的三维数组,其维数显示指定。 
    Dim MyMatrix(1 To 5, 4 To 9, 3 To 5)  As Double 
     
    ' BirthDay是一个索引从1至10的日期型的数组。 
    Dim BirthDay(1 To 10)As Date 
     
    ' MyArray是动态 variants 类型的数组
    Dim MyArray()
    

    二、赋值语句、条件语句、循环语句

    (一)赋值语句

    1. Let语句

    '语法
    [ Let ] varname = expression
    

    示例

    Dim MyStr, MyInt 
    ' 以下变量使用 Let 语句进行赋值 
    Let MyStr = "Hello World" 
    Let MyInt = 5
    
    '日期型赋值
    Dim birthday as Date
    Let birthdat = #2021-1-1#
    
    '也可以省略 Let
    Dim MyStr, MyInt 
    MyStr = "Hello World" 
    MyInt = 5
    

    2. Set

    '语法
    Set objectvar = {[ New ] objectexpression | Nothing }
    

    示例

    Dim YourObject, MyObject, MyStr 
    Set MyObject = YourObject            ' 赋值对象的地址(引用) 
                                         ' MyObject 和 YourObject 引用同一个对象
    YourObject.Text = "Hello World"      ' 初始化属性
    MyStr = MyObject.Text                ' 返回 "Hello World". 
     
    ' 切断联系,MyObject 不再引用 YourObject。
    Set MyObject = Nothing               ' 释放对象
    
    ' 也可以使用对象数组
    Dim myChildForms(1 to 4) As Form1 
    Set myChildForms(1) = New Form1 
    Set myChildForms(2) = New Form1 
    Set myChildForms(3) = New Form1 
    Set myChildForms(4) = New Form1
    

    (二)条件语句

    1. If…Then…Else语句

    '语法(单行)
    If condition Then [ statements ] [ Else elsestatements ]
    
    '或者使用语句块
    If condition Then
    	[ statements ]
    [ ElseIf condition-n Then
    	[ elseifstatements ]]
    [ Else
    	[ elsestatements ]]
    End If
    

    示例

    '使用单行语法
    If A > 10 Then A = A + 1 : B = B + A : C = C + B
    
    '使用语句块语法
    Dim Number, Digits, MyString 
    Number = 53                           ' 初始化变量
    If Number < 10 Then 
     	Digits = 1 
    ElseIf Number < 100 Then 
    ' 条件计算为True时,下面的语句会执行 
     	Digits = 2 
    Else 
     	Digits = 3 
    End If 
     
    ' 使用单行语法形式赋值 
    If Digits = 1 Then MyString = "One" Else MyString = "More than one"
    
    '使用 if TypeOf 构造来判断传递过来的Control是否是一个文本对话框
    'TypeOf 不能与除Object以外的Long、Integer等硬数据类型一起使用
    Sub ControlProcessor(MyControl As Control) 
    	 If TypeOf MyControl Is CommandButton Then 
    		Debug.Print "You passed in a " & TypeName(MyControl) 
    		ElseIf TypeOf MyControl Is CheckBox Then 
    		Debug.Print "You passed in a " & TypeName(MyControl) 
    		ElseIf TypeOf MyControl Is TextBox Then 
    		Debug.Print "You passed in a " & TypeName(MyControl) 
    	End If 
    End Sub
    

    2. Select Case语句

    '语法
    Select Case testexpression
    	[ Case expressionlist-n [ statements-n ]]
    	[ Case Else [ elsestatements ]]
    End Select
    

    示例

    '可以在每个Case子句中使用多个表达式或范围
    Case 1 To 4, 7 To 9, 11, 13, Is > MaxNumber
    
    '备注:Is 比较运算符与Select Case语句中使用的 Is 关键字不同。
    
    '也可以指定字符串的范围和多个表达式。下面示例Case会匹配字符串 everything;
         按照字符顺序匹配落在nuts和soup之间的字符串,及变量TestItem的当前值:
    Case "everything", "nuts" To "soup", TestItem
    
    Dim Number 
    Number = 8                                 ' 变量初始化
    Select Case Number                         ' 计算变量的值
    Case 1 To 5                                ' 1至5之间的数字, [1, 5]
        Debug.Print "Between 1 and 5" 
                                               ' 以下是只有匹配单个值时
    Case 6, 7, 8                               ' 6至8之间(含)
        Debug.Print "Between 6 and 8" 
    Case 9 To 10                               ' 9 或者 10
    	Debug.Print "Greater than 8" 
    Case Else                                  ' 其他值
        Debug.Print "Not between 1 and 10" 
    End Select
    

    3. Choose 函数。从参数列表中选择并返回一个值

    语法
    Choose(index, choice-1, [ choice-2, ..., [ choice-n ]] )
    

    示例

    ' 根据 ind的值来选择第几个字符串
    Function GetChoice(Ind As Integer)
        GetChoice = Choose(Ind, "Speedy", "United", "Federal")
    End Function
    

    4. IIf 函数。根据表达式的值从两个里面选择一个

    ' 语法
    IIf(expr, truepart, falsepart)
    

    示例

    Function CheckIt (TestMe As Integer)
        CheckIt = IIf(TestMe > 1000, "Large", "Small")
    End Function
    

    5. Switch 函数。计算表达式的列表并返回与列表中第一个结果为 True 的表达式关联的 Variant 值或表达式

    '语法
    Switch(expr-1, value-1, [ expr-2, value-2…, [ expr-n, value-n ]])
    
    '出现以下情形,Switch返回 Null 值:
         '1. 所有表达式的值不是True
         '2. 第一个表达式为真是对应的值是Null.
    'Switch 会计算所有表达式,即使只返回其中一个。
    

    示例

    ' 此示例使用 Switch 函数返回与某个城市名称匹配的语言名称
    Function MatchUp(CityName As String)
        Matchup = Switch(CityName = "London", "English", CityName _
                        = "Rome", "Italian", CityName = "Paris", "French")
    End Function
    

    (三)循环语句

    1. While…Wend语句

    '语法
    While condition [ statements ] Wend
    

    示例

    Dim Counter 
    Counter = 0                          ' 初始化
    While Counter < 20                   ' 测试Counter的值
    	 Counter = Counter + 1           ' Counter值加 1
    Wend                                 ' 当 Counter > 19 时,结束while循环
    Debug.Print Counter                  ' 在立即窗口打印20
    

    2. Do…Loop语句

    '语法
    Do [{ While | Until } condition ]
    	[ statements ]
    	[ Exit Do ]
    	[ statements ]
    Loop
    
    '或者可以使用以下语法:
    Do
    	[ statements ]
    	[ Exit Do ]
    	[ statements ]
    Loop [{ While | Until } condition ]
    

    示例

    Public Sub LoopExample()
        Dim Check As Boolean, Counter As Long, Total As Long
        Check = True: Counter = 0: Total = 0                         ' 变量初始化
        Do                                                           ' 外侧循环
            Do While Counter < 20                                    ' 内层循环
                Counter = Counter + 1                                ' Counter的值加 1
                If Counter Mod 10 = 0 Then                           ' 如果是10的倍数
                    Check = (MsgBox("Keep going?", vbYesNo) = vbYes) ' 停下来等待用于点击是否
                    If Not Check Then Exit Do                        ' 跳出内层循环
                End If
            Loop
            Total = Total + Counter                                  ' 内层循环结束后执行
            Counter = 0
        Loop Until Check = False                                     ' 立即跳出外层循环
        MsgBox "Counted to: " & Total
    End Sub
    

    3. For Each…Next语句

    '语法
    For Each element In group
    	[ statements ]
    	[ Exit For ]
    	[ statements ]
    Next [ element ]
    
    部分说明
    element必需。是一个用于遍历集合或数组元素的变量。对于集合(collentions)来说,元素可以是Variant变量,通用对象(object)变量,或任何特定的对象变量。对于数组来说,元素只能是Vaviant变量。

    示例

    Dim Found, MyObject, MyCollection 
    Found = False                              ' 初始化
    For Each MyObject In MyCollection          ' 遍历集合中每个元素
        If MyObject.Text = "Hello" Then        ' 如果对象的属性Text是"Hello".
            Found = True                       ' 把Found的值设置为 True.
            Exit For                           ' 退出循环 
        End If 
    Next
    

    4. For…Next 语句

    '语法
    For counter = start To end [ Step step ]
    	[ statements ]
    	[ Exit For ]
    	[ statements ]
    Next [ counter ]
    

    示例

    dim i%,  j%
    For i = 1 To 10 
    	 For j = 1 To 10 
    		 For k = 1 To 10 
    		 	... 
    		 Next k 
    	 Next j 
    Next i
    
    Dim Words, Chars, MyString 
    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
    
    展开全文
  • 作用域不同,存放位置,声明方式不同 举例1 结果只显示工程级,模块级,模块级变量,过程级变量只能在过程里引用 举例2 新建模块2,复制以上代码,运行主程序过程,结果只显示工程级变量,说明模块级变量不...

    ** 标题过程级,模块级,工程级变量**

    1. 一张图说明具体的区别
      作用域不同,存放位置,声明的方式不同
      在这里插入图片描述

    2. 举例1
      在这里插入图片描述 结果只显示工程级,模块级,模块级变量,过程级变量只能在过程里引用

    3. 举例2
      新建模块2,复制以上代码,运行主程序过程,结果只显示工程级变量,说明模块级变量不可跨模块。

    4. 注意:过程级变量引用时,会默认上次的值,当作为判断条件时,应该在主程序里设置默认值
      工程级变量 a
      public a as boolean
      自己模块的一个函数cancelyesorno()函数用于判断是否取消座位 是为 true 否为false
      sub 主程序()
      a = false
      call cancelyesorno

      end sub
      因为每次都要判断 所以会记住上次运行的值 影响判断 可以在主程序里运行前先赋予false

    《EXCEL VBA 程序开发自学宝典(第三版) 》 罗刚军

    展开全文
  • 想整理下VBA变量的3个问题 变量的声明 变量的赋值 变量的默认值(如果没有赋值,那么默认值就是初值) 1 变量的作用域(生效范围) 1.1 变量的作用域 跨工作簿变量? 可以跨多个工作簿生效,有这样的变量吗?...

    目的:整理VBA变量相关的3个问题

    • 变量的声明  (变量的定义)----对比常量的定义
    • 变量的作用域(生效范围)
    • 变量的赋值 和 变量的默认值(如果没有赋值,那么默认值就是初值)

    0 要讲变量,先讲常量 常量定义用 const

    0.1 常量的定义

    • 常量英文 constant
    • 常量关键字 const
    • 常量定义的语句   
    • const a1 =1
    • const a2 as string = "hello"

    0.2 常量和变量的区别:声明时马上赋值

    • 常量必须定义的时候,马上赋值 ( 而变量不能这样)
    • 常量关键字 const  as 
    • 变量 关键字 dim   as (类似的还有  static private public)
    • dim 比较特殊,可以作为 模块级的声明,也可以作为过程级的声明

    0.3 常量可以定义在模块内或过程内

    如果时模块级,也可以用 public  private等关键字,声明作用域

    • 常量的声明可以在 模块的第一个sub 前,也可以在sub内

    比如

      Public Const a5 As String = "hello"

    0.4 常量的测试

    
      Const a1 = 1
      Const a2 As Integer = 2
    '   dim Const a3 As Integer = 3  '语法报错,常量定义 只用 const 和 dim是对应的!
      Dim a4 As Integer
      Public Const a5 As String = "hello"
     
      
      
    
    Sub testa101()
       Const b1 = 10
       
       Debug.Print "a1=" & a1
       Debug.Print "a2=" & a2
       Debug.Print "a5=" & a5
       Debug.Print "b1=" & b1
       
    End Sub

    1 变量的声明 (就是变量的定义)

    变量的声明就是变量的定义,先定义好变量,再使用是个好习惯

    1.1 先声明好变量类型

    • 初学时,可以先不管,不定义变量类型
    • 但要明白,dim a 这种没声明的,其实都时隐式声明为了 dim a as variant (通用型变量)
    • 初学之后,一定要先声明变量,加option explicit,不加这个遇到变量赋值问题不会报错。
    • 声明语句   dim  a  as integer
    • 特殊问题;   dim i , j as integer 只有j 是int ,而i 是 variant

    1.2 变量分类

    • 基本型变量:   integer string double float date
    1. Boolean
    2. Byte
    3. Integer
    4. Long
    5. Currency
    6. Single
    7. Double
    8. Date
    9. String 
    • 通用性变量:   variant ,默认就是通用变量,可以随时改变变量的类型
    • 数组变量:       dim arr1() as string
    • 对象变量:       如 dictionary  worksheet 等等,dim dict1 as object ,对象变量的赋值要用set

    1.3 变量定义时不指定类型,默认都是  variant 通用型变量,很灵活,但是也很费

    •  dim a1 
    • dim a1 as variant

    1.4 动态变量和静态变量,猜想英文原意?

    • dim 是 dynamic? 动态变量?
    • static 静态变量

    1.5 不能在声明的变量同时赋值。变量需要先声明,后赋值。

    Dim i As Integer   
    Dim j As Integer: j = 1     '错误代码,不能再模块最上面给变量赋值
    
    
    Sub test100()    
    Debug.Print i
    Debug.Print j
    
    i = i + 1
    j = j + 1
    
    
    Debug.Print i
    Debug.Print j
    
    End Sub
    

    1.5.1 特殊用法:相当于合并语句 (意义不大)

    • 只能在过程内,因为变量只能在过程内赋值!

    • 过程级变量,声明和赋值,可以用 :链家,相当于合并语句而已

    • 声明+ 赋值语法   dim  a  as integer :a=1
    • 声明后 赋值的标准语法 
    • dim  a  as integer
    • a=1
    Const k1 As Double = 3.1415926
    
    
    Sub test100()
    
    Dim i As Integer
    Dim j As Integer: j = 1
    Const k As Double = 3.1415926
    
    Debug.Print i
    Debug.Print j
    Debug.Print k
    Debug.Print k1
    
    i = i + 1
    j = j + 1
    
    
    Debug.Print i
    Debug.Print j
    
    End Sub
    

    2  变量初值与默认值

    2.1 变量的初值

    • 初值:是变量最初被赋予的值
    • 一般要求变量赋值后才可以表达式运算
    •  如python 会在表达式运算时,把变量  代换为 值,所以没赋值会报错!

    2.2 变量的默认值

    • 默认值:变量没被赋值时,默认的值(有的语言没有,会报错)
    • VBA看起来是给变量赋予了默认值。
    • 比如变量一般默认值为 “”

    2.3  不同类型的变量,其默认值不同

    赋值,初值,默认值(和类型有关)一般为0!

    • integer    默认值   0
    • string      默认值  ""     
    • long        默认值 0
    • double    默认值 0.0    
    • object     nothing           释放也时 set object = nothing
    • 等等

    2.4不同变量类型的默认值查询

    https://blog.csdn.net/hpdlzu80100/article/details/80664914

    2.5 为什么一般不能在声明变量时赋值呢?

    • 声明时不能给变量赋值。(变量,静态变量都会被初始化,但是而常量并不会被初始化)
    • 因为当过程开始运行时,所有的变量都会被初始化。
    • 一个数值变量会初始化成 0,变长字符串被初始化成零长度的字符串 (""),而定长字符串会被填满 ASCII 字符码 0 所表示的字符或是 Chr(0)。

    3 变量的作用域(生效范围)

    变量到底能再哪些地方生效,这个由2个因素决定

    1.  变量声明时,声明语句前面的关键字,比如 dim  private  public
    2. 变量声明时,所在的代码的层级。 特别是用  dim 这种灵活而模糊的

    3.1 全局级作用域:用 global / public 来声明在模块最前面!(实测不生效!!!)

    变量可以跨工作簿/ 工程:

    1. 可以跨多个工作簿生效,有这样的变量吗?据说有
    2. 不能加Option Private Module 用global 和 public
    3. 我实测了不行,但据说是适用一个 EXCEL文件下,有多个工程的情况,没见过,暂时我测试没有看到可以跨工程的变量。

    3.2 工程级作用域:用 global /public 来声明在模块最前面(过程外)

    变量可以在整个工程内生效,可以跨这个工程内的模块

    1. 用public 关键字在模块的第1个过程之前声明的变量 (public不能用在过程内)
    2. 可以在多个模块内都生效
    3. public 声明的变量,丢失有两种可能,一种是你关闭了excel文件,另一种是你重新编辑了代码,其他情况都会保留的

    特殊情况

    1. Option Private Module
    2. 加上这句话后,这个模块内的代码,只能再本工程内使用
    3. 并且,点开EXCEL的菜单宏,将看不见这些宏了。

     

    3.3 模块级作用域 :用dim / private 来声明在过程外

    1. 用private 或 dim 在模块的第1个过程之前声明的变量,这时候  private 或 dim 此时等价。
    2. 差别是,dim 很模糊,可以用在过程内/过程外,而private 必须声明在过程外。
    3. 也就是用private a  as string 声明的变量,是模块级变量,不能声明在过程里。
    4. 如果加了这句话 一定只是在模块内生效 !Option Private Module

    3.4 过程级变量:用dim / static 来声明在过程内部!

    • 用 static 或 dim 在过程内声明的变量,只在这个过程内生效。但是 static 和dim  声明的变量完全不同
    • 差别是,dim 很模糊,可以用在过程内/过程外,static 声明的变量,只能定义在过程内。
    • static a1 这样定义的变量,虽然一定是定义在过程内的,但是 static定义的变量在过程结束后并不会被释放,而是一直起作用到,过程所在的模块 重置 会重新启动。
    • static a1 静态变量的作用域,还是过程内。但是生命周期在 模块重置/重启 前都一直生效。

       

    3.5  变量定义时,VBA的特殊问题

    • 作用域语句,是整行生效
    • 但是  声明语句 dim as 语句不是,对单个变量生效
    • 当相同名称的变量,多次以不同的作用域声明时,出现作用域冲突。这种情况,VBA 会自动以就近原则使用变量,即优先使用最近定义的变量。也就是一般会先使用过程内部的,更近的

    • 比如
    • 例子1: dim i , j as integer 只有j 是int ,而i 是 variant
    • 例子2: Public a6, a7 As Integer ,这2个变量作用域都时public

    4 变量生命周期 (生命期不完全等同于范围)

    变量的生命周期 和 变量定义时的 作用域定义是 密切相关的,基本就是作用域外,就不再生效。

    比如

    • 全局级:excel 程序打开后都生效,除非EXCEL关闭,一直在内存里
    • 工程级:当前的EXCEL表,工程,没有关闭就一直生效。
    • 模块级:当前模块在运行就生效
    •              (反之,没运行 这个模块 就不生效)
    • 过程级,过程执行时才开始生效,给其分配内存空间,过程执行结束就从内存释放
    •                (反之,没运行 这个过程/函数 就不生效,想生效就得调用它! 这就是调用原因!)
    • 过程级的例外:static 在过程执行后还是生效,将保留其值,直到模块重置或重新启动   
    •                    Static]定义的是静态变量,这意味着在过程结束后这个变量所占有的内存不会被回收,数据也不会被破坏,下次再调用该过程的时候,数据就依然存在。

    5  过程得作用域 和 变量作用域

    5.1 过程和函数的 默认作用域  public

    • 比如过程和函数默认是 工程级作用域
    • 实测,在sub 前加 public 可以,不加默认也时 public
    • sub  相当于    public  sub                       "在workbook内有效
    • function  相当于    public  function          "在workbook内有效

    5.2 过程/函数 也可以用 private 来声明

    • 但是如果加 private 声明,就限制在只在模块内生效,无法被跨模块调用
    • 如果定义为 private sub testsub1()           "只在本模块内有效。

    5.3 实测,过程/函数 好像无法 全局作用域?

    • 实测,在sub 前加global 自动消失

    5.4 过程/函数  声明为static

    • 如果声明为静态
    • 静态过程  static  sub ,其内部所有变量都是  static 变量

    5.5  变量的最终作用域 (两层 作用域 共同作用的结果)

    • 过程/函数的作用域 和变量的作用域是两回事
    • 但是 过程的属性 部分情况下会影响变量的作用域,如static sub

    6  变量的调用

    6.1 搞清楚,为什么要调用变量? 调用变量就得先调用其他过程/函数?

    • 首先,过程级的变量是无法调用的,即使你调用那个过程。这可以认为是一种对过程级变量的的保护。
    • 一般的过程变量,都是过程,开始运行时才重新分配内存(重新初始化),过程结束就重置了,这也是一般变量都不允许在过程外赋值的原因。因为即时是一个 声明为 public 变量,在某个过程内的赋值,也只有运行这个过程时才生效。
    • 而想要调用这个 public变量,在其他过程中的值,就必须调用那个 给这个 public变量赋值的过程,这就是过程调用。并且,只有1个程序调用另外一个程序过程中,才可以读到其他 程序的变量的值。

    6.2 怎么调用? 调用变量的几个条件

    变量如果想在多个程序之间调用

    • 首先要声明为 非局部变量。
    • 需要调用变量所在过程/函数,才能调用其他过程内的变量 (变量的赋值都在过程内,虽然变量可以声明在过程外)

    6.3 调用常量

    和调用变量是一样的,见下面的例子


    6.4 变量的传递方式

    情况1:为了调用其他程序的变量,而调用其他程序

    本程序(主程序)调用其他程序(被调用程序)时,可以取到其他程序的参数

    变量的调用,需要声明为非局部变量,且需要调用变量所在的代码,

    情况2:为了给其他程序的主动传递变量,而调用其他程序,并获得回调

    本程序(主程序)调用其他程序(被调用程序)时,可以把参数传给其他程序,并取得回调。而并调用的程序,被调用时必须传参数给它,否则无法正确调用

    • 被调用的程序,可以设定2种传递方式,进而影响给主程序的回调值。
    • 也就是会不会受影响,不由 主程序 决定!?

    • byref ,被调用程序 按地址传递,传回主程序的参数,回调时会受影响。
    • VBA默认按地址传递,方便管理?

    • byval  ,被调用程序 按值传递,传回主程序的参数,回调时会不受改变。

    按地址传递(ByRef),是指主程序直接将数据交给子过程(过程中定义传递方式),在过程中修改、调试、返回给主程序,主程序输出的是修改后的值。

    例如:如果我在参数中设为ByRef,那么ByRef的这个变量我可以改变它的值

    按值传递(Byval),是指将主程序的值(副本一份)给子过程,过程对副本操作,主程序输出的仍是原值。若想输出值传递后的值,可在子过程中设置输出。

    6.5 还有其他各种调用

    • 参数,变量得调用
    • 过程/函数得调用
    • 模块得调用
    • 被调用结束前,是不会释放得. 也就是除非调用它们得 宿主程序释放,否则不会释放

    7 实例

    7.1 实例:   变量的成功调用(工程级作用域,跨模块调用)

    举例:模块1代码

    Public t1
    Public t2
    Global Const t3 As Integer = 777
    
    Sub bbtest1()
    Dim k1
    
    t1 = 100
    k1 = 1000
    
    End Sub
    
    
    Private Sub bbtest2()
    Dim k2
    
    t2 = 101
    k2 = 1001
    
    End Sub
    

    模块2代码

    • 要成功的调用需要满足2个条件
    1. 必须要先调用这个变量的过程/函数
    2. 这个变量,必须是非过程级的,模块级的/工程级的
    • 如果  private 声明了一个过程,则这个过程只能被模块内调用,不能被跨到 模块2调用,这里会报错
    Sub cctest1()
    
    Debug.Print "t1=" & t1
    Debug.Print "k1=" & k1
    
    End Sub
    
    
    
    Sub cctest2()
    
    Call bbtest1
    Debug.Print "t1=" & t1
    Debug.Print "k1=" & k1
    
    End Sub
    
    
    
    Sub cctest3()
    
    'Call bbtest2    '报错,因为bbtest2 是private 无法被其他模块的程序调用
    Debug.Print "t1=" & t2
    Debug.Print "k2=" & k2
    
    End Sub
    

    7.2 实例:   静态变量的成功调用

    静态变量  static

    • 静态变量,肯定都是过程级变量(局部变量),只能声明在过程内,函数内
    • 静态变量的特点,是只要静态变量所在的模块,工程没关闭,静态变量都不会释放
    • 不会释放是什么意思?也就是说 内存空间不会释放,变量不会被重置掉。
    • 而一般的过程变量,都是过程,开始运行时才重新分配内存(重新初始化),过程结束就重置了,这也是一般变量都不允许在过程外赋值的原因。因为即时是一个 声明为 public 变量,在某个过程内的赋值,也只有运行这个过程时才生效。
    • 而想要调用这个 public变量,在其他过程中的值,就必须调用那个 给这个 public变量赋值的过程,这就是过程调用。并且,只有1个程序调用另外一个程序过程中,才可以读到其他 程序的变量的值。
    • 被调用程序的声明周期,应该和主调程序生命周期一致。
    • 利用这个可以做啥?
    • 静态变量在程序已经不在它们的过程里时仍然不会丢失它们的内容
    • static一个典型的用法,就是可以用来做累计值,反复调用其他程序时,自身的static变量一直在累计。

    Private x
    Private j
    
    Sub Qtest1()
    
     Static sum1
    ' sum1 = 0    '不能加这句, 这相当于循环开始进行了归0,VBA里静态变量就是要利用不赋初值的特性
     Call Qtest2
     sum1 = sum1 + x
     Debug.Print "sum1=" & sum1
    End Sub
    
    Sub Qtest2()
     x = 5
    End Sub
    
    
    Sub Qtest10()
     Call Qtest20
     sum1 = sum1 + j + k    '这里的k,是用的本过程的,不是其他过程得k,也没有更高作用于的k
     Debug.Print "sum1=" & sum1
    End Sub
    
    
    Sub Qtest20()
     j = 5
     k = 5    'k是过程变量,是无法传出去的
    End Sub
    

     

    7.3 实例:   常量的成功调用

    • 常量基本和变量也是一样
    • 按常量的 声明关键字的,定义在过程内,还是模块外,用的 dim ,private 还是 public global
    Const x2 = "hi"
    
    
    Sub testnew1()
    Const x1 = "hello"
    End Sub
    
    
    Sub testnew2()
    Call testnew1
    Debug.Print "x1=" & x1
    Debug.Print "x2=" & x2
    End Sub
    

    展开全文
  • ExcelVBA 之Static 变量

    千次阅读 2020-06-03 17:23:12
    静态变量(static) 除了范围之外,变量还有存活期,...VB允许你通过改变声明方式延长当地变量的存活期。 用Static关键字声明变量是特殊的当地变量,静态变量在过程级别声明。和那些用关键字Dim声明的当地变量相反.

    静态变量(static)

     除了范围之外,变量还有存活期,变量的存活期决定了该变量能保存它的值有多久。一旦该工程打开,模块级别和工程级别的变量就会保留它们的值。然而,如果程序的逻辑需要,VB能够重新初始化这些变量。使用Dim语句声明的当地变量当过程结束时就会丢失值,当地变量的存活期是随着过程的运行的,并且它们在程序每次运行的时候可以被重新初始化。VB允许你通过改变声明方式延长当地变量的存活期。

    用Static关键字声明的变量是特殊的当地变量,静态变量在过程级别声明。和那些用关键字Dim声明的当地变量相反,静态变量在程序已经不在它们的过程里时仍然不会丢失它们的内容。例如,当一个带有静态变量的VBA过程调用另外一个过程时,在VB执行完被调用的过程语句后返回主调过程时,静态变量仍然保留它原来的值。过程CostOfPurchase示范静态变量allPurchase的使用:

    Sub CostOfPurchase()
             'declare variables
              Static allPurchase
              Dim newPurchase As String
              Dim purchCost As Single
              newPurchase = InputBox("Enter the cost of a purchase:")
              purchCost = CSng(newPurchase)
              allPurchase = allPurchase + purchCost
              'display results
              MsgBox "The cost of a new purchase is: " & newPurchase
              MsgBox "The running cost is: " & allPurchase
    End Sub
    

     上面的过程以一个名为allPurchase的静态变量和两个当地变量newPurchase和purchCost的声明开始。该过程中使用的InputBox函数显示一个对话框并且等着用户输入数值,一旦用户输入数值并且点击确定后,VB就会将该数值赋给变量newPurchase。因为InputBox函数的结果总是字符串,变量newOurchase被声明为字符串数据类型了。然而,你不能在数学计算中使用字符串,这就需要在下一指令中使用一个类型转换函数(CSng)来将字符串值转换为单精度浮点类型的数字。函数CSng只需要一个自变量——你要转换的数值。函数CSng转换的数字结果保存在变量purchCost上。

    技巧:类型转换函数
    在CSng上的任意地方按下F1,可以查看更多关于函数CSng的信息(也可以查看其它类型转换函数信息)下一行。

     

     

    展开全文
  • VBA全局变量

    万次阅读 2017-06-25 23:05:10
    VBA的全局变量在模块的开头定义,即可在整个工作簿使用,包括sheet、其它模块、userform等所有控件都可以调用。定义方法是在模块的开头输入... 注意一个VB工程可添加多个模块,但是在每个模块中声明的全局变量名不
  • vba中变量作用域

    2017-08-30 11:46:00
    参考:... 全局变量例子public 变量1 AS IntegerSub LLL()变量1 = 1111End Sub模块级变量例子DIM 变量1 AS IntegerSub LLL()变量1 = 1111End Sub 参考:http://ww...
  • VBA 静态变量 全局变量

    千次阅读 2019-05-21 17:30:39
    我的理解static跟dim是两种相对的赋值方式,动态变量程序结束后释放,静态变量workbook结束后释放 dim i1 as integer =1 static i2 as integer =1 声明全局变量可以在文档任何位置(For循环、If判断内除外)。...
  • 因为在Excel中VBA是默认隐藏且禁止运行宏的,所以首先介绍如何在Excel启用VBA,然后介绍基础的变量、常量与循环、判断语句
  • sub内的代码,声明周期也是过程级,应该不影响其他吧 Application.DisplayAlerts = False 这个声明的生命周期也应该在sub内,有啥必要非在sub结尾前关闭掉?多此一举把 那这么推论 如果变量,数组,字典只是...
  • Excel VBA基础语法——变量(三)

    万次阅读 2018-08-04 14:22:02
    任何语言(汉语、英语)都得遵守一定的规则,机器语言也不例外,Excel VBA编程语言也要遵守相关的语法规则,否则的话你编写的代码计算机是无法识别和执行的。... Excel 使用过程,往往会出现...
  • 了解VBA变量声明及赋值

    千次阅读 2019-03-06 00:21:31
    了解VBA变量声明及赋值
  • VBA中变量和常量的命名规则

    万次阅读 2012-05-07 18:07:59
    Variable Naming Conventions You can call your variables and user-defined functions anything you want, except where there is a clash ...with VBA keywords and function names. However, many programmer
  • sub内的代码,声明周期也是过程级,应该不影响其他吧 ...1变量声明范围(作用范围) 1.1 跨模块级变量(模块内,过程外) public 1.2 模块级变量(模块内,过程外) public dim private 1...
  • 第040篇:VBA之 Range 引用与变量

    千次阅读 2020-05-22 22:06:09
    End Sub 图示:底纹浅绿色的区域是Range("b2:d4"),相对于这块区域来说,b2就是九宫格中间的这个 (二)Range 使用变量 Sub Range使用变量() Dim a% a = 3 Range("a"&a).Select '字符与变量之间,要用连字符...
  • 虽然VBA允许,不对变量赋初值,不定义,直接开始使用。但确实不是什么好习惯 模块开头加上 option explicit 吧, 然后,先定义 x=0, y=1 等等 变量没有初值的情况,在第一次数值运算时 会被默认为0 ,x+1=1 ...
  • VBA-语法-变量和数组

    千次阅读 2019-08-20 10:31:19
    变量在使用之前必须定义 这样的好处就在于可以避免因为输入错误造成的变量错误 ========================================== 变量: Dim 变量名 As 数据类型 Dim sPara As sType Dim para1, para2, para3 Dim ...
  • Option Explicit #如果存在没有定义的变量,会出错,强制声明 Sub mathTest() Dim r1,s const Pi=3.1415 #值为常量,不能被修改 r1=Cells(4,3) s=Pi*r1*r1 Cells(4,4)=s End Sub
  • 关键字Privateshe用于声明模块/窗体级别的变量,而Dim适用于模块的局部变量声明 (以改变图形颜色的代码段作为测试手段) (1)关键字Dim声明局部变量: Sub Dim声明局部变量() Dim sld As Slide, shp As ...
  • VBA学习之变量声明

    2019-09-24 13:42:55
    1 声明整数型变量(Interger) Dim n As Interger Dim n% 储存:16位(2字节) 数值范围:[-32768,32768] 提示:32768=2^15,1Byte=8Bit(1位=8字节) 2 声明长型变量(Long) Dim n& 储存:32位(4字节) 数值...
  • VBA中变量赋值使用set和不使用set的区别
  • EXCEL VBA函数精选

    2015-10-04 16:02:42
    EXCEL VBA函数精选详细介绍了EXCEL的函数功能如何在VBA中使用。
  • 变量声明很简单,就是告诉计算机,这个变量是存放什么类型的数据,也可以理解为这个空瓶子里面装酱油还是白醋。我们详细的来聊一聊作用域。 作用域,可以理解为变量可以使用的范围吧,就是在哪里可以使用这个...
  • VBA入门--变量的基础内容和知识点

    千次阅读 2017-04-15 12:26:51
    Excel的代码主要是针对Excel的各个对象进行操作的,因此最基础的就是VBA的基本语法,基本语法主要包含:VBA的变量、常用运算和循环或分支结构。我理解的这三部分是最主要的。 所谓变量,顾名思义就是...¤变量声明¤ 在
  • VBA中的标识符,常量和变量

    千次阅读 2018-06-07 23:33:52
    数据保存在内存,需要使用某种方式引用它,就必须给这些内存一个名称,这就是标识符。定义标识符时应该遵循以下规则:1、以字符开头,包含字母、数字和下划线,不区分大小写。2、长度不能超过255个字符3、不能使用...
  • 变量声明在Excel VBA

    千次阅读 2014-08-05 10:59:37
    变量声明在Excel VBA 变量被用在所有的编程语言和命名的内存区域,你可以存储你的程序其执行所需的数据。创建一个变量,声明它,换句话说,你通知你打算使用一个给定名称的一个变量来存储一个给定的数据类型的...
  • Sub 属性() ...'VBA对象属性的赋值 Sub 属性赋值() Sheet2.Name = "效率" Sheet2.Range("a1") = "hello vba" End Sub Sub 选择方法() Range("a1:a10")...
  • 1连续声明多个变量的作用域,这样写没问题 Private a1, a2, a3, a4a, a50 Private s1, s2, s3 2 如果是,给多个变量赋值,千万别这样写 :n1 = n2 = n3 这样写,一个变量的赋值都不会对,全是错误的 Sub ...
  • 作者:看见星光微博:EXCELers / 知识星球:Excel哈罗,大家好,我是星光,今天给大家聊一下编程一个非常重要的概念——变量变量这个词有些朋友可能感到陌生,但其实就概念来说,无论在生活还是在学习上,变量...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,702
精华内容 1,080
关键字:

vba中变量的声明方式