use*_*261 26 arrays excel vba excel-vba
我遇到了一些非常简单的代码问题.让我详细说明事实,看看是否有其他人可以复制这种行为.如果有人可以复制,我想解释它为什么会发生.
因此,让我从一个非常简单的代码行开始:
Dim arr() As Variant
arr = Range("A1:A10")
Run Code Online (Sandbox Code Playgroud)
这按预期进行,arr
赋值为A1:A10
现在为什么以下代码行不起作用?
Dim arr() As Variant
arr = WorkSheets("Sheet1").Range("A1:A10")
Run Code Online (Sandbox Code Playgroud)
我得到一个运行时错误'13'类型不匹配,即使成功分配给数组相同的范围,只是没有工作表值.
但
Dim arr As Variant
arr = Worksheets("Sheet1").Range("A1:A10")
Run Code Online (Sandbox Code Playgroud)
和
Dim arr() As Variant
arr = Application.Transpose(Application.Transpose(Worksheets("Sheet1").Range("A1:A10")))
Run Code Online (Sandbox Code Playgroud)
工作
在你回答之前,请让我给你一些更多的事实.
Dim arr() As Variant
arr = Worksheets(1).Range("A1:A10")
Run Code Online (Sandbox Code Playgroud)
不起作用
并Sheets
代替Worksheets
所有人也给出了相同的错误.
通过使用下面Range("A1:A10").Worksheet.Name
的工作代码确实它与活动引用表相同,它确实Sheet1
在输出中说明了.
没有其他工作簿是打开的,所以它也不能引用另一个工作簿.
现在这最后一点代码只会增加我的困惑,因为它完全有效!
Dim arr() As Variant
Dim SampleRange As Range
Set SampleRange = Worksheets("Sheet1").Range("A1:A10")
arr = SampleRange
Run Code Online (Sandbox Code Playgroud)
因此,当我将其分配给范围变量时,使用相同方式在同一张纸上定义的相同方法现在可以正常工作.并使用它!正如预期的那样WorkSheets
,Sheets
无论我如何定义工作表,它都适用于和函数(我可以使用索引或工作表的名称,所有工作正常)
如果它可以帮助任何人,我在Windows XP机器上使用Excel 2007进行测试.我还没有在任何其他机器上测试它,但我计划在Windows 7和8上测试2003年和2010年,但还没有机会.
更新:不是100%确定这是否与数组完全相同但从浅视图看起来似乎是:
Range("B1:B3") = Range("A1:A3")
Run Code Online (Sandbox Code Playgroud)
上面的代码不起作用,即使A1:A3填充,日期,数值,字符串,公式什么,它会将空白写入B1:B3
但
Range("B1:B3").Value = Range("A1:A3").Value
Run Code Online (Sandbox Code Playgroud)
和
Range("B1") = Range("A1")
Run Code Online (Sandbox Code Playgroud)
确实有效!
另外工作是:
Range("B1:B3") = Application.Transpose(Application.Transpose(Range("A1:A3")))
Run Code Online (Sandbox Code Playgroud)
Sid*_*out 32
不,这不是一个bug.
关键是Value是Range Object的默认属性,为什么不隐式使用它呢?你看过我链接的问题了吗?(来自CHAT)
发布以前答案的专家已经详细解释过了.我会将解释保持在最低限度,因此如果您还有任何问题,请告诉我.
让我们先了解我们的对象.我创建了这个小桌子,清楚地显示了我们处理的内容,因此没有混淆.
您还可以添加一个Watch
以查看Type
特定对象,如下图所示.
所以当你说
arr = Range("A1:A10")
Run Code Online (Sandbox Code Playgroud)
Excel知道默认属性是.Value
.然而在其他情况下,它不知道,因为Excel不是一个心灵读者,或者让我们足够聪明地了解你是否想要Worksheets("Sheet1").Range("A1:A10")
用作a Range
或aVariant
一旦您明确指定您的对象,Range
然后Excel知道您想要什么.例如,这是有效的.
Dim arr() As Variant
Dim Rng As Range
Set Rng = Worksheets("Sheet1").Range("A1:A10")
arr = Rng
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
23157 次 |
最近记录: |