2012-03-30 112 views
5

我写了一些功能VBA:保存范围变量

Sheets("Src").Range("A2:A9").Copy Destination:=Sheets("Dest").Range("A2") 

我希望将源范围内提取到灵活可变的。

SrcRange = Sheets("Src").Range("A2:A9") 
SrcRange.Copy Destination:=Sheets("Dest").Range("A2") 

但是,这是行不通的。 什么SrcRange应该变暗?第一行是否正确?
我试着调光SrcRange的范围,它给了我
Runtime error 91: Object Variable or With block variable not set

我不是很熟悉的语言和文档已经离开我想(我无法找到返回类型的表(指数)调用,this是我发现的最接近的)。当我点击录制宏时,执行一些操作,然后点击停止,宏体仍然是空白的。

任何人都可以阐明如何使用SrcRange作为变量?

回答

9

在你自己的答案,您可以有效地做到这一点:

Dim SrcRange As Range ' you should always declare things explicitly 
Set SrcRange = Sheets("Src").Range("A2:A9") 
SrcRange.Copy Destination:=Sheets("Dest").Range("A2") 

你不是真正的“提取”的范围内给一个变量,你设置的单元格区域的引用。

在许多情况下,这可以更有效以及更灵活:

Dim Src As Variant 
Src= Sheets("Src").Range("A2:A9").Value 'Read range to array 
'Here you can add code to manipulate your Src array 
'... 
Sheets("Dest").Range("A2").Value = Src 'Write array back to another range 
+0

我喜欢能够读取Variant变量/数组以获得更大的灵活性。谢谢你的提示! – 2012-03-31 19:53:28

7

...答案是:

Set SrcRange = Sheets("Src").Range("A2:A9") 
SrcRange.Copy Destination:=Sheets("Dest").Range("A2") 

Set使所有的差异。然后它就像一个魅力。

8

只是为了澄清,没有这两个动作之间有很大的区别,由让·弗朗索瓦·科贝特的建议。

一个行动是复制/加载从Range("A2:A9")实际数据划分为变量数组称为vArray(更改为避免变量数组和薄板都称为Src的之间的混淆):

vArray = Sheets("Src").Range("A2:A9").Value

,而另一简单地设置一个范围变量(SrcRange)与范围Sheets("Src").Range("A2:A9")的ADDRESS:

Set SrcRange = Sheets("Src").Range("A2:A9")

在这种情况下,数据不会被复制,而是保留在原来的位置,但现在可以像访问数组一样访问数据。这通常是非常合适的,但是如果您需要反复访问,测试或计算这些数据,首先将其加载到Array中会更快。

例如,假设您想对照已知郊区和邮政编码列表检查“数据库”(大表)。这两组数据都在单独的工作表中,但如果您希望运行速度更快,则将郊区和邮政编码加载到数组(驻留在内存中),然后遍历主数据库的每一行,并根据数组数据进行测试。这将比从原始表格中访问两者快得多。