我有一个"保存输入"我创建的工具中的宏复制主输入表,以便以后保存值。宏删除原始工作表的注释和其他不必要的部分。该工具本身有一堆范围名称,这些名称随工作表一起复制。我试图从保存的输入表中删除所有这些,但遇到错误。
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
答案 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:\”替换为刚从中复制的文件名。暂时禁用自动重新计算会大大加快该过程。