精华内容
下载资源
问答
  • 一 数组 array 1.1 什么是数组? 抽象定义: 什么是数组:数组就是多个单位(element)有序的,连续存储在一起作为一个整体,统一叫1个名字(数组名) 如果已经是数组,那么... 数组函数定义的内容,arr1=array(1...

    一 数组 array

    1.1 什么是数组?具体的例子

    • 以这个语句为例子
    • arr1=array(1, 2, 3)
    • 左边:变量名=数组名

     

    • 右边:数组,集合,多个元素集合,多个数据集合,
    • 右边的单个内容,1,2,3 是数组的元素/下标变量
    • 每个元素存储时,会标记1个(看不见的 )index 索引 下标

     

    1.2 什么是数组,抽象的定义:数组也是变量,是一种可存储多个数据的特殊变量

    • VBA或其他语言里,变量是用来存储数据的。
    • 而一般来说,1个变量只能用来存储1个数据
    • 现在来了1个特例,有高手发明了数组的概念: 数组是一个特殊的变量,可以用来存储多个数据!(甚至是多维的多个数据!)
    • 数组就是多个单位/元素(element)有序的,连续存储在一起作为一个整体,统一叫1个名字(数组名)

     

    1.3 数组的特点,index有序不重复,但数组的元素却可以重复

    • 什么叫有序?
    • 就是数组的内容存储是有序的
    • index 是有序(一般是从小到大)
    • index也应该是连续的,暂时没见过 index不连续的情况
    • index也不能重复
    • 但是数组存储的内容,是可以重复的

     

    1. 数组的index下标默认是从0开始的,比如split生成的,还有未指定index下标的,如 dim arr1(5)
    2. 但是数组的index下标也有从1开始的情况,比如range 赋值的变量,默认下标从1开始,如 arr2=range("b1:d5")
    3. 数组的index下标受控制的情况模块最前面 option base  -1
    4. 数组index下标最好自己定义好, 如  dim arr3(1 to 5)
    • Dim arr1(3)                      '其实是0-3,有4个元素
    • Dim arr1( 1 to 3)              '其实是1-3,有3个元素
    • Option base 1     
    Sub test_array1()
    
    Dim arr1()
    Dim arr2()
    
    arr1() = Range("c1:c13")
    arr2() = Range("c1:o1")
    
    For i = 1 To 13
       Debug.Print arr1(i, 1)
    Next i
    
    
    For i = 1 To 13
       Debug.Print arr2(1, i)
    Next i
    
    End Sub
    

     

    1.4 数组的核心内容:就4个: 维数,每个维度大小,数据类型,数据

    举例:

    dim arr1(5)  as integer

    dim arr2(2 to 6) as string 

    dim arr3(3,5) as integer

    1. 数组的维数                : 数组可以是1维,2维等等,但数组的维数和嵌套不同!
    2. 每个维数大小           : 每个维数的 lbound()  to  ubound()
    3. 数组存储数据的类型: 可以是单一的,也可以是variant 变化的
    4. 数组存储的内容        : 每个值的具体内容

     

    2 数组的分类

    • 这些概念拿到前面说,是因为自己作为新手,发现很容易弄混概念,分不清什么静态数组,什么是界定清晰的数组?
    • 数组定义和 静态动态是相关的,
    • 数组赋值也是和这些概念相关的,比如,静态数组不能被整体赋值,动态数组赋值前,要先界定清晰 维数和大小等。

     

    2.1 什么叫完备(界定清晰)的数组,什么叫不完备的数组?---主要是指 数组的维数,维数大小(一般不管数组的数据类型)

     

    • 完备(界定清晰)数组:    数组的维数,每个维度长度都确定的数组。这样的数组可以给单一元素赋值操作,但如果是静态数组,数组不能被整体赋值。
    • 不完备(界定清晰)数组:数组的维数,每个维度长度不确定的数组,这样的数组可以整体赋值(变相确定数组维数和大小),但是没法单一元素赋值
    • 举例
    • dim arr1(5) as integer  这个就是一个界定清晰的数组!    dim arr1(5) as integer  等价于 dim arr1(0 to 5) as integer 
    • dim arr2()  等价于    dim arr2 () as  variant  这个其实就没有界定 数组的 维数,每个维数的大小是不清晰的。
    Sub try2()
    
    Dim arr1(5)
    Dim arr2()
    Dim arr3()
    ReDim arr4(2)
    
    
    arr1(0) = 1
    'arr1 = array(1, 2, 3, 4, 5)   '不能给数组赋值,是不能给静态数组整个赋值?
    'arr1() = Array(0, 1, 2, 3, 4, 5)
    Debug.Print Array(1, 2, 3, 4, 5)(0)
    
    
    arr2() = Array(1, 2, 3)
    
    'arr3(0) = 1   '数组使用前,必须先redim 界定清晰(并不就是静态数组, redim arr3(2)虽然是动态的,也是界定清晰的)才可以赋值和使用
    ReDim arr3(2)
    arr3(0) = 555
    Debug.Print arr3(0)
    
    arr3 = Array(10, 20, 30, 40, 50)   '动态数组可以被整体赋值
    Debug.Print arr3(1)
    
    End Sub

     

    2.2 什么叫静态数组,动态数组 ( VBA里没有static 和 dynamic关键字,不好判断) 

    • 数组何谓静态,动态?
    • 数组的4个关键要素:维数,维数大小,数据类型,数据。
    • 数据肯定可以改变,这是变量的基本特点。而数据类型,在数组定义时已经显式的声明,或者缺省为 variant了
    • 所以数组可以动态改变就是指:数组的维数和每个维数大小是否可以改变
    • 静态还是动态,和数组的变量类型无关
    • 静态还是动态,不是dim的一定是静态数组,dim arr1() 是动态数组
    • 静态 static      一般指 定义后不再可以修改的。在这里具体指  数组的维数,每个维数的大小不可改变
    • 动态 dynamic 一般指 定义后,在运行代码过程中还可以被改变的。在这里具体指  数组的维数,每个维数的大小可改变
    • 如果可以   dim arr1() as static  或 dim arr2() as dynamic 就很清晰,但VBA里不是这样

     

    • 但是VBA里不是这样----和数组的变量类型无关。
    • 静态数组:
    • dim arr1(4) 这样就是静态数组

     

    • 动态数组:
    • dim arr1()    这样就是动态数组,dim arr1() 和  redim arr1() 联动
    • redim arr2(3)  这样也可以动态定义,redim就是动态定义,不能redim  arr1(5)

    静态数组特点:

    • 静态数组不能再次dim,也不能redim
    • 静态数组不能在改变大小
    • 静态数组也不能被一个数组赋值(整体赋值)

    动态数组特点:

    • 动态数组,可以被整体赋值为一个数组。
    • 动态数组如果想对某一个值进行赋值或修改,需要先把维数和维数大小声明清楚后才可以。

     

     

    2.3 数组的数据类型:只是决定了,数组存储的数据的数据类型,和动态/静态无关

    数组的数据类型

    • integer
    • string 
    • variant  (默认缺省) 可以存储变量的数组,而因为变量本身可以存储各种类型,所以数组可以存储各种类型的数据。 但是占据空间大。

    定义数组的数据类型的差别

    • 如果定义为如下几种,所有元素都只能是这种类型的数据,否则会报错
    • 如果 dim arr1(3) as integer
    • 如果定义为 din  arr1() as variant 或 dim arr1() 缺省,都会默认为,可以存储变量的数组。

     

    2.4 什么叫1维数组,什么叫2维数组?

     

    • 数组的维数
    • 1维数组,arr1(i)
    • 2维数组,arr2(i,j)
    • 3维数组,arr3(i,j,k)

     

     

    • 维度这个概念,一般是空间的概念
    • 我理解数组的维数,肯定是多维坐标轴能表示的,虽然不一定和多维空间联系起来。
    • 我理解多和维度是 相乘的关系。
    • 比如具体到EXCEL的数据,1维是行,2维是行*列,3维是 行*列*sheet名,4维是   行*列*sheets* workbooks
    •  

    • 直接VBA定义的数组,少数特殊
    • array(1,2,3)    array() 只能生成1维数组
    • 而直接 dim arr1(i,j,k) 是3维数组,或更高维都可以。

     

    • 来自工作表的数组,最多只可能是2维数组,不可能是3维数组(少数特殊情况下是一维数组)
    • [{}] 这个类[a1:c10] 和 range("a1:c10")  其实就是类工作表的区域
    • [{1,2,3}] 是1维数组, [{1,2,3;4,5,6}] 是2维数组, [{1,2,3;4,5,6;7,8,9}] 并不是3维数组,而是2维数组
    • range("a1")  range("a1:a10")   range("a1:c10")  都是二维数组  虽然EXCEL也会行列首尾相连,视为一维数组,但是还是当二维数组来的准确
    • 用transpose 转化1列为1行,只是1维数组,而不是二维数组,这个很难记住。我觉得还是不用transpose 全当二维数组用来的准确

     

    Sub try4()
    
    
    a = [{1,2,3}]
    Debug.Print a(2)
    
    
    b = [{1,2,3;4,5,6}]
    Debug.Print b(1, 1)
    
    
    c = [{1,2;3,4;5,6}]
    Debug.Print c(3, 2)
    
    Debug.Print "数组区域如果是来自EXCEL的1行或1列,本质是2维数组,但EXCEL会把区域先行后列前后连接为1个1维数组,也可以看做1维度"
    Debug.Print Range("a1:a3")(3)
    Debug.Print Range("a1:a3")(3, 1)
    Debug.Print Range("a1:c1")(3)
    Debug.Print Range("a1:c1")(1, 3)
    
    Debug.Print "取的EXCEL表的区域,也可以自动前后组合为1个1维数组"
    Debug.Print Range("a1:c2")(5)
    Debug.Print Range("a1:c2")(2, 2)
    
    
    Debug.Print "单行但列也可以trasnpose"
    Debug.Print Range("a1:a3")(3)
    Debug.Print Range("a1:a3")(3, 1)
    Debug.Print Application.Transpose(Range("a1:a3"))(3)
    'Debug.Print Application.Transpose(Range("a1:a3"))(1, 3)  '工作表的1列组被transpose为1行,只被识别为1维数组,记不住!还不如不transpose 当二维数组用简单,真麻烦
    'd = Application.Transpose(Range("a1:a3"))
    'Debug.Print d(1, 3)
    'Debug.Print Application.Transpose(Range("a1:a3"))(1, 3)
    Debug.Print Application.Transpose(Application.Transpose(Range("a1:a3")))(3, 1)
    
    
    End Sub
    

     

    举例

    • 一维数组
    • dim arr1(1)               '并且index从0开始
    • array(1,2,3,4,5)       '并且index从0开始
    • [{1,2,3}]                    '因为来自工作表,所以index从1开始

     

    • 二维数组
    • range("a1")
    • range("a1:a10")
    • [{1,2,3,4,5;6,7,8,9,10}]
    • [{1,2,3;4,5,6;7,8,9;7,8,9;7,8,9;7,8,9;7,8,9;7,8,9;7,8,9}]
    • dim arr1(3,5)             '并且index从0开始             

     

    • 三维数组
    • dim arr1(5,6,3)          '并且index从0开始             

     

    2.4 什么叫嵌套数组

    • 数组作为其他数组的元素,叫嵌套数组,并不是多维数组
    • arr1=array(1,2,3)
    • arr2=array(arr1,1,2,3)

     

    3 数组的定义

    3.1  如何定义数组? 类定义变量

    • 定义变量
    • dim  a
    • 定义数组,需要带括号。
    • dim a() 
    • dim b(1,2)

     

    3.2 数组定义有哪些方式?

    • 只有3种方式
    • dim 
    • dim 配合 redim
    • redim 

     

    • 声明数组需要用到 dim 和redim 
    • 声明静态数组
    • dim arr1(5)   或 dim arr1(5,3) 

     

    • 声明动态数组
    • dim arr1()
    • redim   用于过程级 声明动态数组变量,配合  dim arr1() 使用

     

    3.3  dim的一定是静态数组,redim 一定是动态数组吗? NO,dim可以定义静态数组或动态数组

    • dim 可以定义静态/动态数组。
    • dim arr1()   数组只能dim 一次,否则就是重复dim定义数组了
    • redim 是动态定义, redim时,必须带上维数,长度等

     

    • 数组定义
    • dim 数组名()
    • dim arr1(4) 这样就是静态数组
    • dim arr1()    这样就是动态数组,dim arr1() 和  redim arr1() 联动

     

    • redim 其实算不上定义
    • 与 Dim 语句、Static 语句不同,ReDim 语句是一个可执行语句,由于这一语句,应用程序在运行时执行一个操作。
    • redim arr2(3)  
    • 注意,如果是 redim preserve 则只能修改数组的最后1维的大小,而且不能修改数组的维数!!
    • 只是redim 则很自由,随意

     

    Sub try6()
    
    
    Dim arr1()
    ReDim arr1(5)
    arr1(3) = 111
    
    
    ReDim Preserve arr1(6)
    Debug.Print arr1(3)
    
    ReDim Preserve arr1(10)     '因为1维数组只1维,用preserve 保持1维,随便改大小
    Debug.Print arr1(3)
    
    'ReDim Preserve arr1(2 To 12)     '因为1维数组只1维,用preserve 保持1维,但可以改变上界,扩大缩小都可以
    'Debug.Print arr1(3)
    
    
    ReDim Preserve arr1(0 To 9)     '也可以缩小
    Debug.Print arr1(3)
    
    'ReDim Preserve arr1(1 To 15)     '用preserve 不能改变index的下界限
    'Debug.Print arr1(3)
    
    
    ReDim Preserve arr1(0 To 2)     '因为1维数组只1维,用preserve 保持1维,但如果preserve 掉了老数据,则可能取不到 arr1(3)
    'Debug.Print arr1(3)             ' 这样取不到arr1(3)
    
    
    'ReDim Preserve arr1(5, 5)   ' 会提示下标越界,因为用了preserve关键字,则只能改变最后一维的大小,而不能改变维数
    'Debug.Print arr1(3, 1)
    
    
    ReDim arr1(5, 5)             '不用preserve 则 redim 随便改
    Debug.Print arr1(3, 1)
    
    
    
    End Sub

     

    3.4 数组定义的总结

    • 什么叫数组的定义? 定义什么?
    • 基础定义:就是把一个变量定义为数组
    • 完整定义,声明: 把1个变量定位为数组,并且声明数组的 维数,大小,数据类型!

     

    • 定义时可以完备,也可以不完备
    • 不完备的声明,把变量定义为数组,   如 dim arr1()  这种一般要和 redim arr1 配合使用
    • 比较完备的声明:把变量定义为数组的同时,也定义数组的维数,维数的大小,数组的数值类型     dim arr1(5)  as interger  或 redim  arr2(2) 


    例子

    Sub try1()
    
    Dim arr1()
    Dim arr2(1 To 3)
    ReDim arr3(1, 5)
    
    
    ReDim arr1(2)
    arr1(0) = 1
    arr2(1) = 55
    arr3(1, 1) = 666
    a = arr1
    c = arr1()
    ReDim arr1(5)
    'ReDim c(6)        '变量a,b.c.d等只是指向数组,本身还是个变量,并不是数组
    
    b = arr3
    d = arr3()
    ReDim arr3(2, 6)
    'ReDim b(2, 6)    '变量a,b.c.d等只是指向数组,本身还是个变量,并不是数组
    
    
    Debug.Print arr1(0)
    Debug.Print arr2(1)
    Debug.Print arr3(1, 1)
    
    Debug.Print a(0)
    Debug.Print b(1, 1)
    Debug.Print c(0)
    Debug.Print d(1, 1)
          
    c = "abc"        '变量a,b.c.d还是变量,还可以改变其指向的内容
    Debug.Print c
    
    
    End Sub
    


     

    3.5 不同的数组,index的 下界 lbound() 默认值不同,VBA的数组一般默认是0,来自EXCEL表的默认为1

    不同的数组

    • 数组函数定义的内容,arr1= array(1,2,5)
    • 数组可以是excel的range() 单位赋值而成的 变量/对象,如 arr1=range("a1:c10")
    • 比如这样也是数组 arr1=[{1,2,3}]
    • MS 出了一个 sequence() 函数,暂时还没用过

     

    VBA的数组定义

    • 用VBA的一维数组函数array() 或者 dim  或者 redim 这几种方法,默认index从0开始
    • 当然 dim  或者 redim 可以声明从1开始或从其他开始
    • 比如 dim arr2(1 to 3) 或 option base 2 等等

    来源于工作表的数组定义

    • 而从工作表区域赋来的数组,无论是1维还是2维,index都从1开始
    • [{}] 这种赋值方式,我认为是偏工作表的,所以index也从1开始
    • 因为 [a1:b5] 就等同于 range("a1;b5")
    • 一般情况下,存储相同类型的多个数据  dim arr1 as variant
    • 也可以存储不同类型的多个数据
    Option Explicit
    
    Sub testArr1()
    'Dim arr1() As Integer  '这样定义数组是不够的,只定义了是数组,没定义维数和大小,可以试试这样会在赋值时报错
    Dim arr1(3) As Integer  '定义为integer了,默认至少是0,而不是空
    Dim i
    
    arr1(0) = 0
    arr1(1) = 1
    arr1(2) = 2
    'arr1(3) = "abc"  '这样会报类型不匹配
    
    For i = LBound(arr1, 1) To UBound(arr1, 1)
       Debug.Print arr1(i)
    Next
    
    End Sub
    
    
    Sub testArr2()
    
    '静态数组,静态在维数不变,长度不变,具体的某个内容可以变化
    'Dim arr2 As Variant '错误写法
    Dim arr2(2) As Variant   '定义了一个静态数组,且为存储为变量类型
    Dim i
    
    arr2(0) = 1
    arr2(1) = "a"
    
    For i = LBound(arr2, 1) To UBound(arr2, 1)
       Debug.Print arr2(i)
    Next
    End Sub

     

     

     

    4 把数组赋值给其他变量  (变量只是指向数组,但变量不是数组!)

    • 直接给变量赋值一个数组,相当于把变量定义为了数组,比如    dim arr1()   然后  a=arr1() ,也有 b=array(1,2,3)
    • 随便 a=arr1()
    • 变量指向了数组,可以用 a(1)  指向arr1(1) 
    • 但是a 仍然是变量,不是数组,所以不能redim a 
    • 所以我现在这种写法里,虽然没有声明 option explicit ,如果声明了 option explicit 就必须先定义  dim a  或 dim a as variant ,也就是a 是变量,而不是数组。只是数组也可以赋值给变量a
    • 每个变量的类型是,定义时声明的,赋值不改变数据类型,只能改变变量里存储的内容。

     

     

    5  给数组赋值

    • 静态数组
    • 可以给静态数组的单个元素赋值改变,但不能给静态数组整体赋值
    • 动态数组
    • 可以给动态数组的单元元素改变赋值,也可以整体改变赋值
    • 但给动态数组单个元素赋值时,需要先声明数组的维数和大小,否则报错
    Sub try2()
    
    Dim arr1(5)
    Dim arr2()
    Dim arr3()
    ReDim arr4(2)
    
    
    arr1(0) = 1
    'arr1 = array(1, 2, 3, 4, 5)   '不能给数组赋值,是不能给静态数组赋值?
    
    
    arr2() = array(1, 2, 3)
    
    'arr3(0) = 1   '数组使用前,必须先redim 界定清晰(并不就是静态数组, redim arr3(2)虽然是动态的,也是界定清晰的)才可以赋值和使用
    ReDim arr3(2)
    arr3(0) = 1
    
    
    End Sub

     

     

    二 数组的使用(老文档!)

    2.1 数组使用前,必须先定义维数和大小

    特别是动态数组,使用前必须先redim() 数组大小后才可以使用

    • 静态数组因为事先声明过了,所以可直接使用
    • 变量可以不事先定义,也可以不赋初值,不同类型的变量,默认初值不同
    • 数组必须实现声明大小后才可以使用,包括运算,或者赋值
    Sub test4()
    Dim arr1()
    
    
    ReDim arr1(11)  '不redim会报错
    j = 1   'j=1也不会出错,但是arr1(0)会为空,不会被赋值
    For i = 1 To 11 Step 1
    If Not IsEmpty(Cells(i, 1)) Then
     arr1(j) = Cells(i, 1)
     j = j + 1
    End If
    Next i
    
    
    For j = 0 To UBound(arr1())
    Cells(j + 1, 9) = arr1(j)  '单元格得从1开始,arr()得从0开始
    Next j
    
    
    End Sub
    

     

    2.2 数组的赋值  与  数组项的赋值

    静态数组的数组名不能被(整体)赋值,只有 数组的元素,变量,对象可以被赋值

    • 变量,对象,本身是可变的,可以被赋值为数组,也可以赋值为其他内容,其他数组,可以被整体赋值
    • 动态数组,也可以整体赋值,甚至改变维数
    • 静态数组,只能赋值改变其1个元素,不能被整体赋值改变为其他内容
    Sub test001()
    
    
    Dim arr1(3)               '如果已经声明为数组名了,arr1就代表arr1(),以后就不能给数组赋值
    Dim arr2  As Variant      '相当于dim arr2
    Dim arr3 As Object
    
    
    'arr1 = Range("a1:c1")     '不能给数组整体赋值? 只能给数组里的元素赋值?arr1 = Range("a1:c1").value 也不行
    arr1(0) = Range("a1")      '可以给数组的某个元素赋值
    arr2 = Range("a1:c1")      '可以给变量赋值,赋予这个变量整个数组
    Set arr3 = Range("a1:c3")  '可以把EXCEL的range 赋值给变量,或对象。然后默认都成为了2维数组。
    Range("b2:c2") = 9999
    
    
    Debug.Print "arr1(0)=" & arr1(0)
    Debug.Print "arr2(1,1)=" & arr2(1, 1)
    Debug.Print "arr3(1,1)=" & arr3(1, 1)
    
    
    End Sub

     

    Sub test1002()
    
    Dim arr1(10)
    Dim arr2()
    Dim arr3
    
    '如果先定义为静态数组
    arr1(0) = "a"    '注意如果写成arr1(0)=a ,赋值内容其实为空,因为变量是a,未赋值。
    arr1(1) = 1001
    
    For Each i In arr1
        Debug.Print i & " ";
    Next
    Debug.Print
    
    'arr1 = Range("a1:a11")  '不能给数组赋值,其实就是不能整体赋值
    For Each i In arr1
        Debug.Print i & " ";
    Next
    Debug.Print
    
    '如果先定义为动态数组,也很灵活
    arr2 = Range("a1:a5")
    For Each i In arr2
        Debug.Print i & " ";
    Next
    Debug.Print
    
    arr2 = Range("b1:b7")
    For Each i In arr2
        Debug.Print i & " ";
    Next
    Debug.Print
    
    
    '变量是很灵活的
    arr3 = Range("a1:a3")
    For Each i In arr3
        Debug.Print i & " ";
    Next
    Debug.Print
    
    arr3 = Range("b1:b5")    'arr3是变量,可以改变维度,大小都行
    For Each i In arr3
        Debug.Print i & " ";
    Next
    Debug.Print
    
    
    
    End Sub
    

     

    3  数组的范围

    3.1 数组的index 下限和上限 :LBound(arr)  和 UBound(arr) ,数组的维数从1开始 lbound(arr1,1 ) 或  lbound(arr) 默认都是第1维

    • 没有第0维得概念,
    • 不要和index可能从0开始搞混!

      

    • 1维下限   lbound(arr,1)   lbound(arr) 

    • 2维下限   lbound(arr,2)

    • 3维下限   lbound(arr,3)

    Sub 测试1()
    Dim arr1 As Variant
    arr1 = Range("a1:c4")    
    Debug.Print arr1(3, 3)
    Debug.Print LBound(arr1)
    Debug.Print UBound(arr1)
    Debug.Print LBound(arr1, 2)  '二维数组,第1维默认是行数,往下数!
    Debug.Print UBound(arr1, 2)  '二维数组, array(row,column)
    
    
    Sub 测试2()
    Dim arr2()
    arr2 = Range("a1:c4")
    Debug.Print arr2(3, 3)
    Debug.Print LBound(arr2)
    Debug.Print UBound(arr2)
    Debug.Print LBound(arr2, 2)
    Debug.Print UBound(arr2, 2)
    End Sub
    
    Sub 测试3()
    Dim arr2()
    arr2() = Range("a1:c4")
    Debug.Print arr2(3, 3)
    Debug.Print LBound(arr2)
    Debug.Print UBound(arr2)
    Debug.Print LBound(arr2, 2)
    Debug.Print UBound(arr2, 2)
    End Sub
    End Sub
    

     

    4 静态数组

    4.1 静态数组定义等

    • 静态数组定义的语法:
    • dim arr1(10) as string  ,index是从0开始,包含11个元素
    • dim arr2(5 to 10) as string
    Sub t3()
    
    Dim arr(10) As String
    
    For i = 1 To 10 Step 1
    arr(i) = i
    Debug.Print (arr(i))
    Next i
    
    Debug.Print arr(5)
    Debug.Print arr(0)   '不显示下标越界
    Debug.Print arr(11)  '会显示下标越界
    
    
    End Sub

    4.2静态数组是不能redim的

    Sub t3()
    
    Dim arr5(1 To 5) As Integer
    ReDim arr5(1 To 10) As String   '不能对静态数组redim改变大小
    
    
    End Sub

     

    5 动态数组

     5.1 动态数组定义 

    1. dim arr1()  或 dim arr3()  as string 
    2. 不定义,直接赋值,比如arr1=range()   或 set arr1=range()
    • 数组重定义:redim
    • 只能重定义动态数组! 也必须重定义大小! 不redim前无法使用
    • redim时,下标可以是变量
    Sub t3()
    
    Dim arr3() As Integer  '如果定义dim arr3 as integer 会成为一个变量
    Dim arr4() As Integer
    
    For i = 1 To 5 Step 1
       ReDim arr3(1 To i)  '使用数组的内容之前,必须先redim 否则会显示下标越界
       ReDim arr4(1 To i)
        arr3(i) = i
        arr4(i) = i
        Debug.Print (arr3(i))
        Debug.Print (arr4(i))
    
    Next i
    
    
    End Sub

     

    5.2 只有动态数组才能,也必须redim,静态数组不要redim

    • 静态数组就不要再redim
    • 动态数据就一定需要redim
    Sub t4()
    
    Dim arr2()
    Rem Dim arr2(5, 6)  '使用动态数组 redim就不要和 静态数组定义格式混用
    
    For i = 0 To 5 Step 1
    For j = 0 To 6 Step 1
    
    ReDim arr2(0 To i, 0 To j)  '动态数组,必须在使用前redim '如果要用静态数组也可以,但不要再redim了!
    
    
    arr2(i, j) = i + j
    Debug.Print arr2(i, j)
    
    
    Next j
    Next i
    

     

    5.3 如果数组赋值时指向EXCEL对象,是二维数组,不能这么使用arr(1),而是arr(i,j)

    • 指向excel对象,比如range() 的 默认为2维数组,因为EXCEL表本身就是二维数组!
    • 二维数组的下标,需要用excel里的r1c1模式
    • 因为是二维数组,不能这么使用,即使只是1行或者1列数,但仍然是二维数据结构!
    • arr1()=range("a1:e1")  虽然看起来只是a1 b1 c1 d1 e1 这5个数,但由于是在excel表里的对象,是二维的 
    Sub t3()
    
    Rem Dim arr6 As Integer
    arr6 = Range("a1:a5")
    Debug.Print arr6(1, 1)
    Debug.Print arr6(2, 1)
    Debug.Print arr6(3, 1)
    Debug.Print arr6(4, 1)
    Debug.Print arr6(5, 1)
    
    
    End Sub
    

     

    6 二维数组

    • dim arr1(4,5) as string
    • dim arr1 (0 to 4,0 to 5) as intege
    Sub t4()
    
    Dim arr1(0 To 4, 0 To 5) As Integer
    
    arr1(0, 0) = 999
    Debug.Print arr1(0, 0)
    
    
    End Sub
    

     

    7  定义三维数组

    定义静态3维数组

    Sub t4()
    
    Dim arr3(3, 4, 5)
    
    arr3(0, 0, 0) = 888
    Debug.Print arr3(0, 0, 0)
    
    
    
    End Sub
    

    定义动态3维数组

    
    Sub test1001()
    
    Dim arr1()
    m = 1
    
    
    For i = 1 To 3
        For j = 1 To 3
            For k = 1 To 3
                ReDim arr1(i, j, k)
                arr1(i, j, k) = m
                Debug.Print "arr1(i, j, k)=" & arr1(i, j, k)
                m = m + 1
            Next
        Next
    Next
    

     


     

    展开全文
  • vba常用函数详细介绍及示例

    千次阅读 2020-07-17 10:53:08
    Abs 函数 返回将传递给指定数字的绝对值的相同类型的值。 语法 Abs(数字) 必需的_number_ 参数可以是任何有效的数值表达式。 如果 number 包含 Null,则返回 Null;如果它是未初始化的变量,则返回 0。 数字的...

    Abs 函数

    返回将传递给指定数字的绝对值的相同类型的值。

    语法

    Abs(数字)

    必需的_number_ 参数可以是任何有效的数值表达式。 如果 number 包含 Null,则返回 Null;如果它是未初始化的变量,则返回 0。

    数字的绝对值是其无符号大小。 例如, ABS(-1)和ABS(1)都返回。 1

    示例

    此示例使用 Abs 函数计算数字的绝对值。

    Dim MyNumber
    MyNumber = Abs(50.3)    ' Returns 50.3.
    MyNumber = Abs(-50.3)    ' Returns 50.3.

    Int、Fix 函数

    返回数字的整数部分。

    语法

    Int(数字)

    必需的_number_参数是Double或任何有效的数值表达式。 如果_number_包含null, 则返回null 。

    示例

    此示例演示 Int 和 Fix 函数如何返回数字的整数部分。 如果为负数参数,则 Int 函数将返回小于或等于该数的第一个负整数; Fix 函数返回大于或等于该数的第一个负整数。

    Dim MyNumber
    MyNumber = Int(99.8)    ' Returns 99.
    MyNumber = Fix(99.2)    ' Returns 99.
     
    MyNumber = Int(-99.8)    ' Returns -100.
    MyNumber = Fix(-99.8)    ' Returns -99.
     
    MyNumber = Int(-99.2)    ' Returns -100.
    MyNumber = Fix(-99.2)    ' Returns -99.

    Rnd 函数

    返回一个包含伪随机数字的Single 。

    语法

    Rnd[(数字)]

    可选的_Number_ 参数是一个单个或任何有效的数值表达式。

    返回值

    返回值

    如果_Number_为

     Rnd 生成

    小于 0

    使用_number_作为种子时, 每次使用相同的数字。

    大于 0

    伪随机序列中的下一个号码。

    等于 0

    最近生成的数字。

    未提供

    伪随机序列中的下一个号码。

    备注

    Rnd 函数返回一个小于 1 但大于或等于 0 的值。

    _Number_的值决定了Rnd生成为随机数字的方式:

    对于任何给定的原始种子,由于对 Rnd 函数的每个后续调用会将之前的数字用作序列中的下一个数字的种子,因此,将生成相同的数字序列。

    在调用 Rnd 之前,请使用不带参数的 Randomize 语句来通过基于系统计时器的种子初始化随机数字生成器。

    若要生成给定范围中的随机整数,使用此公式:

    Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
     

    此处,upperbound 是范围中的最大数字,_lowerbound_是范围中的最小数字。

    示例

    此示例使用 Rnd 函数生成一个介于 1 和 6 之间的随机整数值。

    Dim MyValue As Integer
    MyValue = Int((6 * Rnd) + 1)    ' Generate random value between 1 and 6.

    Date 函数

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

    语法

    Date

    示例

    此示例使用 Date 函数返回当前系统日期。

    Dim MyDate
    MyDate = Date    ' MyDate contains the current system date.

    DateAdd 函数

    返回一个 Variant (Date) 值,其中包含已添加了指定时间间隔的日期。

    语法

    DateAdd(interval, number, date)

    DateAdd 函数语法包含以下命名参数:

    语法

    Part

    说明

    interval

    必需。 作为要添加的时间间隔的字符串表达式。

    number

    必需。 作为要添加的时间间隔数的数值表达式。 它可以为正(获取将来日期)或为负(获取过去的日期)。

    date

    必需。 Variant (Date) 或文本,表示添加间隔的日期。

    示例

    此示例采用一个日期并使用 DateAdd 函数显示指定月数后的对应日期。

    Dim FirstDate As Date ' Declare variables.

    Dim IntervalType As String
    Dim Number As Integer
    Dim Msg As String
    IntervalType = "m"    ' "m" specifies months as interval.
    FirstDate = InputBox("Enter a date")
    Number = InputBox("Enter number of months to add")
    Msg = "New date: " & DateAdd(IntervalType, Number, FirstDate)
    MsgBox Msg

    DateDiff 函数

    返回一个 Variant (Long),指定两个指定的日期之间的时间间隔数。

    语法

    DateDiff(interval, date1, date2, [ firstdayofweek, [ firstweekofyear ]] )

    DateDiff 函数语法包括这些命名参数:

    语法

    Part

    说明

    interval

    必需。 表示用于计算 date1 和 date2 之间差异的时间间隔的字符串表达式。

    date1、date2

    必需;Variant (Date)。 要在计算中使用的两个日期。

    firstdayofweek

    可选。 一个指定一周的第一天的常量。 如果未指定,则会假定为星期日。

    firstweekofyear

    可选。 一个指定一年的第一周的常量。 如果未指定,则会假定 1 月 1 日出现的那一周为第一周。

    示例

    此示例使用 DateDiff 函数显示给定日期与今天之间的天数。

    Dim TheDate As Date    ' Declare variables.
    Dim Msg
    TheDate = InputBox("Enter a date")
    Msg = "Days from today: " & DateDiff("d", Now, TheDate)
    MsgBox Msg

    Dir 函数

    返回一个 String,它表示与指定模式或文件属性或驱动器的卷标匹配的文件、目录或文件夹的名称。

    语法

    Dir [ (pathname, [ attributes ] ) ]

    Dir 函数语法具有以下部分:

    语法

    Part

    说明

    pathname

    可选。 指定文件名的字符串表达式,可包括目录或文件夹和驱动器。 如果未找到 pathname,则返回零长度字符串 ("")。

    attributes

    可选。 其和指定文件属性的常量或数值表达式。 如果省略它,则返回与 pathname 匹配但没有属性的文件。

    注解

    在 Microsoft Windows 中,Dir 支持使用多字符 (*) 和单字符 (?) 通配符来指定多个文件。 在 Macintosh 上,这些字符被视为有效文件名称字符,且不能用作指定多个文件的通配符。

    因为 Macintosh 不支持通配符,请使用文件类型来标识文件组。 可以使用 MacID 函数指定文件类型而不是使用文件名。 例如,以下语句返回当前文件夹中的第一个 TEXT 文件的名称:

    Dir("SomePath", MacID("TEXT"))

    若要循环访问文件夹中的所有文件,请指定一个空字符串:

    Dir("")

    示例

    将d:\data下面的excel文件的数据合并到一个excel工作簿中

    Dim s as string

    Dim I as integer

    Dim w as workbook

     

    S=dir(“d:”\data\*.xls*”) //dir查询所有满足条件的文件名称

    For I =1 to 100

    Set w =workbooks.open(d:”\data\” & str)

    w.sheets(1).copy after:=thisworkbook.sheets(thisworkbook.sheets.count)

    thisworkbook.sheets(thisworkbook.sheets.count).name=split(w.name,’.’)(0)

    wb.close

    if s=”” then //如果s等于空,说明已执行完了最后一个文件,退出循环。如果不退出会报错。

    exit for

    end if

    next

    InStr 函数

    返回一个 **Variant **(Long) 值,指定一个字符串在另一个字符串中首次出现的位置。

    语法

    InStr([ start ], string1, string2, [ compare ])

    InStr 函数语法有以下参数:

    语法

    Part

    说明

    start

    可选。 设置每次搜索的起始位置的数字表达式。 如果忽略,则搜索从第一个字符位置开始。 如果 start 包含 Null,则出现错误。 如果指定了 compare,则 start 参数是必需的。

    string1

    必需。 要搜索的字符串表达式。

    string2

    必需。 搜索到的字符串表达式。

    compare

    可选。 指定字符串比较的类型。 如果 compare 为 Null,则将发生错误。 如果省略 compare,则 Option Compare 设置将决定比较的类型。 指定有效的 LCID (LocaleID) 以在比较中使用区域设置特定规则。

    示例

    本示例使用 InStr 函数来返回某字符串在其他字符串中首次出现的位置。

    Dim SearchString, SearchChar, MyPos
    SearchString ="XXpXXpXXPXXP"    ' String to search in.
    SearchChar = "P"    ' Search for "P".
     
    ' A textual comparison starting at position 4. Returns 6.
    MyPos = Instr(4, SearchString, SearchChar, 1)    
     
    ' A binary comparison starting at position 1. Returns 9.
    MyPos = Instr(1, SearchString, SearchChar, 0)
     
    ' Comparison is binary by default (last argument is omitted).
    MyPos = Instr(SearchString, SearchChar)    ' Returns 9.
     
    MyPos = Instr(1, SearchString, "W")    ' Returns 0.

    IsNumeric 函数

    返回指示表达式是否可评估为数值的“Boolean”**** 值。

    语法

    IsNumeric(表达式)

    必需的_expression_ 参数是一个包含数值表达式或字符串表达式的Variant 。

    示例

    此示例使用“IsNumeric”**** 函数确定变量是否可评估为数值。

    Dim MyVar, MyCheck
    MyVar = "53"    ' Assign value.
    MyCheck = IsNumeric(MyVar)    ' Returns True.
     
    MyVar = "459.95"    ' Assign value.
    MyCheck = IsNumeric(MyVar)    ' Returns True.
     
    MyVar = "45 Help"    ' Assign value.
    MyCheck = IsNumeric(MyVar)    ' Returns False.

    Join 函数

    返回通过连接数组中包含的大量子字符串创建的字符串。

    语法

    联接(sourcearray, [定界符])

    Join 函数语法包含以下命名参数:

    语法

    sourcearray

    必需。 一维度组,包含要连接的子字符串。

    分隔符

    可选。 用于分隔返回字符串中子字符串的字符串。 如果省略,将使用空格 ("")。 如果 delimiter 是一个零长度字符串 (""),将连接列表中的所有项,而不使用分隔符。

    LBound 函数

    返回一个 Long 型值,其中包含指示的数组维度的最小可用下标。

    语法

    LBound(arrayname, [ dimension ])

    LBound 函数的语法包含以下部分:

    语法

    Part

    说明

    arrayname

    必需。 数组变量的名称;遵循标准变量命名约定。

    维度

    可选;Variant (Long)。 指示返回哪个维度的下限的整数。 1 表示第一个维度,2 表示第二个维度,依此类推。 如果省略 dimension,则假定为 1。

    备注

    LBound函数与**UBound** 函数结合使用, 以确定数组的大小。 使用 UBound 函数可查找数组维度的上限。

    LBound 对具有以下维度的数组返回下表中的值:

    备注

    语句

    返回值

    LBound(A, 1)

    1

    LBound(A, 2)

    0

    LBound(A, 3)

    -3

    任何维度的默认下限均为0或 1, 具体取决于**Option Base** 语句的设置。 使用**array** 函数创建的数组的底数为零;它不受Option Base的影响。

    使用Dim、 Private、 Public、 ReDimStatic语句中的To子句设置维度的数组可以有任何整数值作为下限。

    示例

    此示例使用 LBound 函数确定指示的数组维度的最小可用下标。 使用 Option Base 语句可覆盖默认基准数组下标值 0。

    Dim Lower
    Dim MyArray(1 To 10, 5 To 15, 10 To 20)     ' Declare array variables.
    Dim AnyArray(10)
    Lower = Lbound(MyArray, 1)     ' Returns 1.
    Lower = Lbound(MyArray, 3)    ' Returns 10.
    Lower = Lbound(AnyArray)    ' Returns 0 or 1, depending on
        ' setting of Option Base.

    UBound 函数

    返回包含指定的数组维度的最大可用下标的Long数据类型。

    语法

    UBound(arrayname, [ dimension ])

    UBound函数的语法包含这些部分。

    语法

    Part

    说明

    arrayname

    必需。 数组变量的名称;遵循标准变量命名约定。

    维度

    可选;Variant (Long)。 指示返回哪一个维度的上限的整数。 对第一个维度使用 1,对第二个维度使用 2,依此类推。 如果省略 dimension,则假定为 1。

    备注

    UBound函数与**LBound** 函数结合使用, 以确定数组的大小。 使用 LBound 函数可查明数组维度的下限。

    UBound 为具有这些维度的数组返回以下值:

    示例

    此示例使用 UBound 函数确定数组的指定维度的最大可用下标。

    Dim AnyString, MyStr
    AnyString = "Hello World"    ' Define string.
    MyStr = Left(AnyString, 1)   ' Returns "H".
    MyStr = Left(AnyString, 7)   ' Returns "Hello W".
    MyStr = Left(AnyString, 20)  ' Returns "Hello World".

     

    Left 函数

    返回一个包含字符串左侧指定字符数的 Variant (String)。

    语法

    Left(string, length)

    Left 函数语法包括这些命名参数:

    语法

    Part

    说明

    string

    必需。 从中返回最左侧字符的字符串表达式。 如果_字符串_包含 Null,则返回 Null

    Length

    必需;Variant (Long)。 数值表达式指示要返回多少字符。 如果为 0,则返回零长度字符串 ("")。 如果大于或等于“字符串” __ 中的字符数量,则返回整个字符串。

    示例

    此示例使用 Left 函数返回字符串左侧指定的字符数。

    Dim MyString, FirstWord, LastWord, MidWords
    MyString = "Mid Function Demo"    ' Create text string.
    FirstWord = Mid(MyString, 1, 3)    ' Returns "Mid".
    LastWord = Mid(MyString, 14, 4)    ' Returns "Demo".
    MidWords = Mid(MyString, 5)    ' Returns "Function Demo".
     

    Mid 函数

    返回一个 Variant (String),其中包含字符串中的指定数量的字符。

    语法

    Mid(string, start, [ length ])

    Mid 函数语法包含以下命名参数:

    语法

    Part

    说明

    string

    必需。 从中返回字符的字符串表达式。 如果_字符串_包含 Null,则返回 Null

    start

    必需,Long。 _字符串_中被视为开始部分的字符位置。 如果 start 大于_字符串_中的字符数,则 Mid 返回零长度字符串 ("")。

    Length

    可选;Variant (Long)。 要返回的字符的数目。 如果省略此部分或此部分中的数目少于文本中的 length 字符数(包括 start 处的字符),则将返回从 start 位置到字符串末尾的所有字符。

    示例

    使用 Mid 函数返回字符串中的指定数目的字符。

    Dim Upper
    Dim MyArray(1 To 10, 5 To 15, 10 To 20)    ' Declare array variables.
    Dim AnyArray(10)
    Upper = UBound(MyArray, 1)    ' Returns 10.
    Upper = UBound(MyArray, 3)    ' Returns 20.
    Upper = UBound(AnyArray)      ' Returns 10.
     

    Right 函数

    返回了从字符串的右边开始包含特定数目的字符的“变量”****(“字符串”****)。

    语法

    (string, length)

    Right函数语法具有以下命名参数。

    语法

    Part

    说明

    string

    必需。 字符串表达式,从中返回最右边的字符。 如果_字符串_包含 Null,则返回 Null

    Length

    必需;Variant (Long)。 数值表达式指示要返回多少字符。 如果为 0,则返回零长度字符串 ("")。 如果大于或等于“字符串” __ 中的字符数量,则返回整个字符串。

    示例

    此示例使用了“权限”**** 函数已返回从字符串右边开始的字符的指定数量。

    Dim AnyString, MyStr
    AnyString = "Hello World"      ' Define string.
    MyStr = Right(AnyString, 1)    ' Returns "d".
    MyStr = Right(AnyString, 6)    ' Returns " World".
    MyStr = Right(AnyString, 20)   ' Returns "Hello World".

    MsgBox 函数

    在对话框中显示消息,等待用户单击按钮,并返回一个整数,指示用户单击的哪个按钮。

    语法

    MsgBox (prompt, [ buttons, ] [ title, ] [ helpfile, context ])

    MsgBox 函数语法具有以下命名参数:

    语法

    部分

    说明

    prompt

    必需项。 字符串表达式在对话框中显示为消息。 prompt 的最大长度约为 1024 个字符,具体取决于所使用的字符的宽度。 如果 prompt 包含两行以上,则可以在每行之间使用回车符 (Chr(13))、换行符 (Chr(10)) 或回车换行符组合 (Chr(13) & Chr(10)) 将其分隔。

    buttons

    可选。 数值表达式,用于指定要显示按钮的数量和类型、要使用的图标样式、默认按钮的标识和消息框的形式的值之和。 如果省略,则 buttons 的默认值为 0。

    title

    可选。 对话框标题栏中显示的字符串表达式。 如果省略 title,则标题栏中将显示应用程序名称。

    helpfile

    可选。 用于标识帮助文件的字符串表达式,前者用于为对话框提供上下文相关的帮助。 如果提供 helpfile,则也必须提供 context。

    context

    可选。 帮助上下文数值的数值表达式,该数值由帮助作者为相应的帮助主题分配。 如果提供 context,则也必须提供 helpfile。

    示例

    此示例使用 MsgBox 函数,在具有“”和“”按钮的对话框中显示严重错误消息。 指定的默认响应为选择“”按钮。 MsgBox 函数返回的值取决于用户选择的按钮。 此示例假定 DEMO.HLP 为帮助文件,该文件包含帮助上下文数值等于 1000 的主题。

    Dim Msg, Style, Title, Help, Ctxt, Response, MyString
    Msg = "Do you want to continue ?"    ' Define message.
    Style = vbYesNo + vbCritical + vbDefaultButton2    ' Define buttons.
    Title = "MsgBox Demonstration"    ' Define title.
    Help = "DEMO.HLP"    ' Define Help file.
    Ctxt = 1000    ' Define topic context. 
            ' Display message.
    Response = MsgBox(Msg, Style, Title, Help, Ctxt)
    If Response = vbYes Then    ' User chose Yes.
        MyString = "Yes"    ' Perform some action.
    Else    ' User chose No.
        MyString = "No"    ' Perform some action.
    End If

     

    Split 函数

    返回包含指定数目的子字符串的从零开始的一维数组。

    语法

    Split(expression,[定界符,[ limit,[ compare ]]]

    TimeSerial 函数语法具有以下命名参数:

    语法

    Part

    说明

    expression

    必需。 包含子字符串和分隔符的字符串表达式。 如果 expression 是零长度字符串 (""),则 Split 返回空数组,即不包括任何元素和数据的数组。

    分隔符

    可选。 用于标识子字符串限制的 String 字符。 如果省略,则假定空格符 (" ") 为分隔符。 如果 delimiter 是零长度字符串,则返回包含完整 expression 字符串的只含单一元素的数组。

    可选。 要返回的子字符串的数目;-1 表示返回所有子字符串。

    compare

    可选。 指示计算子字符串时使用的比较类型的数值。 请参阅“设置”部分以了解各个值。

    示例

    本示例演示如何使用Split函数。

    Dim Msg, Style, Title, Help, Ctxt, Response, MyString
    Msg = "Do you want to continue ?"    ' Define message.
    Style = vbYesNo + vbCritical + vbDefaultButton2    ' Define buttons.
    Title = "MsgBox Demonstration"    ' Define title.
    Help = "DEMO.HLP"    ' Define Help file.
    Ctxt = 1000    ' Define topic context. 
            ' Display message.
    Response = MsgBox(Msg, Style, Title, Help, Ctxt)
    If Response = vbYes Then    ' User chose Yes.
        MyString = "Yes"    ' Perform some action.
    Else    ' User chose No.
        MyString = "No"    ' Perform some action.
    End If

     

    每天学一点,薪资翻一番。

    在公众号“学会数据分析”中回复wps可获取带vba版和其他高级版本的免费破解版wps

    之后后会整理更全面的函数分享到公众号中

    展开全文
  • 关于 Erase() 函数1.1 作用1.2 语法1.3 说明1.4 示例1.4.1 示例一1.4.2 示例二 1. 关于 Erase() 函数 1.1 作用 重新初始化大小固定的数组的元素,以及释放动态数组的存储空间。它的行为取决于数组的类型(见 1.3 ...

    在这里插入图片描述



    1. 关于 Erase() 函数


    1.1 作用

    重新初始化大小固定的数组的元素,以及释放动态数组的存储空间。它的行为取决于数组的类型(见 1.3 )。



    1.2 语法

    Erase arraylist
    

    所需的 arraylist 参数是一个或多个用逗号隔开的需要清除的数组变量。



    1.3 说明

    展开全文
  • VBA JOIN函数详解

    万次阅读 2019-02-03 05:52:17
    VBA SPLIT函数详解 SPLIT函数实现了字符串拆分,相应的逆运算可以使用JOIN函数,其语法格式如下。 Join(sourcearray[, delimiter]) 参数 含义 sourcearray 必选参数,包含被连接子字符串的一维数组 ...

    上一篇博客讲解了SPLIT函数的用法,大家可以移步这里。

    VBA SPLIT函数详解

    SPLIT函数实现了字符串拆分,相应的逆运算可以使用JOIN函数,其语法格式如下。

    Join(sourcearray[, delimiter])
    
    参数含义
    sourcearray必选参数,包含被连接子字符串的一维数组
    delimiter可选参数,在返回字符串中用于分隔子字符串的字符

    参数delimiterSPLIT函数中该参数的用法相同,省略时使用空格做为分隔符。

    如下的示例代码实现了将字符串数组arrString组合为一个字符串。

    Sub JoinDemo1()
        Dim arrString
        Dim strString As String
        arrString = Array("Good", "good", "study,", "day", "day", "up")
        strString = VBA.Join(arrString)
        Debug.Print strString
    End Sub
    

    输出结果如下。

    Good good study, day day up

    有时需要在字符串的两端都使用分隔符,即

    |Good|good|study|day|day|up|

    示例代码如下:

    Sub JoinDemo3()
        Dim arrString
        Dim strString As String
        arrString = Array("Good", "good", "study,", "day", "day", "up")
        strString = "|" & VBA.Join(arrString, "|") & "|"
        Debug.Print strString
    End Sub
    

    其实代码可以进行简化,JoinDemo3过程中第5行代码不需要那么复杂。代码可以简化如下。

    Sub JoinDemo4()
        Dim arrString
        Dim strString As String
        arrString = Array("", "Good", "good", "study,", "day", "day", "up", "")
        strString = VBA.Join(arrString, "|")
        Debug.Print strString
    End Sub
    

    其中的技巧在于,第4行代码中,在数组中第一个和最后一个元素增加了空字符,第5行代码组合字符串时,就可以实现字符串两段添加分隔符的效果。


    参考文章
    《VBA SPLIT函数详解》

    展开全文
  • 最近在学习VBA,循环中经常会用到UBound()来判定数组的最大下标,就查了下用法,以作记录 LBound 函数: 返回一个 Long 型数据,其值为指定数组维可用的最小下标。 >>语法 LBound(arrayname[, dimension]) ...
  • 一 数组 array 1.1 数据定义 静态数组:长度不变的数组 动态数组:长度不定的数组,需要redim 数组 arr() 必须先声明后才可以使用! 1.2数组的index下标 (1)数组的index下标应该是从...
  • UBound 函数 返回一个 Long 型数据,其值为指定的数组维可用的最大下标。 语法 UBound(arrayname[, dimension]) UBound 函数的语法包含下面部分: 部分 描述 arrayname 必需的。数组变量的名称,遵循...
  • VBA:处理字符串的各种函数

    千次阅读 2020-01-12 17:07:19
    InStr 函数 InStr 函数示例 Left 函数 Left 函数示例 LTrim、RTrim与 Trim 函数 LTrim,RTrim,及 Trim 函数示例 Mid 函数 Mid 函数示例 Right 函数 Right 函数示例 Option Compare 语句示例 Asc 函数 ...
  • Excel VBA数组使用方法

    2019-07-11 17:33:44
    利用LBound函数与UBound 函数函数可以分别来获得数组的最小与最大下标,其语法是: LBound(arrayname[, dimension]) UBound(arrayname[, dimension]) 语法包含下面部分: 部分 描述 arrayname 必需的。数组变量...
  • 学习任何东西,往往坚持到最后,才能学到“干货”。试想,如果新手两三下就能学会的东西就能在现实中排上大用场,那老手... arr1 = Array(1, 12, 4, 5, 19) MsgBox "1, 12, 4, 5, 19最大值" &amp...
  • 1 filter() 函数的局限性 filter() 非精确查找,是模糊查询,类似于 like 的功能 Filter函数可以区分" " 即1个空格,但不能区分""空值或空白。--为什么,因为filter的原理类 if like Sub test110() 'Filter函数...
  • VBA定义函数计算 x + y如果用宏,要把(把返回值写到哪个单元格里的)代码写到宏里面。VBA函数就不用Function MyAddTwoNumber(x As Double, y As Double) Dim z z = x + y MyAddTwoNumber = z End Function...
  • VBA数组

    千次阅读 2018-12-08 22:18:32
    一系列值存储在单个变量中时,则称为数组变量。 一、一维数组 数组声明 Method 1 : Using Dim Dim arr1() 'Without Size ...'Method 2 : Mentioning the Size ...'Method 3 : using 'Array' Parameter Dim ...
  • vba rnd 介绍 VBA Rnd()函数通常用于生成“随机”数字。 当然,您无法使用任何编程算法生成真正的随机数。 但是某些伪随机数生成器算法要比其他算法好。 本文讨论了为什么本机PRNG不好的原因,以及在真正需要...
  • vba中的查找匹配函数

    万次阅读 2015-09-29 10:42:52
    最朴树的find例子:Range("G4") = Range("B:B").Find(Range("G3")).Row解释: Range(“B:B”)表示要查找的...Row返回查找到的位置的行数工作表函数Match例子Range("A1") = application.WorksheetFunction.Match(Ran
  • '带有一个参数的函数 Function CAL(a) As Double Select Case a Case Is > 100: CAL = 100 Case 55 To 100 CAL = 55 Case Else CAL = 0 End Select End Function '带1个参数写1个,带2个写2个,多个的话...
  • '自定义函数,将数组中的元素连接起来(可以每个元素两边分别加字符) 'By Gao Dawei,2020-10-09 Function ArrayJoin(ByVal arr As Variant, Optional element_plugin_left As String = "", _ Optional element_...
  • 在代码中用format函数取现在的时间,VBA 的 Format 函数与工作表函数 TEXT 用法基本相同,但功能更加强大,许多格式只能用于VBA 的 Format 函数,而不能用于工作表函数 TEXT 。 Format(Now, "yyyymmddhhmm") 把...
  • VBA Array Operation

    2019-05-07 20:49:00
    兰色幻想VBA数组入门教程10集1. 前言:不要把VBA数组想的太神秘,它其实就是一组数字而已。2. 数组的维数:Sub 数组示例() Dim x As Long, y As Long Dim arr(1 To 10, 1 To 3) '创建一个可以容下10行3列的数组空间 ...
  • VBA基础打卡

    2017-11-13 23:19:30
    vba
  • 这个计数需求是可以用countif函数直接处理,但是同时说公式太长了,容易乱,于是想了想,用vba自定义一个函数解决,主要思路是通过instr依次查找单元格内字符串中是否有①、②、③,然后相加起来是否大于1,如果是则...
  • 1.今天用dir函数做了一个自动将文件归档的程序,我们一起来看看效果,首先,文件夹里面的文件名称如下图所示,我们可以看到所有的文件名(除我们写VBA代码的表格)都符合2020.xx.xx.xlsx的格式 2.我们要做的是将...
  • UDF.dll包含了一组实用的用户自定义函数,提供了数组处理的快速方法,可以在VB6、VBS、32位VBA中调用。 看完如下的实例代码,就明白它的用处了。 Private MyUDF As New UDF.ArrayConversion Sub 是否包含某元素...
  • VBA解析JSON数据(1)-- Split函数

    万次阅读 2019-02-16 07:20:48
    但是既然JSON数据本质是一个字符串,VBA中丰富的字符串处理函数应该也可以胜任解析JSON这个工作。下面就以上面的JSON数据为例,演示如何在VBA中进行解析。 Sub JSON_Split() Dim Res(100, 1 To 2) Dim objRegEx ...
  • VBA只能动态修改数组 最后 一维的大小 Sub text() Dim arr(), i As Integer, j As Integer Dim brr i = Sheet2.Range("k65536").End(xlUp).Row brr = Sheet2.Range("a1:k" & i)  For i...
  • 1.将 互换 Excel 列号(数字/字母) ...Public Function excelColumn_numLetter_interchange(numOrLetter) As String Dim i, j, idx As Integer Dim letterArray letterArray = Array("A", "B", "C", "D", "E...
  • 声明一个动态数组 Dim arrays() As String 'z字符串型数组...Function display_array(arrays) Dim result As String result = "" Dim array_len As Integer array_len = UBound(arrays) + 1 For i = 0 To array_len ...
  • vba 数组 数组参数

    千次阅读 2019-08-10 18:00:37
    关于赋值 我看了很多本书都没有看到...a = array(1,2,3,4) '这里a后面的()可以给也可以不给 c=a() end sub sub a(paramarray a() as variant) 'paramarray 可以用byref替代 end sub '灵活性强,各种写法...
  • VBA Split()函数

    千次阅读 2018-02-13 14:57:00
    Split()函数返回一个数组,其中包含基于分隔符分割的特定数量的值。 语法 Split(expression[,delimiter[,count[,compare]]]) 参数说明 Expression - 必需的参数。可以包含带分隔符的字符串的字符串表达式...

空空如也

空空如也

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

array函数vba