【问题标题】:Referencing sheets in another workbook by codename using VBA [duplicate]使用 VBA 按代号引用另一个工作簿中的工作表 [重复]
【发布时间】:2014-03-08 01:29:31
【问题描述】:

我正在尝试使用 VBA 将数据从一个工作簿复制到我当前的工作簿。 InputBook 是一个工作簿对象,它引用我要从中提取数据的文件。主要问题与在 InputBook 工作簿中引用特定工作表有关。在 InputBook 中,我有一个名为 "Lines" 的工作表,其代号为 LINES。我希望通过它的代号来引用这个工作表,例如:

NumItems = WorksheetFunction.CountA(InputBook.LINES.Columns(1))

这显然行不通,我知道我可以使用以下任一方法使其发挥作用:

NumItems = WorksheetFunction.CountA(InputBook.Sheets("Lines").Columns(1))
NumItems = WorksheetFunction.CountA(InputBook.Sheets(2).Columns(1))

但是,我宁愿不使用其中任何一种方法,因为它们似乎不太健壮。有没有办法在另一个打开的工作簿中引用工作表对象的代号?谢谢。

【问题讨论】:

  • NumItems = WorksheetFunction.CountA(LINES.Columns(1)) 有效吗?如果您将其定义为 set LINES = InputBook.Sheets("Lines")
  • 我没有在代码的任何地方定义LINES;它只是手动设置的,永久作为该特定工作表的代号。我想完全避免将其定义为工作表名称的函数。
  • 迟到的答案,但我在此发布:yoursumbuddy.com/using-worksheet-codenames-in-other-workbooks

标签: vba excel


【解决方案1】:

您可以通过以下方式“破解”对另一个工作簿工作表代码名称的引用:

Sub UseCodeNameFromOutsideProject()
    Dim WS As Worksheet
    With Workbooks("InputBook .xls")
        Set WS = _
            .Worksheets(CStr(.VBProject.VBComponents("Lines").Properties(7)))
        debug.print WS.Name
    End With
 End Sub

您的WS 对象现在设置为在此示例中代号为“Lines”的工作表。


最初的灵感是here

【讨论】:

  • 你的方法有什么好处?为什么比Set Ws=InputBook.Sheets("Lines")更好?
  • @simoco 如果用户将工作表名称(而不是 CodeName)更改为“我的行”,您编写的代码将会中断。引用CodeName 意味着它唯一不起作用的情况是有人在VBA IDE 中编辑CodeName。因此,引用 CodeName 而不是工作表名称几乎总是有利的。
  • +1 你说得对,其实我第一次读的时候误解了这个问题:)
  • 感谢您的帮助。
【解决方案2】:

我可以将工作簿称为“我喜欢茶”,但 InputBook.I LIKE TEA.Columns(1) 不会删除它。

使用const 抽象名称或:

public enum InputSheets
   LINES = 2,
   GARMENTS = 4
end enum

允许:

InputBook.Sheets(InputSheets.LINES).Columns(1)

MyGetSheetFunction(InputBook, InputSheets.LINES)

您可以更进一步并使用包装类。

【讨论】:

  • 感谢您的帮助。如果我要使用这种方法,那么我将不得不关注 InputBook 文件中的工作表顺序,对吧?不幸的是,我不能确定它是否会保持原样。我试图避免对工作表位置或工作表名称的任何依赖,并希望直接链接到代号。不支持这种操作吗?
  • 姓名和职位是唯一的两个识别因素。您可以遍历所有工作表,在单元格中寻找一些独特的数据。
  • 好的,没关系。我希望代号是可访问的,但迭代搜索将是一个合理的解决方法。感谢您的所有帮助。
猜你喜欢
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
  • 1970-01-01
  • 2011-10-15
  • 2019-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多