我写了一些功能性的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应该变暗?第一行是否正确?
我尝试了Dimming SrcRange作为Range,它给了我
Runtime error 91: Object Variable or With block variable not set
我对语言并不熟悉,文档让我想要(我找不到Sheets(索引)调用的返回类型,this是我找到的最接近的)。当我点击Record Macro,执行一些操作并点击停止时,Macro正文仍为空白。
有人可以说明如何使用SrcRange作为变量吗?
答案 0 :(得分:10)
在你自己的回答中,你有效地做到了这一点:
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
答案 1 :(得分:8)
正如Jean-FrançoisCorbett所建议的那样,这两个行动之间存在很大差异。
一个操作是将实际数据从Range("A2:A9")
INTO复制/加载到名为vArray
的变体数组中(更改为避免Variant数组和工作表之间混淆,称为Src):
vArray = Sheets("Src").Range("A2:A9").Value
而另一个只是设置一个Range变量(SrcRange),其范围为Sheets("Src").Range("A2:A9")
的地址:
Set SrcRange = Sheets("Src").Range("A2:A9")
在这种情况下,数据不会被复制,并且保持原样,但现在可以以与Array相同的方式访问。这通常是完全足够的,但如果您需要重复访问,测试或计算该数据,首先将其加载到数组中将会更快。
例如,假设您要根据已知的Suburbs和Postcodes列表检查“数据库”(大表)。两组数据都在单独的表中,但如果您希望它快速运行,请将郊区和邮政编码加载到一个数组(存在于内存中),然后运行主数据库的每一行,对数组数据进行测试。这比从原始工作表中访问两者要快得多。
答案 2 :(得分:7)
......答案是:
Set SrcRange = Sheets("Src").Range("A2:A9")
SrcRange.Copy Destination:=Sheets("Dest").Range("A2")
Set
完全不同。然后它就像一个魅力。
答案 3 :(得分:0)
要保存范围,然后再调用它,您只是缺少了“设置”
Set Remember_Range = Selection or Range("A3")
Remember_Range.Activate
但是对于复制和粘贴,这样做更快。剪掉中间人及其一行
Sheets("Copy").Range("A3").Value = Sheets("Paste").Range("A3").Value
答案 4 :(得分:0)
我的用例是将范围保存到变量,然后在以后选择它
Dim targetRange As Range
Set targetRange = Sheets("Sheet").Range("Name")
Application.Goto targetRange
Set targetRangeQ = Nothing ' reset