【发布时间】:2014-02-18 15:22:05
【问题描述】:
我在使用一些非常简单的代码行时遇到了一些问题。让我详细说明事实,看看是否有其他人可以复制这种行为。如果有人可以复制,我想解释一下为什么会发生。
让我从一个非常简单的代码行开始:
Dim arr() As Variant
arr = Range("A1:A10")
这正如预期的那样,arr 被分配了 A1:A10 的值
现在为什么下面的代码行不起作用?
Dim arr() As Variant
arr = WorkSheets("Sheet1").Range("A1:A10")
我得到一个运行时错误“13”类型不匹配,即使相同的范围已成功分配给数组,只是没有工作表值。
但是
Dim arr As Variant
arr = Worksheets("Sheet1").Range("A1:A10")
还有
Dim arr() As Variant
arr = Application.Transpose(Application.Transpose(Worksheets("Sheet1").Range("A1:A10")))
有效
现在在你回答之前,请让我再给你一些事实。
Dim arr() As Variant
arr = Worksheets(1).Range("A1:A10")
不工作
并且使用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
因此,当我将其分配给范围变量时,现在可以在同一张工作表上使用相同的方式定义相同的范围。并使用它!正如预期的那样,无论我如何定义工作表,这都适用于WorkSheets 和Sheets 函数(我可以使用索引或工作表的名称并且一切正常)
如果它对任何人有帮助,我将在 Windows XP 机器上使用 Excel 2007 进行测试。我还没有在任何其他机器上测试过它,但我计划在 2003 年和 2010 年在 Windows 7 和 8 上进行测试,只是还没有机会。
更新: 不能 100% 确定这是否与数组的确切问题相同,但从肤浅的角度来看,它似乎是:
Range("B1:B3") = Range("A1:A3")
上面的代码不起作用,即使填充了A1:A3,日期,数值,字符串,公式任何东西,它都会将空格写入B1:B3
但是
Range("B1:B3").Value = Range("A1:A3").Value
还有
Range("B1") = Range("A1")
确实有效!
同样有效的是:
Range("B1:B3") = Application.Transpose(Application.Transpose(Range("A1:A3")))
【问题讨论】:
-
我认为这与引用
Range的默认行为有关。通常Range(X)可用于引用范围X的内容。如果我们将它实例化为工作表的 Range 属性,我想我们指的是它的硬编码“范围”。但是,这并不能解释为什么将其设置为变量会绕过它。希望有人能过来解释一下。不过,Value可以为我解决这个问题。 Win7,XL2010。 -
我不知道为什么第二种方法在第一种方法有效时不起作用。但是,这通常不是您将范围直接分配给数组的方式:通常您会将
arr声明为Variant,而不是作为变量数组,这就是您在这里所拥有的。仅使用常规 Variant 您将看不到此行为。将.Value添加到第二种方法的末尾也可以解决问题,因此必须与依赖两种方法之间不同的默认属性有关。 -
@user2140261,将
Dim arr() As Variant更改为Dim arr As Variant为我解决了问题,arr = Worksheets(1).Range("A1:A10")工作正常! -
@simoco 是正确的。删除
()并离开Dim arr As Variant将更正Worksheets...部分的问题。现在,如何理解这一切。 :D -
@simoco 是的,以这种方式调暗它也为我解决了问题,据记录,我所说的文章是 Here