【问题标题】:I need to get the CODENAME (first) of a Worksheet so then I can check its NAME [duplicate]我需要获取工作表的代码名称(第一个),然后我可以检查它的名称 [重复]
【发布时间】:2020-09-19 03:48:13
【问题描述】:

我有一个包含 6 个工作表的工作簿。

想象一下“Alpha”、“Beta”、“Gama”、“Delta”、“Epsilon”、“Zeta”。

按此顺序,它们的索引为 Alpha= 1 - Beta = 2... Zeta = 6

但是,如果我将 Alpha 移动到 Beta 之后的位置,索引号也会改变,所以我不应该通过它们的索引号来引用 WS。 现在,如果用户更改工作表名称,则代码(如果通过工作表名称设置 WS)也将失败。 唯一不能由用户“正常”更改的是工作表 CODE.NAME。

再次... 代号“Sheet1” - 名称“Alpha” - 索引“1”

代号“Sheet2” - 名称“Beta” - 索引“2”

代号“Sheet3” - 名称“Gama” - 索引“3” ...等等。

即使我更改了工作表的位置(索引)或工作表的名称,如果我通过它们的 CODE.NAME 来引用它们,它们位于什么位置或它们的名称是什么都没关系。

所以,我想要的只是拿起工作表的名称,使用它的 CODE.NAME 到达那里... 像这样的:

Dim WB1 as Workbook
Dim WS1 as Worksheet
Dim WSNAME as String
Set WB1 = ThisWorkbook
Set WS1 = (here I need code to pick the "Sheet1" worksheet to variable WS1) (*)

WSNAME = WS1.Name

注意:最终结果应存储在 WS1 中工作表的名称(“ALPHA”)。如果用户更改了该名称,它应该仍然可以工作,存储新名称。我必须首先通过它的 CODE.NAME(不可更改)获取工作表,然后我才能检查它的 NAME。

(*) 我试过了……

Set WS1 = WB1.Sheet1
Set WS1 = WB1.Sheet1.CodeName
Set WS1 = WB1.Sheets(Sheet1)
Set WS1 = WB1.Sheets("Sheet1").CodeName

没有任何效果...

但是如果我使用

Set WS1 = WB1.Sheets("ALPHA").CodeName

它可以工作,但是我遇到了同样的问题...如果用户将“ALPHA”更改为“ALFA”,一切都会停止工作...

任何帮助将不胜感激。 提前致谢!

--- 编辑添加图片 -------------------------------------

我的 Excel 是葡萄牙语,所以不是“Sheet1”、“Sheet2”……它创建的工作表为“Planilha1”、“Planilha2”、“Planilha3”……这些“Planilhas”以任何名称命名用户想要...

看这张图:

突出显示的工作表的 CODE.NAME 是“Planilha5”,名称是“心脏变量”。我需要在一个表(在另一个工作表中)中找到“心脏变量”,以获取该表中的行号,该表的所有引用都存储在该表中。如果我在工作表名称所在的表格列中进行简单查找,然后搜索“心脏变量”,它将正常工作。

看,我在第 15 行找到了我要查找的内容(“心脏变量”)!

但如果用户更改工作表名称...

回到第一张图片。看右边的代码。 (HEALTHY 以前 DIM 为 ThisWorkbook)有一个条目说 ESTAABA = "Cardiac variables",然后我将 WS3 设置为 ESTAABA 的内容(我本可以直接完成...)。但我不想在代码中保留工作表的名称,因为如果用户更改 TAB 名称(如上例从“心脏变量”更改为“心脏 VAR”),它将不再起作用。

但是,如果我在上一个表中查找“Planilha5”出现的位置,一切都会好起来的,无论用户想要在工作表中使用的名称是什么。

问题是我无法将 WS3 设置为 Planilha5 工作表。如果我说 Set WS3 = HEALTHY.Sheets("Cardiac variables") 它可以工作。如果我说 Set WS3 = HEALTHY.Planilha5, or = Planilha5, or = Sheets(Planilha5) 它不起作用。

在简历中,我不想在代码中的任何地方使用“心脏变量”(或工作表的其他名称 - 名称可以更改...)。

我想将 WS3 设置为 Planilha5 工作表。 忘记引用“心脏变量”,忘记工作表索引号,因为用户可以更改名称,也可以更改工作表的位置(通过移动或添加/删除以前的工作表)。

感谢您的耐心等待!

【问题讨论】:

  • Set ws1 = Sheet1.
  • 只能引用运行代码的工作簿中工作表的代码名称,因此不允许工作簿引用。
  • 要实现这一点,您需要一种稍微不同的方法.... 稍后发布答案。
  • Set WS3 = Planilha5 将工作。这就是本上面的建议
  • @BigBen:是的,这看起来是最好的选择。只等他确认我上面的最后一条评论......

标签: excel vba worksheet


【解决方案1】:

我不确定我是否正确地回答了您的问题。但根据我的理解,这是您想要的。

Module中添加这个函数

Function GetSheetByCodeName(ByVal CodeName As String) As Worksheet
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        If ws.CodeName = CodeName Then
            Set GetSheetByCodeName = ws
            Exit Function
        End If
    Next
End Function

然后您可以在需要引用任何工作表时轻松调用此函数。

例如

'-- test function
Sub Test()
    Dim ws As Worksheet
    Set ws = GetSheetByCodeName("Sheet1")
    MsgBox ws.CodeName & " -----  " & ws.Name
End Sub

这就是你所看到的......

【讨论】:

  • >BINGO!
  • 这太过分了。如果它在ThisWorkbook 中,则只需使用Sheet1。这是双重重复。
  • @BigBen,我对这个问题的解释与您对它的解释略有不同。我认为“Sheet1”被存储为一个字符串,我从Set WS1 = (here I need code to pick the "Sheet1" worksheet to variable WS1) (*) 行假设这一点似乎我是正确的,正如上面cmets 中提到的OP 中提到的>BINGO!< This one worked like a charm! ...。不过,如果您不同意,请随意投反对票(如果您还没有这样做的话)。
  • 当您执行Set ws3 = Planilha5 时会发生什么?错误信息是什么?这正是你应该如何使用代号......所以如果它不起作用,那么@RubensSayegh 正在发生一些事情。正如链接的副本所示,这是您应该采用的方法,not 将代号用作字符串,这是一个全方位的 想法。或者,如果您真的只需要工作表 name,请参阅 Planilha5.Name 并跳过使用工作表变量。
  • 使用代号时,其前不应有任何工作簿参考。只是Set WS3 = Planilha5@RubensSayegh。我重申这个答案是多余的(而且这个问题是重复的)。
猜你喜欢
  • 1970-01-01
  • 2015-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多