Excel精英培训网

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

[已解决]VBA数组声明的问题

[复制链接]
发表于 2012-12-8 16:05 | 显示全部楼层 |阅读模式
        首先第一个问题。dim arr ,arr1() 这种加括号与不加括号有什么区别?我所看到的一个是说,如果用Array赋值的话,只能声明为不加括号的。不知道其它方面还有什么区别不?

         第二个问题,ReDim  与ReDim Preserve 示例代码如下。前期已将arr 与 arr1都赋值了( Range("a1:b5").Value,注意此处最大下标为5)。在后期 若是想重置数组大小的话,如果用ReDim可以声明为  ReDim arr(1 To 10, 1 To 2),注意此处的10大于之前的最大下标5的,这种方式是可以的。但如果用ReDim的话,声明为ReDim Preserve arr1(1 To 10, 1 To 2),此处的10也是大于下标5的。但这时就会出错。。我经过测试了的,请问各位,这是什么原因呢?非常感谢!
  1. Sub text2()
  2. Dim arr(), arr1()
  3. arr = Range("a1:b5").Value
  4. arr1 = Range("a1:b5").Value
  5. ReDim arr(1 To 5, 1 To 2)
  6. ReDim Preserve arr1(1 To 5, 1 To 2)
  7. MsgBox "arr(2,2):" & arr(2, 2) & Chr(10) & "arr1(2,2):" & arr1(2, 2)
  8. End Sub
复制代码
最佳答案
2012-12-8 16:46
没有 括号 的,准确的说是没有类型的,有括号的才是数组类型的!!

有括号的不能用 array 赋值,这是一个问题
有括号的,在赋值时,需要注意很多细节
主要是注意.value 不能省略
比如下面的代码,如果没有 .value  则会提示"类型不匹配"

  1. Dim Arr()
  2.   Arr = Sheets("Sheet1").Range("A1:B3").Value
复制代码
这一点和在字典中添加项一样,
比如 a1里是张三,那么
d(range("A1"))=1

这样添加进去的是一个range对像,而不是一个值
这就会导致后期使用字典时会出现一系列的错误

再比如,你有一个工作表名字是 "张三",同样的,sheet1表a1里的值是 "张三"

那么 sheets(sheets("Sheet1").range("A1")).range("A1")=333
这样的代码,简化一下就是 sheets("张三").range("A1")=333

但实际上,代码是会提示错误的
因为这时候省略了 .value 他们取的是一个对像,所以会提示错误!!


问题2
在帮助里有这样一段:
如果使用了 Preserve 关键字,就只能重定义数组最末维的大小,且根本不能改变维数的数目。
例如,如果数组就是一维的,则可以重定义该维的大小,因为它是最末维,也是仅有的一维。
不过,如果数组是二维或更多维时,则只有改变其最末维才能同时仍保留数组中的内容。

你的代码

  • arr1 = Range("a1:b5").Value
  • ReDim Preserve arr1(1 To 10, 1 To 2)
是改变二维数组的第一维,所以这里不能通过
如果修改一下

  • arr1 = Range("a1:b5").Value
  • ReDim Preserve arr1(1 To 5, 1 To 5)
这样是可以的


excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2012-12-8 16:46 | 显示全部楼层    本楼为最佳答案   
没有 括号 的,准确的说是没有类型的,有括号的才是数组类型的!!

有括号的不能用 array 赋值,这是一个问题
有括号的,在赋值时,需要注意很多细节
主要是注意.value 不能省略
比如下面的代码,如果没有 .value  则会提示"类型不匹配"

  1. Dim Arr()
  2.   Arr = Sheets("Sheet1").Range("A1:B3").Value
复制代码
这一点和在字典中添加项一样,
比如 a1里是张三,那么
d(range("A1"))=1

这样添加进去的是一个range对像,而不是一个值
这就会导致后期使用字典时会出现一系列的错误

再比如,你有一个工作表名字是 "张三",同样的,sheet1表a1里的值是 "张三"

那么 sheets(sheets("Sheet1").range("A1")).range("A1")=333
这样的代码,简化一下就是 sheets("张三").range("A1")=333

但实际上,代码是会提示错误的
因为这时候省略了 .value 他们取的是一个对像,所以会提示错误!!


问题2
在帮助里有这样一段:
如果使用了 Preserve 关键字,就只能重定义数组最末维的大小,且根本不能改变维数的数目。
例如,如果数组就是一维的,则可以重定义该维的大小,因为它是最末维,也是仅有的一维。
不过,如果数组是二维或更多维时,则只有改变其最末维才能同时仍保留数组中的内容。

你的代码

  • arr1 = Range("a1:b5").Value
  • ReDim Preserve arr1(1 To 10, 1 To 2)
是改变二维数组的第一维,所以这里不能通过
如果修改一下

  • arr1 = Range("a1:b5").Value
  • ReDim Preserve arr1(1 To 5, 1 To 5)
这样是可以的


回复

使用道具 举报

发表于 2012-12-8 17:00 | 显示全部楼层
补充一下
ReDim 语句用来定义或重定义原来已经用带空圆括号(没有维数下标)的 Private、PublicDim 语句声明过的动态数组的大小。

arr = Range("a1:b5").Value
使用了 ReDim arr(1 To 10, 1 To 2)  以后,
arr的空间增加了,但是里的值被清空了

arr1 = Range("a1:b5").Value
而使用 ReDim Preserve arr1(1 To 5, 1 To 5)
arr1 的空间增加了,值同样存在

这就是区别
但是可以使用转置来进行行列转换后再用 preserve ,然后再转置回来
比如下面的代码,在本地窗口中可以看到他的具体变化

  1. Sub cc()
  2. Dim Arr()
  3.   Arr = Range("A1:B3").Value
  4.   Arr = Application.Transpose(Arr)
  5.   ReDim Preserve Arr(1 To 2, 1 To 5)
  6.   Arr = Application.Transpose(Arr)
  7. End Sub
复制代码
这样用了2次转置,比较麻烦,一般情况下我们都是反向声明,把数据处理好以后,转置再赋值

回复

使用道具 举报

 楼主| 发表于 2012-12-8 17:30 | 显示全部楼层
无聊的疯子 发表于 2012-12-8 16:46
没有 括号 的,准确的说是没有类型的,有括号的才是数组类型的!!

有括号的不能用 array 赋值,这是一个问题 ...

非常详细,太感谢您了!
回复

使用道具 举报

 楼主| 发表于 2012-12-8 18:11 | 显示全部楼层
无聊的疯子 发表于 2012-12-8 17:00
补充一下
ReDim 语句用来定义或重定义原来已经用带空圆括号(没有维数下标)的 Private、Public 或 Dim 语 ...

看了您了回贴收获很多,ReDim 语句用来定义或重定义原来已经用带空圆括号(没有维数下标)的 Private、PublicDim 语句声明过的动态数组的大小。也是帮助中间的, 请问,里面的空圆括号是什么意思?
回复

使用道具 举报

发表于 2012-12-8 18:35 | 显示全部楼层
zhoucs00 发表于 2012-12-8 18:11
看了您了回贴收获很多,ReDim 语句用来定义或重定义原来已经用带空圆括号(没有维数下标)的 Private、Pu ...

就是 dim arr()  的意思, () 就是圆括号
回复

使用道具 举报

 楼主| 发表于 2012-12-8 20:59 | 显示全部楼层
无聊的疯子 发表于 2012-12-8 18:35
就是 dim arr()  的意思, () 就是圆括号

嗯嗯,谢谢非常感谢。。
回复

使用道具 举报

 楼主| 发表于 2012-12-9 07:22 | 显示全部楼层
无聊的疯子 发表于 2012-12-8 16:46
没有 括号 的,准确的说是没有类型的,有括号的才是数组类型的!!

有括号的不能用 array 赋值,这是一个问题 ...

您好,我今早测试了一下。发现,有括号的用array赋值也是可以的。而redim 也可以重置无括号的大小。是不是说,并没有非常严格的限制说,不能这样用。只是最好不要这样用。
回复

使用道具 举报

发表于 2012-12-9 08:03 | 显示全部楼层
zhoucs00 发表于 2012-12-9 07:22
您好,我今早测试了一下。发现,有括号的用array赋值也是可以的。而redim 也可以重置无括号的大小。是不是 ...

有括号的用array赋值是可以的!
变量加括弧表示定义了一个不确定维数和大小的数组,可以用redim来定义维数和大小, array赋值过程其实是先定义数组大小再赋值的过程。
回复

使用道具 举报

 楼主| 发表于 2012-12-9 09:19 | 显示全部楼层
zjdh 发表于 2012-12-9 08:03
有括号的用array赋值是可以的!
变量加括弧表示定义了一个不确定维数和大小的数组,可以用redim来定义维数 ...

嗯嗯,非常感谢您的解答。。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 01:42 , Processed in 0.862167 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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