Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.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_Named Ranges - Fatal编程技术网

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,但随后不会重新创建它。把它分成两个不同的循环会有不同吗?