如何使用VBA更改范围参考

时间:2018-02-08 17:05:43

标签: excel vba excel-vba

我有大约300个指定范围,指的是外部电子表格。

例如

范围名称: my_range

请参阅: =' \ mycompany.com \ lucas [Lucas.xlsm] SHEETNAME'!$ C $ 10

我想替换" \ mycompany.com \ lucas [Lucas.xlsm]"用空字符串

我尝试在线研究这个问题,但似乎我没有能够正确地说出来,所有答案都指的是在单元格中查找和替换......

3 个答案:

答案 0 :(得分:1)

在VBA中有很多资源可以做到这一点(300多个手动做很多事情!)。

这里有一个很棒的一般指南:The SpreadsheetGuru's guide to Named Ranges in VBA

循环遍历特定工作表中的所有命名范围和所有命名范围:

Sub NamedRange_Loop()
'PURPOSE: Delete all Named Ranges in the Active Workbook
'SOURCE: www.TheSpreadsheetGuru.com

Dim nm As Name

'Loop through each named range in workbook
  For Each nm In ActiveWorkbook.Names
    Debug.Print nm.Name, nm.RefersTo
  Next nm

'Loop through each named range scoped to a specific worksheet
  For Each nm In Worksheets("Sheet1").Names
    Debug.Print nm.Name, nm.RefersTo
  Next nm

End Sub

要更改链接,请编辑RefersTo,而不是使用Debug.Print。我无法找到直接编辑链接的方法,所有文档都表明您必须删除链接并使用新引用重新创建链接。

删除很简单 - nm.Delete

创建很简单:

'For Workbook level links 
ThisWorkbook.Names.Add Name:=RangeName, RefersTo:=cell
'For Worksheet level links
Worksheets("Sheet1").Names.Add Name:=RangeName, RefersTo:=cell

另见:

Names Object
Names.Add Method
Defining and using names in VBA formulas Looping through all named ranges in excel VBA in current active sheet

答案 1 :(得分:0)

如果使用空字符串替换命名范围的引用地址,Excel将删除命名范围。这是我用来删除命名范围的方式:

Public Sub DeleteName(sName As String)

    On Error GoTo DeleteName_Error
    ActiveWorkbook.Names(sName).Delete
    Debug.Print sName & " is deleted!"

    On Error GoTo 0
    Exit Sub

DeleteName_Error:
    Debug.Print sName & " not present or some error"
    On Error GoTo 0
End Sub

简单地称之为:

DeleteName my_range

实际上,Excel开发人员删除没有.RefersTo的命名范围非常聪明 - 否则会出现大量错误。检查一下,如果您声明my_range1my_range2,此代码只会运行一次:

Public Sub TestMe()

    Dim nameArray As Variant
    nameArray = Array("my_range1", "my_range2")
    Dim myNameRange As Name
    For Each myNameRange In ThisWorkbook.Names
        Dim cnt As Long
        For cnt = LBound(nameArray) To UBound(nameArray)
            If nameArray(cnt) = myNameRange.Name Then
                Debug.Print myNameRange
                Debug.Print myNameRange.RefersTo
                myNameRange.RefersTo = vbNullString
            End If
        Next cnt
    Next myNameRange
End Sub

答案 2 :(得分:-1)

您应该可以从“数据”,“编辑链接”对话框中执行此操作。选择相关链接,单击“更改源”并将其指向工作簿本身。

如果失败,请下载我的FlexFind工具(http://jkp-ads.com/officemarketplaceff-en.asp),运行它并确保检查对话框中的对象复选框。