【问题标题】:Access Worksheet by name including ThisWorkbook按名称访问工作表,包括 ThisWorkbook
【发布时间】:2020-07-22 19:48:54
【问题描述】:

这困扰了我一段时间。我想按名称访问工作表,而不是“如何在 Excel 中命名工作表”。我还想在该行中包含ThisWorkbook,以消除使用同名工作表打开多个工作簿的可能性。但是我收到一个错误:

我已将我的工作表命名为 CalculationItem1。为什么跟随不起作用?

Sub TestTest()
    ThisWorkbook.CalculationItem1.Range("A1:A2").Copy
End Sub

出现以下错误:


以下作品,但有可能在另一个打开的工作簿中具有相同名称的工作表?那么会出现错误吗?

Sub TestTest()
    CalculationItem1.Range("A1:A2").Copy
End Sub

这里是名字:

【问题讨论】:

  • CalculationItem1 是您的电子表格名称还是引用您的工作表的变量名称?

标签: excel vba


【解决方案1】:

只要工作表与代码(“ThisWorkbook”)位于同一工作簿中,您就可以通过其代码名称访问工作表。即使工作簿未处于活动状态也是如此 - 就像您有一个具有该名称的对象变量。因此使用CalculationItem1.Range("A1:A2").Copy 将始终引用代号为CalculationItem1 的工作表ThisWorkbook

如果您想通过代号访问另一个工作簿的工作表,则必须迭代工作表并查找属性 CodeName(如 FaneDuru 在他的回答中所示)。

【讨论】:

  • 所以这意味着在使用CodeName的情况下我基本上不需要ThisWorkbook,因为它总是ThisWorkbook?即使我将打开两个具有两个相同 CodeName 的 Excel 工作簿,两个工作簿之间也不会出现错误或不匹配?
  • 如果您使用代号,并且只要代码所在的工作簿(具有该名称)中有一个工作表,它将始终引用该工作簿中的工作表(即使工作簿与该代码未激活)。即使您打开了 2 个工作簿,并且它们都有同名的工作表,它仍然会使用代码引用工作簿中的工作表
【解决方案2】:

不确定是否可以使用特定的CodeName 直接定义工作表。

但您可以避免混淆这样的工作表和另一个活动工作簿,名称相似,使用如下函数:

Function SetShByCN(strCodeName As String, wb As Workbook) As Worksheet
 Dim sh As Worksheet
 For Each sh In wb.Worksheets
    If sh.CodeName = strCodeName Then Set SetShByCN = sh: Exit Function
 Next
End Function

它必须适合在不存在此类工作表的情况下发送警告,或返回Nothing,并在调用函数的代码中进行检查。这只是出于测试原因...

它将像在下一个测试代码中那样完成被调用的工作:

Sub testSetShByCN()
  Dim wks As Worksheet
  Set wks = SetShByCN("CalculationItem1", ThisWorkbook)
  Debug.Print wks.Name
  sh.Range("A1:A2").Copy
End Sub

【讨论】:

  • 谢谢你!这将有助于将来使用 CodeNames 遍历工作表。
  • @hatman:很高兴我能帮上忙!我在我的工作表中使用了这种方式,我相信不可能返回一种 VBComponent Parent 属性,因为它不存在。但我不能发誓这肯定是不可能的......我应该明白这段代码不是你期望的答案吗?
  • 这有点超出我的要求。我主要想知道我是否应该在 CodeName 的情况下使用ThisWorkbook,因为我对您必须指定范围的详细程度以防止将来出现错误感到有些困惑。无论如何,您的回答是对我的回答的一个很好的补充。一旦我需要在某个 Workbook 中找到特定的 CodeName,我稍后会参考它。
【解决方案3】:

在您的第一段代码中,您需要告诉 Excel 您指的是工作表:

Sub TestTest()
    ThisWorkbook.WorkSheets("CalculationItem1").Range("A1:A2").Copy
End Sub

问候,

【讨论】:

  • 这是基本方法。但是,现在如果您将工作表重命名为其他名称,您的所有 VBA 代码都会出错。通过在 VBE 中重命名工作表,您可以避免这种情况。因此,您的工作表可以重命名为您想要的任何内容,而不会影响您的代码。我的问题更像是如何包含 ThisWorkbook。
  • 所以您想在不使用名称或位置的情况下引用工作表项?
  • CalculationItem1.Range("A1:A2").Copy 以下作品但有可能在另一个打开的工作簿中具有相同名称的工作表?那么会出现错误吗?
  • 我想使用名称并包含 ThisWorkbook 这将是指向 ThisWorkbook 和此 Worksheet 的最终解决方案。
猜你喜欢
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多