ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: ggsmart

菜鸟谈VBA最最基础入门《原创》

    [复制链接]

TA的精华主题

TA的得分主题

发表于 2010-7-12 19:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:开发帮助和教程
对于我来说是很好的教材,谢谢!

TA的精华主题

TA的得分主题

发表于 2010-7-12 21:01 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-7-12 22:44 | 显示全部楼层

回复 1832楼 我是我妈的宝贝 的帖子

1、将单元格区域的值直接赋给数组,数据类型要设为Variant型。
2、将单元格区域赋给数组后,索引号的下标默认为1。实际上我觉得在当中的那句ReDim是没有起什么作用的(这只是个人猜测)。比如:

  1. Sub test()
  2.   Dim arr
  3.   ReDim arr(1 To 3, 1 To 2) As String
  4.   arr = [A1:B3]
  5.   MsgBox TypeName(arr(1, 1))
  6. End Sub
复制代码
尽管Rdim数组数据类型为String型了,可是实际上数组里的数据类型只是和相应的单元格里的类型一致。

TA的精华主题

TA的得分主题

发表于 2010-7-13 08:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
非常感谢,嗯嗯

TA的精华主题

TA的得分主题

发表于 2010-7-13 09:18 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-7-13 10:58 | 显示全部楼层
回复楼主   第1835楼问题

非常感谢楼主的回复,您的无私奉献是我们前进的动力!
我将楼主的代码做了适当修改,进行了多方尝试!请见附件!
虽然还没有完全想明白,但有点新的领悟,就是不知道对不对,共享出来供大家参详!
下面这句话是帮助系统的原话:
Variant 是一种特殊的数据类型,除了定长 String 数据及用户定义类型外,可以包含任何种类的数据。
类似于[A1:B3]的引用,实际上是Range对象,而Variant变量也能包含Range对象,所以下面代码是成立的
   arr = [A1:B3]    '将range对象赋给Variant变量
但又有了新的疑问,为何下标起始变为了1呢,redim改变下标也不起作用?
我理解如下:arr = [A1:B3] 这就像给某个单元格区域命名,看下面的代码
Sub test4()
  MsgBox Range("test").Cells(1, 1).Value   '引用区域test中的第一个单元格
End Sub
arr(1,1)  与Range("test").Cells(1, 1)类似的,直接表示某个单元格区域的第一个单元格,但用起来更简洁,。。。

可能理解不准确,见笑~~~

数组赋值测试.rar

7.22 KB, 下载次数: 39

TA的精华主题

TA的得分主题

发表于 2010-7-13 11:26 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-7-13 15:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

回复 1838楼 我是我妈的宝贝 的帖子

首先,我认为,一个已经定义了数据类型,或已经定义元素个数的数组变量是不能同时对其进行赋值的,必须要用循环的方式才行。
如:

  1. Sub test1()
  2. Dim arr(0 To 2)     '定义一个三个元素的一维数组
  3. arr = Array("A", "B", "C")
  4. End Sub
复制代码
这样是不行的。

我知道你会问:为什么这样就行了?

  1. Sub test1()
  2. Dim arr  '或者Dim arr()
  3. arr = Array("A", "B", "C")
  4. End Sub
复制代码
是的,这样行了。
但你要注意两个声明变量的语句的差别。

  1. Dim arr    '或Dim arr(),它们都没有声明元素的个数或数据类型。
复制代码
所以,我的认为是:如果要把一个数组或单元格区域赋给一个数组,接受数据的数组必须是Variant型,且元素个数不定。


第二,我不认为arr = [A1:B3] 这是某个单元格区域命名。但是:
Range("A1:B3")会被VBA当作是一个Range对象,也可能被当作了Range("A1:B3").Value(因为Value有时候可以省略,这个大家都知道)。前者是对象,后者是数值。这个大家也都知道。

  1. Sub test1()
  2.   Dim arr()
  3.   arr = [A1:B3].Value           '必须加.value才能正确运行
  4. End Sub
复制代码
因为 [A1:B3]可能会被看成把这个对象,所以这里不加.Value会出错。

PS:这只是个人观点,并不代表权威,供参考!

[ 本帖最后由 ggsmart 于 2010-7-13 18:45 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-7-14 09:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
回复楼主   第1840楼问题

可能是我没表达清楚,嘿嘿!
我并没说arr = [A1:B3] 就是对某个单元格区域命名,而是说这样直接将某个区域赋值给数组,对数组的引用和单元格区域命名的引用极为相似!看了一些其他的帖子,同时自己实践得出的,将“直接将某个区域赋值给数组”的各种情况汇总。
请看下面的这几段代码(附件中已经有):

'赋给数组的区域为多行多列,变量定义为arr()
Sub test1()
  Dim arr()
  arr = [A1:B3].Value    '必须加.value才能正确运行,且arr默认为二维数组,,起始标号均为1
  MsgBox arr(2, 1)       '分别为arr(1, 1),arr(1, 2),arr(1, 3),arr(2, 1),arr(2, 2),arr(2, 3)六个元素
End Sub

'赋给数组的区域为一行,变量定义为arr()
Sub test2()
  Dim arr()
  arr = [A1:C1].Value    '必须加.value才能正确运行,且arr默认为二维数组,起始标号均为1
  MsgBox arr(1, 1)        '分别为arr(1, 1),arr(1, 2),arr(1, 2)三个元素
End Sub

'赋给数组的区域为一列,变量定义为arr()
Sub test3()
  Dim arr()
  arr = [A1:A3].Value    '必须加.value才能正确运行,且arr默认为二维数组,起始标号均为1
  MsgBox arr(3, 1)       '分别为arr(1, 1),arr(2, 1),arr(3, 1)三个元素
End Sub

'赋给数组的区域为多行多列,变量定义为arr
Sub test4()
  Dim arr
  arr = [A1:B3]     '加不加.value都能正确运行,且arr默认为二维数组,起始标号均为1
  MsgBox arr(2, 1)
End Sub

'赋给数组的区域为一行,变量定义为arr
Sub test5()
  Dim arr
  arr = [A1:C1]        '加不加.value都能正确运行,且arr默认为二维数组,起始标号均为1
  MsgBox arr(1, 1)        '分别为arr(1, 1),arr(1, 2),arr(1, 3)三个元素
End Sub
'赋给数组的区域为一列,变量定义为arr
Sub test6()
  Dim arr
  arr = [A1:A3]         '加不加.value都能正确运行,且arr默认为二维数组,起始标号均为1
  MsgBox arr(3, 1)       '分别为arr(1, 1),arr(2, 1),arr(3, 1)三个元素
End Sub
'赋给数组的区域为一行,变量定义为arr
Sub test7()
  Dim arr
  arr = [A1:C1&""]        'arr为一维数组,起始标号为1
  MsgBox arr(2)        '分别为arr(1),arr(2),arr(3)三个元素
End Sub
'赋给数组的区域为一列,变量定义为arr
Sub test8()
  Dim arr
  arr = Application.WorksheetFunction.Transpose([A1:A3])   'arr为一维数组,起始标号为1
  MsgBox arr(3)        '分别为arr(1),arr(2),arr(3)三个元素
End Sub

大家仔细对比就会发现“直接将某个区域赋值给数组”的不同方式:
1、变量定义有两种:dim arr 或者 dim arr(),建议采用dim arr 的定义,省事且不易出错;
2、区域直接赋值给数组时,若采用如下类似形式:
  arr = [A1:A3]  (单列)或arr = [A1:C1]   (单行)或 arr = [A1:B3]  (多行多列)
   则数组为二维数组,引用时采用二维数组arr(i,j)的形式既可,但一定要注意起始标号为1,同时,数组有多少元素与赋给的单元格数目一致。这时就“对数组的引用和单元格区域命名的引用极为相似!”
3、若将一行或一列区域赋值给一维数组,
  一行的形式为:arr = [A1:C1&""] ,一列的形式为:arr = Application.WorksheetFunction.Transpose([A1:A3])  
引用时采用一维数组arr(i)的形式既可,但一定要注意起始标号为1,同时,数组有多少元素与赋给的单元格数目一致。

其中情况二,区域不做任何处理赋给数组,数组就是二维数组,是我无意中试出来的,嘿嘿!

数组赋值测试.rar

9.25 KB, 下载次数: 118

点评

不错,这正是我需要的,感谢分享!  发表于 2011-12-28 14:43

TA的精华主题

TA的得分主题

发表于 2010-7-14 09:54 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
辛苦了!!!!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-22 21:35 , Processed in 0.056422 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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