ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

一维数组赋值和输出的问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2005-6-21 22:56 | 显示全部楼层

变体不是所有的赋值都可以,可以测试一下,

Sub Test()

dim a as Varaint

a=thisworkbook.sheets(1)

end sub

是通不过的。

[此贴子已经被作者于2005-6-21 22:57:25编辑过]

TA的精华主题

TA的得分主题

发表于 2005-6-21 23:04 | 显示全部楼层

应该同时属于对象+数组,但须SET,(个人理解)

Sub jjj()

Dim xx As Range Set xx = [a1:b10] MsgBox xx.Address MsgBox IsArray(xx) 'yes MsgBox IsObject(xx) 'yes MsgBox xx.Cells(1, 1).Offset(1, 0).Address End Sub

[此贴子已经被作者于2005-6-21 23:05:36编辑过]

TA的精华主题

TA的得分主题

发表于 2005-6-21 23:09 | 显示全部楼层
以下是引用figfig在2005-6-21 23:04:26的发言:

应该同时属于对象+数组,但须SET,(个人理解)

我认为应该是数组对象更合适。

TA的精华主题

TA的得分主题

发表于 2005-6-21 23:12 | 显示全部楼层

'呵呵!运行 TESTA 看看MSGBOX怎样说? Sub testA()

Dim myData As Variant Set myData = Range("A1:A20") MsgBox (VarType(myData)) myData = Range("A1:A20") MsgBox (VarType(myData))

End Sub

TA的精华主题

TA的得分主题

发表于 2005-6-21 23:21 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
以下是引用丸究阵引在2005-6-21 23:12:28的发言:

'呵呵!运行 TESTA 看看MSGBOX怎样说? Sub testA()

Dim myData As Variant Set myData = Range("A1:A20") MsgBox (VarType(myData)) myData = Range("A1:A20") MsgBox (VarType(myData))

End Sub

结果是8204,

=8192(数组)+12(variant)

so,是数组,NOT 对象!!

TA的精华主题

TA的得分主题

发表于 2005-6-21 23:22 | 显示全部楼层
以下是引用丸究阵引在2005-6-21 23:12:28的发言:

'呵呵!运行 TESTA 看看MSGBOX怎样说? Sub testA()

Dim myData As Variant Set myData = Range("A1:A20") MsgBox (VarType(myData)) myData = Range("A1:A20") MsgBox (VarType(myData))

End Sub

用这个更直观

Sub testA() Dim myData As Variant Set myData = Range("A1:A20") Debug.Print TypeName(myData) myData = Range("A1:A20") Debug.Print TypeName(myData) Debug.Print IsObject(myData) End Sub

第一个显示是一个对象(Range),第二个显示是一个变体数组(Variant()),不是对象

TA的精华主题

TA的得分主题

发表于 2005-6-21 23:32 | 显示全部楼层
VarType函数只能测试出变量的子类型,并不能确定这个变量是不是Range 如:MsgBox VarType(Range("A1"))也不会返回代表对象的值 要确定是不是Range,直接运行MsgBox myData.Address就可以了,如myData不是Range对象就返回错误。

TA的精华主题

TA的得分主题

发表于 2005-6-22 10:40 | 显示全部楼层

用 figfig 的例子说更明白一点

Sub jjj()

Dim myData As Variant

Set myData = Range("A1:A20")

Debug.Print VarType(myData) '8204 Debug.Print TypeName(myData) 'Range Debug.Print IsObject(myData) 'True Debug.Print IsArray(myData) 'True Debug.Print myData.Address '地址字符串

End Sub

从过程 jjj 看到了什么?vba的脑子是不是进水了!同样一个变量怎么即是对象又是数组呢?其实不是!奥妙就是一个 变 字。

在 Set myData = Range("A1:A20") 赋值后,vba存贮的是vartype=8204 的东西(注:要察看 variant 正在使用哪种变量类型,应使用 vartype--官方解释),这就是偶在20楼说的 某某。

在使用时,vba会作一个最好的猜测,根据这个猜测而会自动转换相应类型(Debug.Print VarType(myData),Debug.Print IsObject(myData)等就是这个使用的过程),这就是同样的变量会有不同数据类型的原因!

这个猜测绝大部分都是正确的,但有时并不是和过程的意愿相同的,这就是偶在14楼,劝 UNARTHUR 要使用明确、鲜明书写代码的原因。

为什么myData=Range("A1:A20")不是二维数组。从另一角度简单的讲要是标准的二维数组 Transpose 后应可以用数组的读取方式 x(1,1)的读取,而现实是不可以。 myData=Range("A1:A20") 而 myData 能用myData(1,1)读取,在这里这个最好的猜测应该是单元格。这就是偶说 myData 的本质就是单元格!(本质是单元格,和就是单元格不是一个意思)20 楼的例子 Set myData = Range("A1:A20")和 myData=Range("A1:A20") 的 vartype 返回同一值也证明了这一点。

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-6-22 11:19 | 显示全部楼层
同意丸究阵引兄的解释,受益匪浅,谢谢!

TA的精华主题

TA的得分主题

发表于 2005-6-22 11:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

同意button的观点

Set myData = Range("A1:A20")生成的是对象而不是数组

myData = Range("A1:A20")生成的是数组而不是对象

他们虽然可以用myData(n,m)得到同一个值但是本质是不同的

另外关于有无.value,差别肯定是有的。但是在这个问题上既然不加.value比加上.value执行效率要高,为什么还要加呢??请看以下测试

pfLE3otT.rar (7.65 KB, 下载次数: 94)

[此贴子已经被作者于2005-6-22 11:34:11编辑过]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-18 08:16 , Processed in 0.043496 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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