Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何更改命名范围的引用?_Vba_Excel - Fatal编程技术网

Vba 如何更改命名范围的引用?

Vba 如何更改命名范围的引用?,vba,excel,Vba,Excel,我有一个类ValidationChanger,它有一个方法changeNamedRangeAddress,该方法应该更改指定范围的引用地址。但是,我的代码意外地将新地址用双引号括起来 ValidationChanger的类定义如下: 'ValidationChanger Sub changeNamedRangeAddress(bk As Workbook, rangeName As String, newAddress As String) bk.Names(rangeName).Refer

我有一个类
ValidationChanger
,它有一个方法
changeNamedRangeAddress
,该方法应该更改指定范围的
引用地址。但是,我的代码意外地将新地址用双引号括起来

ValidationChanger
的类定义如下:

'ValidationChanger

Sub changeNamedRangeAddress(bk As Workbook, rangeName As String, newAddress As String)
 bk.Names(rangeName).RefersTo = newAddress
End Sub
我在一个名为
TestRange
的范围内测试它,该范围指的是工作表
说明中的地址:
说明$133澳元:138澳元
。我的测试应该将地址更改为
指令$133澳元:139澳元
,包括以下内容:

Sub testValidationChanger()

Dim vc As New ValidationChanger
Dim bk As Workbook

Set bk = Workbooks("test.xlsm")
Debug.Print bk.Names("TestRange").RefersTo
vc.changeNamedRangeAddress bk, "TestRange", "Instructions!$A$133:$A$139"
Debug.Print bk.Names("TestRange").RefersTo

End Sub
输出为:

=Instructions!$A$133:$A$138
="Instructions!$A$133:$A$139"

知道为什么新地址用双引号括起来(这使它可以作为文本字符串而不是地址)吗?

将新范围作为范围对象传递,而不是作为字符串传递:

vc.changeNamedRangeAddress bk, "TestRange",[Instructions!$A$133:$A$139]

将新范围作为范围对象而不是字符串传递:

vc.changeNamedRangeAddress bk, "TestRange",[Instructions!$A$133:$A$139]

得到文本字符串的原因是没有在文本字符串前面加上=号(这样Excel就会知道它应该是一个公式)

得到文本字符串的原因是没有在文本字符串前面加上=号(这样Excel就会知道它应该是一个公式)

如果使用命名范围而不是地址,则可以更改该命名范围以适应任何需要

'this line creates the name that you can use in formulas in 
'much the same way as "Instructions!$A$133:$A$139"
thisworkbook.Names.Add Name:="examplerange", RefersTo:=Range("A1:A5")

'this line changes what it's pointing to
thisworkbook.Names("exampleRange").RefersTo = Range("A1:A10")

如果使用命名范围而不是地址,则可以更改该命名范围以适应所需的任何内容

'this line creates the name that you can use in formulas in 
'much the same way as "Instructions!$A$133:$A$139"
thisworkbook.Names.Add Name:="examplerange", RefersTo:=Range("A1:A5")

'this line changes what it's pointing to
thisworkbook.Names("exampleRange").RefersTo = Range("A1:A10")

将新范围作为范围对象传递,而不是作为字符串传递
vc.changeNamedRangeAddress bk,“TestRange”,[说明!$A$133:$A$139]
@TimWilliams,这就解决了问题。如果您将其作为答案发布,我将接受。将新范围作为范围对象传递,而不是作为字符串传递
vc.changeNamedRangeAddress bk,“TestRange”,[说明!$A$133:$A$139]
@TimWilliams,这就解决了问题。如果你把它作为答案贴出来,我会接受的。你好,卡洛斯。谢谢你的回答。你可以用它来格式化你的答案,让它更容易理解。@Diegomone做到了-现在好多了:)你好Carlos。谢谢你的回答。您可以使用来格式化您的答案,使其更易于理解。@Diegomone做到了-现在好多了:)