这是较大代码的一部分,但是此代码段无效。我正在尝试将两个像元设置为彼此相等,但是它不起作用。当我使用.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
答案 0 :(得分:3)
对于Set
和Range
的{{1}}对象引用分配,您缺少myCopyRange
关键字。
但是对于检索命名范围,如果您想要完全显式的代码来执行所说的并说出所做的事情,最好的去处是从{{1}适当的myPasteRange
集合。
如果名称是工作簿范围的名称,请使用Name
对象进行限定-这里是一个Names
对象变量,但根据需要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
答案 1 :(得分:1)
范围仅适用于当前活动的工作表,除非您在分配时添加工作表引用(而不是在完成使用时添加)。
由于您正在访问其他工作表,因此第二次分配将失败。
myCopyRange = myWS1.Range("v1_copy")
myPasteRange = myPasteRange = Range("v1_paste")
请参见Range Object Documentation:
在不带对象限定符的情况下使用时(位于对象左侧的对象 时间段),Range属性返回活动工作表上的范围 ...使用激活方法激活工作表,然后再使用 没有显式对象限定符的Range属性
如果您尝试引用NamedRanges而不是VBA变量中保留的名称,则需要更改访问范围的方式。
工作簿范围的NamedRanges不使用工作表引用-由于它们不适用于工作表,因此它们适用于工作簿级别。如果需要添加限定符,请添加工作簿:
Range("MyBook.xls!MyRange")
如果您引用的是Worksheet-scope NamedRange,则需要一个限定符,但是它位于引号内:
Range("Sheet1!Sales")
答案 2 :(得分:1)
使用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