【问题标题】:VBA Is Skipping Named Range LinesVBA 正在跳过命名范围线
【发布时间】:2018-05-16 01:19:13
【问题描述】:

我有一些代码将数据从一个主文件复制到另一个,然后删除命名范围并根据主文件重新创建它们(找不到更好的方法来执行此操作)。问题是,如果我运行一次代码,数据副本和所有命名范围只会被删除。如果我再次运行它,则会创建命名范围。任何想法为什么这样做?

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

【问题讨论】:

  • 先注释掉On Error Resume Next,然后重新运行。
  • 如果你删除了一些东西,你如何在下一行使用它的名字和值?如果您打算重用它们,请在删除前将名称和值存储在 vars 中。
  • 同意,您删除命名范围,然后尝试在它现在什么都没有的地方引用它。关注@Jeeped 评论。
  • 另外,为了更好的代码,不要拨打.ActivateSelect 电话。它们大多是不必要且缓慢的。相反,您只需使用工作表引用和范围来复制和粘贴。
  • 如果我删除 On Error Resume Next 尝试删除一些 _xlfn 命名范围时会出错。

标签: vba excel named-ranges


【解决方案1】:

就像 Jeeped 的评论一样,在删除 Name Range 之前为某些变量分配 Named Range 数据,以便在删除后使用它们。

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

【讨论】:

  • 我明白你和 Jeeped 的意思,这是有道理的,但它仍然只会在我第一次运行时删除所有 NR,并在我第二次运行时创建它们
  • 如果有区别,命名范围指的是表
  • 确实如此,表并不完全是一个命名范围。当您第二次运行它时,它会创建命名范围,但不是作为表格。
  • 让我进一步澄清。有一些表从主 wkbk 复制到用户 wkbk。如果有意义的话,这些表也有与之关联的命名范围。有一个表列表以及引用这些表的命名范围。它们被用于创建动态下拉列表。
  • 似乎当数据和表从下拉表从主复制到用户 wkbk 时,用户 wkbk 引用中的 NR 中断为 #REF 错误。然后代码按照指示从用户 wkbk 中删除并删除 NR,但随后不会重新创建它。将其分成 2 个不同的循环会有所不同吗?
猜你喜欢
  • 1970-01-01
  • 2019-12-05
  • 2017-10-01
  • 2021-10-01
  • 2019-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
相关资源
最近更新 更多