为什么我在将一个范围分配给变量数组时遇到问题

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)

  • +1,对于这个非常明确的答案:) (3认同)