Excel 如何为工作簿声明灵活变量?

Excel 如何为工作簿声明灵活变量?,excel,vba,Excel,Vba,我想以某种方式声明动态工作簿变量,以便在不引起错误的情况下更改工作簿文件名。我最初的想法是使用Set Variable=ActiveWorkbook,但这似乎会产生一些特殊的错误: Set WkBk1 = ActiveWorkbook MsgBox (WkBk1.Name) WkBk1.Worksheets(1).Select 上述代码本身运行良好。然后,在相同的过程中,我打开一个新工作簿并运行以下操作: Set WkBk2 = ActiveWorkbook

我想以某种方式声明动态工作簿变量,以便在不引起错误的情况下更改工作簿文件名。我最初的想法是使用
Set Variable=ActiveWorkbook
,但这似乎会产生一些特殊的错误:

    Set WkBk1 = ActiveWorkbook

    MsgBox (WkBk1.Name)
    WkBk1.Worksheets(1).Select
上述代码本身运行良好。然后,在相同的过程中,我打开一个新工作簿并运行以下操作:

    Set WkBk2 = ActiveWorkbook

    MsgBox (WkBk2.Name)
    WkBk2.Worksheets(1).Select
    WkBk1.Worksheets(1).Select
我在最后一行得到一个错误,“运行时错误1004;工作表类的select方法失败”。有人能解释这个问题的根源吗?我猜这与使用ActiveWorkbook声明变量有关,或者与在工作簿之间切换的错误方法有关

我应该提到,打开的文件是在excel中打开的.dat文件

最后,我希望有代码将两个工作表(无论文件名如何)分配给各自的变量。然后我想在两个工作簿之间复制和粘贴数据

实际代码如下。问题在于for循环中的copy语句。
“运行时错误'438'对象不支持此属性或方法”。我以前使用过类似的语法,但我不明白为什么它在这里不起作用

Sub Import3()
    ' Imports TSS samples from backlog

    Dim TSS As Workbook, Backlog As Workbook
    Dim Sample As Range, SearchRange As Range
    Dim Count As Long

    Set TSS = ActiveWorkbook

    ChDir ("C:\lwuser6")
    Workbooks.OpenText Filename:="C:\lwuser6\BACKLOG.DAT", Origin:=437, _
           StartRow:=1, DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 1), Array(7, _
           1), Array(68, 1), Array(78, 1), Array(86, 1), Array(126, 1), Array(150, 1)), _
           TrailingMinusNumbers:=True
        ' for some reason _ has to be in between "Array(7, _1)"
            ' Can't be between list elements of encompassing list "Array"
    Set Backlog = ActiveWorkbook

    Set SearchRange = Backlog.Worksheets("BACKLOG").Range(Cells(1, 1), _
        Cells(Rows.End(xlDown).Row, 1))
    Count = 14

    For Each Sample In SearchRange
        Backlog.Range(Sample(1, 1), Sample(1, 3)).Copy
        TSS.Range("G" & Count).PasteSpecial (xlValues)
        Count = Count + 2
    Next

End Sub

我强烈建议您运行代码(它是免费的、开源的;我管理项目),因为它不仅解释了您所询问的具体错误,而且还可以防止您陷入许多常见的初学者陷阱

问题在于
Backlog
Workbook
对象,而
Workbook
没有
范围
成员:

未找到成员

对RuberDuck无法解析的扩展接口进行成员访问调用,或者找不到该成员。如果VBA无法在运行时解析该类型,将引发错误438。[……]

您需要一个
工作表
才能访问
范围
工作簿
将无法工作

请注意,随后的
TSS.Range
调用同样是非法的;-)


拿这个来说:

并通过捕获由
工作簿返回的
工作簿
对象,摆脱对打开工作簿的副作用的依赖。打开

Set Backlog = Workbooks.OpenText(Filename:="C:\lwuser6\BACKLOG.DAT", Origin:=437, _
       StartRow:=1, DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 1), Array(7, _
       1), Array(68, 1), Array(78, 1), Array(86, 1), Array(126, 1), Array(150, 1)), _
       TrailingMinusNumbers:=True)
不管怎样,
工作簿。OpenText
不会返回
工作簿
对象引用

那么就拿这个,

并将其拉入局部变量:

Dim backlogSheet As Worksheet
Set backlogSheet = Backlog.Worksheets("BACKLOG")
现在,您可以在需要特定表格的任何地方使用它:

With backlogSheet
    Set SearchRange = .Range(.Cells(1, 1), .Cells(.Rows.End(xlDown).Row, 1))
End With
…虽然我向
工作表提供
范围
对象,但Range
属性感觉有点错误(如果
示例
范围不在
背景工作表
上,则会引发错误1004):

不确定您要在
TSS
工作簿中粘贴哪些特定的工作表,但同样的原则也适用。也就是说,您甚至不需要使用剪贴板:

tssSheet.Range("G" & count & ":I" & count).Value = _
    backlogSheet.Range(Sample(1, 1), Sample(1, 3)).Value

这可能不是你一直在寻找的,但应该可以解决你的问题。谢谢。作为一个新用户,我离使用Select越来越远了,但有时我仍然使用它进行调试。上面带有select的行实际上不在我的代码中,我只是想它们可能会说明问题的根源。也就是说,我很好奇除了.select或.activate之外,是否还有更好的方法将用户带到特定的工作簿/工作表。我一定会查看该链接。注意:不要使用
Set WkBk2=ActiveWorkbook
,而是使用
Set WkBk2=Workbooks.Open(yourpath)
…我认为您必须选择/激活工作簿,然后选择工作表。您不能在非活动工作簿上选择工作表。仅供参考,当您完全放开
时,您有许多工作表将开始导致问题。选择
Doh!!!!我应该知道,不要在没有工作表的情况下尝试运行一个范围。我认为,将变量指定给工作表而不是工作簿将有助于保持一致,如您所示。出于某种原因,在运行变量声明和
Set Backlog=Workbooks.opentext
line时,我得到了一个编译错误“expected function or variable”。不管怎样,这些都是非常好的东西,我很高兴能将它们整合起来。我也将查看Rubberduck资源。谢谢
With backlogSheet
    Set SearchRange = .Range(.Cells(1, 1), .Cells(.Rows.End(xlDown).Row, 1))
End With
backlogSheet.Range(Sample(1, 1), Sample(1, 3)).Copy
tssSheet.Range("G" & count & ":I" & count).Value = _
    backlogSheet.Range(Sample(1, 1), Sample(1, 3)).Value