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