VBA:为什么变量在命名范围内不起作用?

时间:2018-06-23 00:42:00

标签: vba excel-vba excel

这是较大代码的一部分,但是此代码段无效。我正在尝试将两个像元设置为彼此相等,但是它不起作用。当我使用.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

3 个答案:

答案 0 :(得分:3)

对于SetRange的{​​{1}}对象引用分配,您缺少myCopyRange关键字。

但是对于检索命名范围,如果您想要完全显式的代码来执行所说的并说出所做的事情,最好的去处是从{{1}适当的myPasteRange集合。

如果名称是工作簿范围的名称,请使用Name对象进行限定-这里是一个Names对象变量,但根据需要Workbookbook也可以工作:

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成员,因此方法或数据成员没有找到

由于WorksheetmyCopyRange对象,因此它知道它的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