【问题标题】:How to select all names in Excel with VBA如何使用 VBA 在 Excel 中选择所有名称
【发布时间】:2015-05-23 19:22:50
【问题描述】:

我正在处理一个大型 Excel 文件,其中我为单元格定义了大约 2000 个名称。此外,excel 包含公式,这些公式已经输入了对单元格的引用 (A23-B24)。我想通过定义的名称更改单元格引用(而不是 A23-B24 具有 VARIABLE_100-VARIABLE_120)。

我知道这可以通过选择“应用名称”然后从列表中选择定义的名称来实现。因为我有大约 2000 个定义的名称,我想从菜单中一次选择所有名称,但我找不到选项,所以我必须一个一个选择。我一直在寻找是否有在菜单上启用多项选择的选项,但我还没有找到这样的选项。 对我来说,一个解决方法是创建一个宏,该宏适用于选定的公式范围和选定的名称。像这样的:

Sub Macro1()

' Macro1 Macro

Selection.ApplyNames Names:=Array  ("ATL_BV_XP", "ATL_BV_XP..EUN", "ATL_PK_XP", _
    "ATL_PK_XP..EUN", "CHN_PK_IM", "CHN_PK_IM..EUN", "CHN_PK_IM..SHREUN", _
    "E15_AG_AH", "E15_AG_EPA", "E15_AG_SFP", "E15_AG_SFP..CF" _
    , "E15_APF_FE"), IgnoreRelativeAbsolute:=True, UseRowColumnNames:=True, _
    OmitColumn:=True, OmitRow:=True, Order:=1, AppendLast:=False
End Sub

我的问题是,因为我有大量已定义的名称(在 2000 年左右已经写了两倍),在宏代码中列出所有名称变得非常复杂。我认为可能的解决方法是创建一个包含代码中所有已定义名称的列表。有人知道如何做到这一点吗?我环顾四周,一些代码建议一个循环,而另一些代码则说可以提取一个列表。尽管如此,我还没有找到方法。

【问题讨论】:

  • 您是否在寻找 vba 对象模型“名称”:msdn.microsoft.com/en-us/library/ff196278%28v=office.14%29.aspx
  • 感谢 Christine Ross 的及时回答,我不是 vba 专家,目前我正在查看以下网站 msdn.microsoft.com/en-us/library/office/ff841280.aspx 可能使用最后一个示例,我可以:首先创建一个列表名称,然后将该列表应用于选定的公式范围,以用相应的名称替换单元格引用。
  • 那么您能否更清楚地定义您的问题?在阅读问题时,您似乎想通过使用一些下拉菜单等将名称插入公式。但是在阅读 cmets 时,您似乎已经在公式中有了名称,并且您想将它们更改为实际引用(例如,在您有的公式中)一个名字name1,你想用Sheet1!A1替换它吗?
  • 即使手动完成(“公式”>“应用名称”),我也无法更改我的虚拟公式。我怀疑一个错误是 open for over 10 years...
  • 感谢您的跟进和回复。实际上,即使在设法通过单击手动选择名称之后,Excel 也经常崩溃。我的解决方案是通过将公式导出为文本和引用来在 CSV 文件中创建字典,然后在 R 中应用三行代码替换。我的选择是留在 Excel 中,但使用替代方案肯定有些流程更容易。尽管如此,我会继续尝试这个选项,很可能应该有一个解决方案。最佳

标签: excel cell names vba


【解决方案1】:

msdn.microsoft.com 上的文档说

Names:要应用的名称数组。 如果省略此参数,则工作表上的所有名称都将应用于范围

https://msdn.microsoft.com/en-us/library/office/ff196578(v=office.15).aspx

接下来试试这个:

Selection.ApplyNames _
    IgnoreRelativeAbsolute:=True, UseRowColumnNames:=True, _
    OmitColumn:=True, OmitRow:=True, Order:=1, AppendLast:=False

这应该取决于Defined NamesScope 及其可见性。试试看,让我们知道结果。

【讨论】:

  • 感谢回复,我试了下面这段代码,还是不行。 Excel 会提示一条错误消息,指示找不到引用。我尝试改用 Cells.ApplyNames _ IgnoreRelativeAbsolute:=True, UseRowColumnNames:=True, _ OmitColumn:=True, OmitRow:=True, Order:=1, AppendLast:=False 错误信息是一样的,因此我认为通过不输入“名称”的值,它没有使用工作簿或工作表上定义的名称。我的另一个选择是创建一个数组,然后将此数组用作名称的值。尽管如此,它不起作用。
  • 嗯,这就是微软声称的,我希望它至少适用于具有相同作用域的定义名称和工作簿级别的名称,因此所有其他名称都可以通过单独的过程来处理.您用相应的“定义名称”替换工作簿公式中的所有“A1”引用的目标对我来说很有意义,事实上,我相信这是定义名称的全部目的。您是否可以将您的文件放在互联网上的某个地方,以便我可以详细了解“范围”和所涉及的定义名称的大小。干杯……
【解决方案2】:

它可能已经可供您使用。假设我们已经定义了名称​​CostProfitTax

输入公式时,打开公式选项卡,您可以随时下拉这些名称:

宏会很好,但我不知道如何在编辑过程中调用宏。

【讨论】:

  • 感谢您的输入,问题是我的文件有超过 2000 个名称,并且它已经作为对单元格的引用输入,所以理想情况下,我想一步用名称替换这些引用.
  • @user3279722 一个起点是选择一些单元格并运行ActiveCell.ListNames 以生成名称和引用表。然后,您可以编写某种查找/替换宏来遍历公式并进行更改。
  • 从来不知道.ListNames!这会在我上一个项目中为我节省很多时间:)
  • 感谢您的提示。我知道 .ListNames 创建了一个定义名称及其覆盖范围的列表。我认为应该可以从此列表中创建一个数组,并将其作为 ApplyNames 函数中“名称”的值输入。以下代码是出于这种目的编写的,但它不起作用 Sub Macro1() ' Macro1 Macro Dim Arr() As Variant Arr = Range("A5:A2100") Selection.ApplyNames _ Names:=Arr, IgnoreRelativeAbsolute: =True, UseRowColumnNames:=True, _ OmitColumn:=True, OmitRow:=True, Order:=1, AppendLast:=False End Sub 问题似乎是“范围”选项。
猜你喜欢
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
相关资源
最近更新 更多