ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 数组定义

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-10-8 17:12 | 显示全部楼层 |阅读模式
Sub 单元格区域转化为数组()
    Dim f As Variant
    f = ActiveSheet.Range("a1:c4")
    Debug.Print f(1, 1)
End Sub
在这一段代码里,如果将“dim f as variant”,改为“dim f() as variant”,提示“类型不匹配”的错误
Sub 动态数组演示()
    Dim myArr() As String
    ReDim myArr(0)
    myArr(0) = "一车间"
    ReDim Preserve myArr(2)
    myArr(1) = "二车间"
    myArr(2) = "三车间"
    Debug.Print myArr(0), myArr(2)
End Sub
在这一段代码里,如果将“Dim myArr() As String"改为“Dim myArr As String”,提示“缺少数组”的错误
我的困惑在于,定义数组时,数组名后面到底什么时候需要加括号,加不加括号有什么区别?或是说什么情况下需要加括号,什么情况下不需要加括号?

TA的精华主题

TA的得分主题

发表于 2014-10-8 17:21 | 显示全部楼层
简单的说,执行f = ActiveSheet.Range("a1:c4")之前,f就是一个变体变量,执行之后成为一个数组,不能将单元格区域直接赋值给一个数组,所以,你最后的问题也就不存在了

TA的精华主题

TA的得分主题

发表于 2014-10-8 17:58 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  ActiveSheet.Range("a1:c4")
这个区域它被组织为一个Variant变量下包含数组(当然还有其它),所以语句:
Dim f As Variant
f = ActiveSheet.Range("a1:c4")
将之赋与一个Variant变量(f),则转化为变量f包含一个数组.

而语句:
Dim f() As Variant
f = ActiveSheet.Range("a1:c4")
是把一个Variant变量赋与一个数组,所以提示"类型不匹配"

但可以:
Dim f() As Variant
f = ActiveSheet.Range("a1:c4").value
这样明确指定区域的值,它本身就是一个数组,所以可以直接传递给Variant数组.

TA的精华主题

TA的得分主题

发表于 2014-10-8 18:09 | 显示全部楼层
本帖最后由 liu-aguang 于 2014-10-8 18:10 编辑

如果在Range前面不加限定则下面语句都可以正常执行:
dim f,k()
f=range("a1:c4")
f=range("a1:c4").value
k=range("a1:c4")
k=range("a1:c4").value
原因是Range的默认属性是Value,它是一个数组.
上面前两句与后两句其意义是不同:
前两句是将数组赋与一个Variant变量,让其包含一个数组.
后两句是将一个数组整体传递给另一个数组.

TA的精华主题

TA的得分主题

发表于 2014-10-8 20:23 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
简单说,是这样子:

一、在VBA中自己定义数组时,需要用()

如: Dim arr(1 To 10)    【必须使用常量】
或    ReDim arr(1 To m)  【可以使用变量、且可以ReDim改变最后一维的大小】

注意,这样的数组变量不能用 arr=Range的方式赋值。(两者类型不同、后者是Variant类型变量)

教条的定义数组方式为:
Dim arr()
ReDim arr(1 To 5)

呵呵,之前的Dim应该是多余的。

…………

二、Dim arr 或 Dim arr as Variant

此时,可以把工作表Range区域直接赋值给arr得到一个Variant类型的二维数组。

这里,Variant是变量类型,而二维数组是其结果。实际上不能认为这里的arr是一个数组类型的变量。


………………
总结:
一、如果你想要把工作表Range区域读入VBA数组变量,那么不允许使用括号,即不能 Dim arr()
二、如果你想在VBA中直接定义数组变量(往往会通过直接循环计算来赋值),那么应该用括号 Dim arr()



评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-1-23 13:14 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
F為固態數組,myArr在不斷擴充,中動態數組,你定義反了,所以會出錯

TA的精华主题

TA的得分主题

发表于 2016-6-28 23:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
又学到东西了,受教了~

TA的精华主题

TA的得分主题

发表于 2017-1-1 15:41 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-5-17 17:17 | 显示全部楼层
本帖最后由 undoturuk 于 2017-5-17 17:21 编辑

    Dim f() As Variant
    f = ActiveSheet.Range("a1:c4")
这样是错的。但是修改成
   f = Range("a1:c4") 或者f = ActiveSheet.Range("a1:c4").value
就是对的
问题来了,Range("a1:c4")和ActiveSheet.Range("a1:c4")不一样?
这里的数据类型对接,到底什么情况?另外我个人理解,dim f as variant,这个f,就是一个variant变量,所以直接等于哪个range都行,也是赋值range以后,变成的二维数组。而dim f() as variant,是定义数组元素数据类型是variant,能够装这种类型的数据,所以是不是Range("a1:c4")或者ActiveSheet.Range("a1:c4").value,都是variant数据类型,而ActiveSheet.Range("a1:c4")不是?

TA的精华主题

TA的得分主题

发表于 2017-5-17 17:34 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Variant 是一种特殊的数据类型,除了定长 String 数据及用户定义类型外,可以包含任何种类的数据。
它既可以是 单个变量,也可以是数组。

具体是什么类型,由所赋的值所决定!!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-7-31 03:04 , Processed in 0.047230 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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