精华内容
下载资源
问答
  • 想整理下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) 除了范围之外,变量还有存活期,变量的存活期决定了该变量能保存它的值有多久。...用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的信息(也可以查看其它类型转换函数信息)下一行。

     

     

    展开全文
  • 因为在Excel中VBA是默认隐藏且禁止运行宏的,所以首先介绍如何在Excel中启用VBA,然后介绍基础的变量、常量与循环、判断语句

    在Excel中启用VBA

    不同版本的Excel启用VBA的方式不同,以我工作中使用的Excel2007为例
    在Excel中启动宏
    首先,单击左上角菜单按钮,在单击弹出框中右下角的“Excel选项”
    信任中心
    选择左侧信任中心选项卡,再选择信任中心设置。随后在“宏设置”中选择“启用所有宏”
    启用所有宏
    随后返回Excel选项窗口,在常用选项卡中勾选“在功能区显示“开发工具”选项卡”开发工具显示
    我们就可以在Excel顶部看到VBA编程所要用到的选项卡啦
    完成

    变量的强制声明

    //声明变量
    Sub mysub()
    
    Dim a,b,c//为了防止发生歧义,应在生命变量后给变量赋初值.若未赋初值,则为默认值.此行代码中a,b,c为变体类型,默认初值为Empty
    
    Dim num As Integer//若声明的变量为Int类型,则默认初值为0
    
    Dim s As String//若声明的变量为String类型,则默认初值为空字符串,即"" 
    
    End Sub
    //VBA中即使不声明变量,也能直接使用,例如直接写
    r = 2
    

    但为减少程序错误,应使用

    变量的强制声明

    必须写在一个模块的第一行,即所有的Sub……End Sub之前

    Option Explicit//此时,若再使用未声明的变量,就会报错
    
    Sub subname()
    
    r = 2
    MsgBox r//程序运行至此处时报错,变量未声明
    
    End Sub
    
    

    需要注意的一点是,VBA是大小写不敏感的语言

    静态变量

    声明在Sub之外的模块级变量,不管是public还是private,都是静态变量

    Option Explicit
    
    Dim r//声明在此处,是静态变量
    
    Sub subname()
    
    r = r + 1//每次运行,r都会+1,停止运行程序r也不会归零
    
    End Sub
    
    

    静态变量值消失的情况

    1、将Excel关闭

    常量

    VBA中的常量使用关键字Const定义

    Sub mycon()
    
    Const r = 1
    r = 2//不应再次赋值,若再次赋值则程序报错
    
    MsgBox r
    
    End Sub
    

    常量在定以后不可改变

    循环语句

    FOR循环

    VBA中的FOR循环与JAVA、C#中的FOR循环逻辑相同,语法如下

    Option Explicit
    
    Sub myFor()
    Dim sum, i
    
    For i = 1 To 100 Step 1//代表i从1变化到100,每次变化量为1.如果不写Step n的话,默认为Setp 1
        sum = sum + i
    Next i//一次For循环结束后,进入下次循环,i的变化量为Setp后面的n值
    
    End Sub
    

    Do While循环

    当不知道我们的循环要循环多少次的时候,我们将会用到Do While循环

    Sub myDoWhile()
    
    Dim num, i
    
    i = 1
    num = 0
    
    Do While Cells(i, 1) <> ""//当Cells(i,1)不为零的时候,就一直循环
    
        num = num + 1
        
        i = i + 1//每次循环完,将i+1.如果不写,程序将会陷入死循环
        
    Loop//Do While循环以Loop结尾
    
    MsgBox num
    
    End Sub
    

    Do Until循环

    如果把Do While循环翻译成汉语,为

    当满足所写条件时执行

    那么Do Until则代表

    执行直到满足所写条件

    Sub myUntil()
    
    Dim r, sum
    r = 1
    
    Do Until r > 100//直到人>100时才停止执行
        
        sum = sum + r
        
        r = r + 1
        
    Loop
    
    MsgBox sum
    
    End Sub
    

    Do……Loop While循环

    将While放在Loop后面,则会是的程序先执行一遍Do的循环体,再去判断一下是否符合条件

    Sub myLoop()
    
    Dim r As Integer, sum As Integer
    r = 1
    
    Do//先执行一下sum=sum+1和r=r+1
        
        sum = sum + r
        
        r = r + 1
        
    Loop While r > 1//程序第一次执行到这里进行判断时,r=2,条件成立,所以继续执行
    
    //然后会不断循环,最后导致溢出报错
    MsgBox sum
    
    End Sub
    

    IF判断语句

    VBA中的IF判断语句与JAVA、C#中的IF判断大致相同,具体语法如下

    Option Explicit
    
    Sub myIf()
    
    Dim score, i
    score = 90
    
    If score>90 Then//记得每个IF条件后跟 Then,否则程序报错
        i = "优秀"
    ElseIf score>80 Then//ElseIf是连续的,中间不带空格
        i = "良好"
    ElseIf score > 60 Then
        i = "及格"
    Else
        i = "不及格"
    End If//,每个IF结束处跟EndIf.
    
    //若IF只有一次判断,则不用写EndIf,例如
    Dim i
    i = 2
    
    If i = 1 Then MsgBox i
    If i = 2 Then MsgBox i
    
    End Sub
    

    逻辑运算符

    三种逻辑运算符
    NOT 非,
    AND 与,
    OR 或

    逻辑运算符的优先级

    NOT>AND>OR

    而更常用的,我们用()去规定它们的判断顺序

    录制宏与字符串拼接

    录制宏按钮
    利用Excel中的录制宏功能,开始录制后我们的操作会被逐步转化为代码显示在VBE中

    Sub 删除一行()
    
    //这是我们进行删除一行操作 的录制宏
    
        Rows("21:21").Select
        Selection.Delete Shift:=xlUp
        
    End Sub
    

    而我们或许希望将这个删除行的操作运用到一个IF判断和FOR循环中,循环删除我们需要删除的行

    我们只需要对录制宏作出一定的改变,运用字符串拼接将固定行“21:21”改为可变化的行

    Sub 删除空行()
    //删除1-100行中第二列没有数据的行
    For  i = 100 To 1 Step -1//从第100行倒叙循环,所以Step为-1
    
    	If Cells(i,2) = "" Then
    	    Rows(i & ":" & i).Select//将“21:21”改为用&拼接的字符串,&前后都要有空格
    	    Selection.Delete Shift:=xlUp
        End If
        
    Next i
    
    End Sub
    

    需要特别注意,& 前后必须有空格,否则意思为将&之前的字符转化为long类型的数字

    展开全文
  • 利用VBA中的类型转换函数可以对不同类型的数值进行转换,从而实现不同类型变量相互赋值的目的。 VBA中的类型转换函数 在VBA中,有一系列的类型转换函数,该系列的函数以字母“C”开头,之后紧跟类型的缩写,即...

       

    目录

    VBA中的类型转换函数

    整数的类型转换

    字符的类型转换

    示例:

    数据类型的隐式转换

    示例:


    利用VBA中的类型转换函数可以对不同类型的数值进行转换,从而实现不同类型的变量相互赋值的目的。

    VBA中的类型转换函数

        在VBA中,有一系列的类型转换函数,该系列的函数以字母“C”开头,之后紧跟类型的缩写,即表示转换成该类型的函数,该类函数有且仅有一个参数。类型转换函数可以参考表。

      函  数

        说  明

    CBool

    转换为逻辑值。如果参数的值不为零,则CBool返回True:否则,返回False

    CByte

    转决为Byte类型。参数为O~255的数值或文本

    CDate

    转换为日期/时间类型。参数为任何有效的日期表达式

    CDbl

    转换成Double类型。参数范围与Double相同

    CDec

    转换成Decimal类型.参数范围与Decimal相同

    CInt

      转换成Integer类型。参数范围与Integer相同,小数部分四舍五入

    CLng

      转换成Long类型。参数范围与Long相同,小数部分四合五入

    CLngLng

      转换成LongLong类型。参数范围与LongLong相同(仅64位有效)

    CLngPtr

      转换成LongPtr类型。参数范围与LongPtr相同

    CSng

      转换成Single类型。参数范围与Single相同

    CStr

      转换成String类型

    CVar

      转换成Variant类犁。参数若为数值,则范围与Double相同;若不为数值,则范同与string相同

    整数的类型转换

        CInt与Clng可以将小数转换为整数,转换后的整数自动进行四舍五入,但是当小数部分是0.5时,这两个函数会将它转换为最接近的偶数值。例如,0.5转换为0,1.5转换为2。

    字符的类型转换

    CStr函数则可以根据参数的不同而转换成不同的值,具体可以参见表。

      参数类型

        返回值

    Boolean

    含有True或False的字符串

    Date

    含有系统中短日期格式日期的字符串

    Null

    —个运行时错误

    Empty

    一个零长度字符串(””)

    Error

    包含单词Error以及错误号的字符串

    其他数值

    含有数值的字符串

    示例:

    Sub 类型转换()
        '变量声明
        Dim strA As String
        Dim lngA As Long
        Dim dtA As Date
        
        '变量赋值
        dtA = #3/24/2021#
        
        '类型转换
        lngA = CLng(dtA)
        strA = CStr(dtA)
        
        '结果输出
        Debug.Print lngA
        Debug.Print strA
        
    End Sub
    

    数据类型的隐式转换

        在VBA中,允许数据类型的隐式转换,即由程序自行判断并进行类型转换。许多情况下,变量无须通过函数即可完成转换及赋值。如以下过程,VBA程序将完成数据类型转换并赋值给变量,可实现与本例相同的效果:

    示例:

    Sub 类型转换_隐式()
        '变量声明
        Dim strA As String
        Dim lngA As Long
        Dim dtA As Date
        
        '变量赋值
        dtA = #3/24/2021#
        
        '隐式的类型转换
        lngA = dtA
        strA = dtA
        
         '结果输出
        Debug.Print lngA
        Debug.Print strA
        
    End Sub

        这样的转换提供了开发者极大的便捷性,但也容易造成各种错误。通常,除非十分必要,否则不建议对不同类型的变量进行转换。所有的变量声明凡能够确定其数据类型的,应尽量避免采取变体型(Variant),也应避免隐式声明。
     

     

    展开全文
  • Excel VBA 基础部分 一、定义语句 '定义变量和分配存储空间 Dim [ WithEvents ] varname [ ( [ subscripts ] ) ] [ As [ New ] type ] . . . 部分 说明 withEvents 可选。该关键字指定varname是对象变量,...
  •  vba是编程语言,宏是用vba代码保存下来的程序。录制的宏是vba里最简单的程序,正因为如此,录制宏存在许多缺陷:如无法进行判断和循环,不能显示用户窗体,不能进行人机交互……  解决录制宏的这些问题,需要...
  • 变量声明在Excel VBA

    千次阅读 2014-08-05 10:59:37
    变量声明在Excel VBA 变量被用在所有的编程语言和命名的内存区域... “尺寸”(简称“维”),该关键字用于声明变量;因此,要声明你将使用一个名为“strDepartment”变量来保存字符串(文本)的数据,你会写上“点心strDep
  • Excel VBA String 数据类型

    千次阅读 2020-02-11 13:45:55
    Excel VBA String 数据类型 字符串有两种类型:可变长度字符串和固定长度字符串。 可变长度字符串最多可以包含大约 20 亿 (2^31) 个字符。 固定长度的字符串可以包含1到大约 64 K (2 ^ 16) 个字符。 ' 使用两个双...
  • Excel VBA基础语法——变量(三)

    万次阅读 2018-08-04 14:22:02
    任何语言(汉语、英语)都得遵守一定的规则,机器语言也不例外,Excel VBA编程语言也要遵守相关的语法规则,否则的话你编写的代码... VBA的数据类型(数据存储器数据存放类型)  Excel 使用过程中,往往会出现...
  • 声明变量类型后,变量所能赋得的值也就相应的收到了限制,具体如下所述:注:考虑到翻译起来费事费力而且怕翻译的不准确误导别人,所以保留英文原文,以备需要时查阅。声明类型(Declared Type) 取值范围(Data ...
  • 第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 '字符与变量之间,要用连字符...
  • 输入数据:声明(定义)数据,赋初值---声明变量的数据类型,赋初值等就是第一部分,定义和输入数据! 处理数据 输出数据(返回结果) 1.2 常量和变量严格声明 默认是不强制声明 在模块的开头写上 opti...
  • Excel VBA(07)数据类型和转换

    千次阅读 2020-04-29 12:27:28
    一、vba 数据类型 1、基本数据类型 整数类型:byte、integer、long、long long 小数类型:single、double 布尔类型:boolean 字符型:string 万能类型:variant 其他类型:date、object 2、...
  • VBA--声明变量类型的一个陷阱!

    千次阅读 2012-05-07 18:43:39
    Declaring Variable Type You can declare a variable’s type on a Dim statement, or related declaration statements such as Public. The following declares Sales to be a double precision floating-point ...
  • VBA中的数据类型转换

    千次阅读 2020-11-24 23:47:38
    VBA中的数据类型转换  在VBE中打开对象浏览器,按照下图操作: 找到VBA库并输入Conversion(转换)找到该模块,里面提供了数据转换函数。  VBA提供了两套内置的数据类型转换函数,第一组包含Int、 CVDate和Str,这是...
  • vba中布尔类型、字符串操作

    千次阅读 2017-10-08 15:09:00
    vba中,bool类型数据可以参与数学运算,true为-1,false为0 1 Sub mysub() 2 Dim mybool As Boolean 3 Debug.Print 4 Debug.Print 5 mybool = (3 > 4) Or (3 < 6) 6 Debug.Print mybool 7 ...
  • 1.几种不同的声明:公共变量:Public变量名As数据类型 私有变量:Private变量名As数据类型 静态变量:Static变量名As数据类型 Dim的声明是最常见的声明,包括以上三种,都是针对变量不同的作用域来选择如何声明...
  • Boolean 数据类型 Boolean 变量存储为 16 位(2 个字节)的数值形式,但只能是 True 或是 False。Boolean 变量的值显示为 True 或 False(在使用 Print 的时候),或者 #TRUE# 或 #FALSE#(在使用 Write # 的时候)...
  • VBA中的数据类型在定义程序中的变量或常量时,需要设定各变量或常量的数据类型。设定数据类型后,程序在运行时可以节省内存空间,优化运行性能。VBA的数据类型与其他编程语言的数据类型相似,甚至个别是相同的,详细...
  • VBA-语法-变量和数组

    千次阅读 2019-08-20 10:31:19
    加上Option Explicit 变量在使用之前必须定义 这样的好处就在于可以避免因为输入错误造成的变量错误 ...Dim 变量名 As 数据类型 Dim sPara As sType Dim para1, para2, para3 Dim para4 As workbook, para5 As St...
  • VBA入门--变量的基础内容和知识点

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

    千次阅读 2011-09-18 22:37:35
    Function 语句   声明 Function 过程的名称,参数以及构成其主体的代码。 语法 [Public | Private | Friend] [Static] Function name [(arglist)] [As type] [state
  • 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
  • 每天一篇原创Excel图文微信公众号:Excel星球NO.81-什么是变量?作者:看见星光微博:EXCELers / 知识星球:Excel哈罗,大家好,我是星光,今天给大家聊一下编程中一个非常重要的概念——变量变量这个词有些朋友...
  • VBA基础语法:变量

    2020-01-02 11:46:59
    声明变量 Visual Basic 的命名规则 使用 Public 语句 使用 Private 语句 使用 Static 语句 使用 Option Explicit 语句 为自动化声明一个对象变量 写赋值语句 声明常数 声明变量 通常会使用 Dim 语句来声明...
  • VBA·编译错误:ByRef参数类型不符』 编写人 | SCscHero 编写时间 | 2021/8/19 AM12:3 文章类型 | 系列 完成度 | 已完成 座右铭 每一个伟大的事业,都有一个微不足道的开始。 一、引言&...
  • 变量初始值与变量声明类型直接相关,再次说明了数据类型的重要性和基础性。变量声明类型(Declared Type) 初始值/默认值(Initial Data Value) Boolean FALSE Byte, Currency, Double, Integer, Long, LongLong 0 ...
  • 1 EXCEL可以用 百分数来直接运算,但是VBA里不允许 2VBA里无法用%这种数据类型来计算 VBA里没有 %百分数这种数据类型 ...4 声明数据类型得2中方法,语法不同 正确 dim a% 错误 dim a as % 错误 d...
  • VBA静态变量与常量

    千次阅读 2009-10-19 22:38:00
    VBA代码中包含变量、运算符和语句。变量在代码中起到互交与连接的作用。... 声明变量的关键词是Dim,其语法是 Dim [WithEvents] varname[([subscripts])] [As [New] type] [, [WithEvents] varname
  • 变量声明很简单,就是告诉计算机,这个变量是存放什么类型的数据,也可以理解为这个空瓶子里面装酱油还是白醋。我们详细的来聊一聊作用域。 作用域,可以理解为变量可以使用的范围吧,就是在哪里可以使用这个...

空空如也

空空如也

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

vba声明变量类型