VBA正在跳过命名的范围线
我有一些代码,可以将数据从一个主文件复制到另一个主文件,然后删除命名范围并基于主文件重新创建它们(找不到更好的方法)。问题是,如果我只运行一次代码,数据副本和所有命名范围都将被删除。如果我再次运行它,将创建命名范围。你知道它为什么这么做吗VBA正在跳过命名的范围线,vba,excel,named-ranges,Vba,Excel,Named Ranges,我有一些代码,可以将数据从一个主文件复制到另一个主文件,然后删除命名范围并基于主文件重新创建它们(找不到更好的方法)。问题是,如果我只运行一次代码,数据副本和所有命名范围都将被删除。如果我再次运行它,将创建命名范围。你知道它为什么这么做吗 Sub RateCardUpdate() Dim RCWkbk As Workbook On Error Resume Next Set RCWkbk = Workbooks("ICARUS - Rate Card.xlsb") If Err Then
Sub RateCardUpdate()
Dim RCWkbk As Workbook
On Error Resume Next
Set RCWkbk = Workbooks("ICARUS - Rate Card.xlsb")
If Err Then MsgBox "Please download the latest Rate Card file and open it in order to update this Rate Card."
If Err Then Exit Sub
Application.EnableCancelKey = xlDisable
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim UserWkbk As Workbook
Set UserWkbk = ThisWorkbook
Dim NR As Name
UserWkbk.Activate
UserWkbk.Unprotect Password:="8910"
UserWkbk.Worksheets("rc_data").Visible = True
UserWkbk.Worksheets("rc_data").Unprotect Password:="8910"
UserWkbk.Worksheets("drop_downs").Visible = True
UserWkbk.Worksheets("drop_downs").Unprotect Password:="8910"
RCWkbk.Activate
RCWkbk.Unprotect Password:="8910"
RCWkbk.Worksheets("rc_data").Visible = True
RCWkbk.Worksheets("rc_data").Unprotect Password:="8910"
RCWkbk.Worksheets("drop_downs").Visible = True
RCWkbk.Worksheets("drop_downs").Unprotect Password:="8910"
RCWkbk.Worksheets("rc_data").Activate
RCWkbk.Worksheets("rc_data").UsedRange.Select
Selection.Copy
UserWkbk.Activate
UserWkbk.Worksheets("rc_data").Activate
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteFormulasAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
RCWkbk.Activate
RCWkbk.Worksheets("drop_downs").Activate
RCWkbk.Worksheets("drop_downs").UsedRange.Select
Selection.Copy
UserWkbk.Activate
UserWkbk.Worksheets("drop_downs").Activate
Range("A1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
For Each NR In RCWkbk.Names
UserWkbk.Names(NR.Name).Delete
UserWkbk.Names.Add Name:=NR.Name, RefersTo:=NR.Value
Next NR
RCWkbk.Activate
RCWkbk.Worksheets("rc_data").Protect Password:="8910"
RCWkbk.Worksheets("rc_data").Visible = False
RCWkbk.Worksheets("drop_downs").Protect Password:="8910"
RCWkbk.Worksheets("drop_downs").Visible = False
RCWkbk.Protect Password:="8910"
RCWkbk.Close
UserWkbk.Activate
UserWkbk.Worksheets("rc_data").Protect Password:="8910"
UserWkbk.Worksheets("rc_data").Visible = False
UserWkbk.Worksheets("drop_downs").Protect Password:="8910"
UserWkbk.Worksheets("drop_downs").Visible = False
UserWkbk.Protect Password:="8910"
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Application.EnableCancelKey = xlEnable
MsgBox "The Rate Card has been updated."
End Sub
这就是全部代码。有关章节为:
For Each NR In RCWkbk.Names
UserWkbk.Names(NR.Name).Delete
UserWkbk.Names.Add Name:=NR.Name, RefersTo:=NR.Value
Next NR
与Jeeped的注释一样,在删除名称范围之前,为某些变量分配命名范围数据,以便在删除名称范围之后使用它们
Dim NameRangeData As String, NameRangeName As String
For Each NR In RCWkbk.Names
NameRangeName = NR.Name
NameRangeData = NR.Value
UserWkbk.Names(NR.Name).Delete
UserWkbk.Names.Add Name:=NameRangeName, RefersTo:=NameRangeData
Next NR
首先在“错误恢复下一步”中注释掉
,然后重新运行它。如果删除某个内容,如何在下一行中使用其名称和值?如果您计划重新使用VAR,请在删除之前将名称和值存储在VAR中。如果您同意,请删除命名范围,然后尝试将其引用到现在不存在的位置。遵循@Jeeped注释。另外,为了获得更好的代码,不要进行那些。激活和选择调用。它们大多是不必要和缓慢的。相反,您只需使用工作表引用和范围从和复制粘贴到。如果我在出错时删除,则会在尝试删除一些命名范围时出错。我明白您和Jeeped的意思,这很有意义,但它仍然只在我第一次运行它时删除所有NR,并在第二次运行ITI时创建所有NR。如果它有区别,命名范围指的是表,那么表并不完全是命名范围。当您第二次运行它时,它正在创建命名范围,但不是作为表。让我进一步澄清。有一些表格正在从主wkbk复制到用户wkbk。如果有意义的话,这些表也有与之关联的命名范围。有一个表列表以及引用这些表的命名范围。它们被用来创建动态下拉列表。似乎当数据和表格从主控菜单的下拉表复制到用户wkbk时,用户wkbk引用中的NRs会出现#REF错误。然后,代码按照指示从用户wkbk中删除NR,但随后不会重新创建它。把它分成两个不同的循环会有不同吗?