使用VBA按代号引用其他工作簿中的工作表

使用VBA按代号引用其他工作簿中的工作表,vba,excel,Vba,Excel,我正在尝试使用VBA将数据从一个工作簿复制到当前工作簿。InputBook是一个工作簿对象,引用我要从中提取数据的文件。主要问题与在InputBook工作簿中引用特定工作表有关。在InputBook中,我有一个名为“Lines”的工作表,其中有代码名行。我希望通过其代码名引用此工作表,例如: NumItems = WorksheetFunction.CountA(InputBook.LINES.Columns(1)) 这显然不起作用,我知道我可以使用以下任一方法使其发挥作用: NumItems

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

NumItems = WorksheetFunction.CountA(InputBook.LINES.Columns(1))
这显然不起作用,我知道我可以使用以下任一方法使其发挥作用:

NumItems = WorksheetFunction.CountA(InputBook.Sheets("Lines").Columns(1))
NumItems = WorksheetFunction.CountA(InputBook.Sheets(2).Columns(1))
然而,我宁愿不使用这两种方法中的任何一种,因为它们似乎不太可靠。有没有办法在另一个打开的工作簿中引用工作表对象的代码名?谢谢。

我可以将工作簿称为“我喜欢茶”,但
输入本。我喜欢茶。第(1)列
不会删掉它

常量
提取名称,或:

public enum InputSheets
   LINES = 2,
   GARMENTS = 4
end enum
允许:

InputBook.Sheets(InputSheets.LINES).Columns(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”的工作表



最初的灵感是。

NumItems=WorksheetFunction.CountA(line.Columns(1))work吗?如果您将其定义为
set LINES=InputBook.Sheets(“行”)
我在代码中的任何地方都没有定义行,则应该是这样;它只是手动设置的,永久地作为特定工作表的代码名。我不想完全把它定义为工作表名称的函数。迟来的回答,但我在上面贴了:你的方法有什么好处?为什么它比设置Ws=InputBook.Sheets(“行”)更好?@simoco如果用户将工作表名称(而不是代号)更改为“我的行”,您编写的代码将中断。引用
代码名
意味着只有当有人在VBA IDE中编辑
代码名
时,它才会不起作用。出于这个原因,参考
代码名
而不是工作表名几乎总是有好处的。+1你是对的,实际上我在第一次阅读时误解了这个问题:)谢谢你的帮助。谢谢你的帮助。如果我要使用这种方法,那么我必须关心InputBook文件中的工作表顺序,对吗?不幸的是,我不能确定它是否会保留。我试图避免对工作表位置或工作表名称的任何依赖,并希望直接链接到代码名。是否不支持这种类型的操作?姓名和职位是唯一的两个识别因素。你可以迭代所有的工作表,在一个单元格中寻找一些独特的数据。好的,没关系。我希望代码名是可访问的,但迭代搜索将是一个合理的解决办法。谢谢你的帮助。
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