Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2509|回复: 6

[已解决]数组声明类问题?

[复制链接]
发表于 2013-1-19 16:02 | 显示全部楼层 |阅读模式
本帖最后由 happytiger2012 于 2013-1-19 16:07 编辑

Sub sz1()
    'arr不能声明类型
    Dim arr()
    arr = Array(1, 2, 3, 4, 5)
    Stop
End Sub

Sub sz2()
    Dim str As String
    Dim arr '不能加括号
    str = "a-b-c-d-e"
    arr = VBA.Split(str, "-")
    Debug.Print arr(2)
End Sub
哪位大虾能给我解释一下,为什么sz1这个过程声明数组的时候arr要加括号但不能声明数据类型?sz2这个过程声明arr的时候不能加括号?搞不明白!

最佳答案
2013-1-19 17:04
个人认为有用帮助是:“想要将一个数组赋值给另一个数组,确定在左侧的是大小可以调节的数组,且类型匹配。 ”
意思是,当发生数组给数组时,必须同时满足:
条件1:左侧的是可变数组
条件2:两边的数组,类型匹配


在sz1()中,并非不能声明类型。
而是声明了不匹配的类型。
Dim arr() As Integer    '例如赋值号左边是Integer,右边是Variant,两边类型不匹配。故提示“类型不匹配”。
Dim arr() As Variant    '赋值号左边是Variant,右边是Variant,两边类型匹配,所以可以。


在sz2()中,并非不能加括号。
而是加了括号就是数组变量名,就是数组给数组赋值,就需同时满足2个条件。
Dim arr()    '赋值号左边是Variant,右边是string,两边类型不匹配,所以不行。故提示“类型不匹配”。
Dim arr() As String    '赋值号左边是string,右边是string,两边类型匹配,所以可以。
Dim arr '赋值号左边是variant 变量。见下图的帮助解释。

QQ截图未命名3.jpg


发表于 2013-1-19 16:18 | 显示全部楼层
    Dim arr1
    Dim arr2()
    '没加括号没法按变量动态来赋值,
    '这就是数组变量arr1,arr2()有括号没括号区别
    '若在arr1中好加了括号则就可以使用redim继续赋值
回复

使用道具 举报

发表于 2013-1-19 16:20 | 显示全部楼层
声明数组
   

数组的声明方式和其它的变量是一样的,它可以使用 Dim、Static、Private 或 Public 语句来声明。标量变量(非数组)与数组变量的不同在于通常必须指定数组的大小。若数组的大小被指定的话,则它是个固定大小数组。若程序运行时数组的大小可以被改变,则它是个动态数组。

数组是否从 0 或 1 索引是根据 Option Base 语句的设置。如果 Option Base 没有指定为 1,则数组索引从零开始。

声明固定大小的数组
下面这行代码声明了一个固定大小的数组,它是个 11 行乘以 11 列的 Integer 数组:

Dim MyArray(10, 10) As Integer

第一个参数代表的是行;而第二个参数代表的是列。

与其它变量的声明一样,除非指定一个数据类型给数组,否则声明数组中元素的数据类型为 Variant。数组中每个数组的数字型 Variant 元素占用 16 个字节。每个字符串型 Variant 元素占用 22 个字节。为了尽可能使写的代码简洁明了,则要明确声明的数组为某一种数据类型而非 Variant。下面的这几行代码比较了几个不同数组的大小:

' 整型数组使用 22 个字节(11 元素* 2 字节)
ReDim MyIntegerArray(10) As Integer

' 双精度数组使用 88 个字节(11 元素 * 8 字节)。
ReDim MyDoubleArray(10) As Double

' 变体型数组至少使用 176 字节(11 元素 * 16 字节)。
ReDim MyVariantArray(10)

' 整型数组使用 100 * 100 * 2 字节(20,000 字节)。
ReDim MyIntegerArray (99, 99) As Integer

' 双精度数组使用 100 * 100 * 8 字节(80,000 字节)。
ReDim MyDoubleArray (99, 99) As Double

' 变体型数组至少使用 160,000 字节(100 * 100 * 16 字节)。
ReDim MyVariantArray(99, 99)

数组变量的最大值,是以的操作系统与有多少可用内存为基础。若使用的数组大小超过了系统中可用内存总数的话,则速度会变慢,因为必须从磁盘中读写回数据。

声明动态数组
若声明为动态数组,则可以在执行代码时去改变数组大小。可以利用 Static、Dim、Private 或 Public 语句来声明数组,并使括号内为为空,如下示例所示。

Dim sngArray() As Single

注意 可以在过程中使用 ReDim 语句来做隐含性的数组声明。当使用 ReDim 语句时要小心点,不要拼错数组的名称。否则即使在模块中有包含 Option Explicit 语句,仍然会因此而生成第二个数组。

对于过程中的数组范围,可以使用 ReDim 语句去改变它的维数,去定义元素的数目以及每个维数的底层绑定。每当需要时,可以使用 ReDim 语句去更改动态数组。然而当做这个动作时,数组中存在的值会丢失。若要保存数组中原先的值,则可以使用 ReDim Preserve 语句来扩充数组。例如,下列的语句将 varArray 数组扩充了10 个元素,而原本数组中的当前值并没有消失掉。

ReDim Preserve varArray(UBound(varArray) + 10)

注意 当对动态数组使用 Preserve 关键字时,只可以改变最后维数的上层绑定,而不能改变维数的数目。
回复

使用道具 举报

发表于 2013-1-19 16:27 | 显示全部楼层
声明变量带()是动态数组。
声明变量没有指定类型是可变类型。

回复

使用道具 举报

发表于 2013-1-19 16:30 | 显示全部楼层
  1. Sub sz1()
  2. 'arr不能声明类型
  3.     Dim arr() As String
  4.     Dim arr2(1 To 4) As String
  5.     Dim arr3
  6.     Dim i
  7.     For i = LBound(arr2) To UBound(arr2)
  8.         arr2(i) = i
  9.     Next

  10.     arr3 = Array(1, 2, 3, 4, 5)
  11.     arr = arr2
  12.     Stop
  13. End Sub
复制代码
指定类型后,只要类型一致才能赋值。
回复

使用道具 举报

发表于 2013-1-19 16:31 | 显示全部楼层
暂停后,你可以看看arr3,arr的类型就明白了。
回复

使用道具 举报

发表于 2013-1-19 17:04 | 显示全部楼层    本楼为最佳答案   
个人认为有用帮助是:“想要将一个数组赋值给另一个数组,确定在左侧的是大小可以调节的数组,且类型匹配。 ”
意思是,当发生数组给数组时,必须同时满足:
条件1:左侧的是可变数组
条件2:两边的数组,类型匹配


在sz1()中,并非不能声明类型。
而是声明了不匹配的类型。
Dim arr() As Integer    '例如赋值号左边是Integer,右边是Variant,两边类型不匹配。故提示“类型不匹配”。
Dim arr() As Variant    '赋值号左边是Variant,右边是Variant,两边类型匹配,所以可以。


在sz2()中,并非不能加括号。
而是加了括号就是数组变量名,就是数组给数组赋值,就需同时满足2个条件。
Dim arr()    '赋值号左边是Variant,右边是string,两边类型不匹配,所以不行。故提示“类型不匹配”。
Dim arr() As String    '赋值号左边是string,右边是string,两边类型匹配,所以可以。
Dim arr '赋值号左边是variant 变量。见下图的帮助解释。

QQ截图未命名3.jpg


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-26 12:40 , Processed in 0.358526 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表