[英]VBA: Why isn't variable working in named range?
这是较大代码的一部分,但是此代码段无效。 我正在尝试将两个像元设置为彼此相等,但是它不起作用。 当我使用.Range(“ v1_copy”)时,代码运行,但是当我命名该范围并将其放置为变量(myCopyRange)时,代码无法运行,并且出现错误:编译错误:方法或数据找不到成员。 任何帮助,将不胜感激!
Sub copy_paste_test()
Dim myCopyRange As Range
Dim myPasteRange As Range
Dim myWS1 As Worksheet
Dim myWS2 As Worksheet
Set myWS1 = Sheets("Sheet1")
Set myWS2 = Sheets("Sheet2")
myCopyRange = Range("v1_copy")
myPasteRange = Range("v1_paste")
'myWS2.Range("v1_paste").Value = myWS1.Range("v1_copy").Value
' This line works, but the below line doesn't
myWS2.myPasteRange.Value = myWS1.myCopyRange.Value
' This should be the exact same, just substituting the variable, but doesn't work
End Sub
您没有为myCopyRange
和myPasteRange
Range
对象引用分配分配Set
关键字。
但是,对于检索命名范围,如果您想要执行显示内容并声明其功能的完全显式代码, 则最好的方法是从适当的Names
集合中取消引用Name
。
如果名称是工作簿范围的名称,请使用一个Workbook
对象(这里是一个book
对象变量)进行限定,但根据需要, ActiveWorkbook
或ThisWorkbook
正常工作:
Set myRange = book.Names("name").RefersToRange
如果名称是工作表范围的,请使用Worksheet
对象(这里是工作sheet
对象变量)进行限定,但ActiveSheet
效果也一样:
Set myRange = sheet.Names("name").RefersToRange
这样,如果重命名工作簿或用户更改工作表的“选项卡名称”,则代码不会中断。 只要名称存在于查询的Names
集合中,它就不会中断。
'myWS2.Range("v1_paste").Value = myWS1.Range("v1_copy").Value ' This line works, but the below line doesn't myWS2.myPasteRange.Value = myWS1.myCopyRange.Value ' This should be the exact same, just substituting the variable, but doesn't work
这应该是完全相同的 -不。 myWS1.myCopyRange
是非法的: myWS1
是一个Worksheet
对象: Worksheet
接口没有myCopyRange
成员,因此未找到方法或数据成员 。
由于myCopyRange
是一个Range
对象,它知道它的Parent
是在Worksheet
属于:有没有必要限定它...而且也没有必要再任它取消引用-这就够了:
myPasteRange.Value = myCopyRange.Value
范围仅适用于当前活动的工作表,除非您在分配时添加了工作表引用(而不是在使用时添加)。
由于您访问的是其他工作表,因此第二次分配将失败。
myCopyRange = myWS1.Range("v1_copy")
myPasteRange = myPasteRange = Range("v1_paste")
请参阅范围对象文档 :
如果在没有对象限定符的情况下使用它(句点左边的一个对象),则Range属性将在活动工作表上返回一个范围...在不使用显式对象限定符的情况下使用Range属性之前,请使用Activate方法激活工作表。
如果尝试引用NamedRanges而不是VBA变量中包含的名称,则需要更改访问范围的方式。
工作簿范围的NamedRanges不使用工作表引用-由于它们不适用于工作表,因此它们适用于工作簿级别。 如果需要添加限定符,请添加工作簿:
Range("MyBook.xls!MyRange")
如果您引用的是Worksheet-scope NamedRange,则需要一个限定符,但是它位于引号内:
Range("Sheet1!Sales")
通过使用“ Set
正确创建范围,并且不要在它们之前引用工作表。 工作簿范围的范围不需要绑定到任何工作表。
Sub copy_paste_test()
Dim myCopyRange As Range
Dim myPasteRange As Range
Set myCopyRange = Range("v1_copy")
Set myPasteRange = Range("v1_paste")
Range("v1_paste").Value = Range("v1_copy").Value
'myPasteRange.Value = myCopyRange.Value
End Sub
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.