在VBA中使用命名范围

时间:2018-10-22 13:18:21

标签: vba

from1,from2,from3,to1,to2,to3都是预定义的命名范围。它们都具有相同的尺寸。我只是想将所有to都替换为from。

以下代码在这行上一直给我一个类型不匹配错误

 ThisWorkbook.Names(to_ranges(i)) = ThisWorkbook.Names(from_ranges(i))

有人可以帮忙吗?谢谢!

Sub named_ranges()
    Dim from_ranges() As Variant, to_ranges() As Variant
    from_ranges() = Array("from_1", "from_2", "from_3")
    to_ranges() = Array("to_1", "to_2", "to_3")
    Dim i As Integer
    For i = 0 To UBound(from_ranges)
        ThisWorkbook.Names(to_ranges(i)) = ThisWorkbook.Names(from_ranges(i))
    Next i
End Sub

1 个答案:

答案 0 :(得分:0)

定义命名范围时,可以定义范围(工作表或工作簿)。所以:

Range(to_ranges(i)) = Range(from_ranges(i))

由于命名范围的默认范围是“工作簿”,因此可能会很好地工作。

话虽如此,您也可以在此处使用.Names对象,您只需要获取它的.RefersToRange属性,否则就不会复制范围,而是要复制的默认属性Name对象,即其“ RefersToRange”,它只是一个字符串。

基本上,您正在做

Names(to_ranges(i)).RefersToRange = Names(from_ranges(i)).RefersToRange

哪个不正确。

相反(与上面的第一个示例相比,这完全是过度杀伤力):

Range(Names(to_ranges(i)).RefersToRange).Value = Range(Names(from_ranges(i)).RefersToRange).Value

而且...最终,这并不能解决您最初对名称范围(工作簿与工作表)的担心,因为RefersToRange将按定义的那样进行范围调整,并且可能最终仍会击中您的{{1} },如果它的范围不正确,并且在这里不合格。