删除分配给不同工作簿的所有命名范围

时间:2016-12-28 19:07:14

标签: excel excel-vba vba

我有一个"保存输入"我创建的工具中的宏复制主输入表,以便以后保存值。宏删除原始工作表的注释和其他不必要的部分。该工具本身有一堆范围名称,这些名称随工作表一起复制。我试图从保存的输入表中删除所有这些,但遇到错误。

Sub SaveProgramData()

Dim SheetCopy As Worksheet
Dim BookCopy As Workbook
Dim nm As Name
Set Analyzer = ThisWorkbook.Worksheets("Program Dashboard")
Analyzer.copy

Set SheetCopy = ActiveWorkbook.Worksheets(1) 'only way to address copy of a sheet created in new wkbk (i think)
Set BookCopy = SheetCopy.Parent

With SheetCopy
'remove comments, buttons, data validation, do some formatting, etc.
End With


For Each nm In BookCopy.Names
    nm.Delete 'this results in a runtime error saying the name I entered is not valid
Next


End Sub

我很困惑,因为我没有尝试输入名称,只是删除它们。我也开放了另一种复制不会保留名字的表格的方法。

编辑:请参阅下面的评论,问题是大多数名称都已分配给原始工作簿中的范围。通过向If语句添加附加条件来解决:

For Each nm In BookCopy.Names
      If InStr(1, nm.RefersTo, SheetCopy.Name) > 1 Or InStr(1, nm.RefersTo, ThisWorkbook.Name) > 1 Then 'check for names scoped to copied sheet, or original workbook
         nm.Delete
      End If
Next nm

3 个答案:

答案 0 :(得分:3)

您永远不会初始化Names变量,因此它不知道要循环播放的内容。

请改为尝试:

创建以下Sub:

Sub RemoveNamesFromSheet()

Dim nm As Name

   For Each nm In ActiveWorkbook.Names
      If InStr(1, nm.RefersTo, ActiveSheet.Name) > 1 Then
         nm.Delete
      End If
   Next nm

End Sub

然后只需用RemoveNamesFromSheet

替换你的循环

希望这样做!

答案 1 :(得分:0)

我认为您的上一个for循环应为for nm in BookCopy.Names

答案 2 :(得分:0)

我知道它是这样工作的:

Sub RemoveNamesFromSheet()
  Dim nm As Name
  Application.Calculation = xlCalculateManual
  For Each nm In ActiveWorkbook.Names
    If InStr(nm, "C:\") > 1 Then
      nm.Delete
    End If
  Next nm
  Application.Calculation = xlCalculationAutomatic
  Calculate
End Sub

它将检查名称中是否出现“ C:\”,该名称通常是另一个工作簿的名称,因此将删除所有外部引用。假定引用的工作簿已关闭。 您也可以将“ C:\”替换为刚从中复制的文件名。暂时禁用自动重新计算会大大加快该过程。