在第B行我有一个代码列表,在 H2我有一个文件夹路径,其中包含这些列出代码的所有文件。
我正在尝试遍历此列表,激活相应的文件,将值复制并粘贴到原始文件中的相应选项卡中。虽然我似乎无法使这个代码工作。
有人可以告诉我如何修复它吗?
Sub Master_Recipe()
Dim MainLoop As Integer
Dim WB As Workbook
Dim WBmain As Workbook
Dim Fac As Integer
MainLoop = 2
Set WBmain = ActiveWorkbook
Do While MainLoop < 15
Fac = Range("B" & MainLoop).Value
Set WB = Range("H2").Value & Fac & " - Recipe Book" 'Object required error here
Workbooks(WB).Activate
Range("C:G").Copy
Workbooks("WBmain").Activate
Worksheets("Fac").Activate
Range("C:G").Paste
MainLoop = MainLoop + 1
Loop
End Sub
答案 0 :(得分:4)
有很多问题需要解决(所以我会在你提供澄清时更新答案)。
没有定义表单的 Range
非常糟糕。
Sub Master_Recipe()
Dim MainLoop As Integer
Dim WB As Workbook
Dim WBmain As Workbook
Dim Fac As Integer
Set WBmain = Application.Workbooks.Open("WBmain")
For MainLoop = 2 to 14
Fac = WBMain.Sheets("NAME OF SHEET with Data").Range("B" & MainLoop).Value
Set WB = Application.Workbooks.Open(WBMain.Sheets("NAME OF SHEET with Data").Range("H2").Value & Fac & " - Recipe Book")
WB.Sheets("Name of sheet in workbook").Range("C:G").Copy
WBMain.Sheets("Fac").Range("C:G").Paste
Next MainLoop
End Sub
答案 1 :(得分:2)
问题在于你说的话:
Set WB = Range("H2").Value & Fac & " - Recipe Book"
WB被声明为工作簿,但您试图使其等于字符串。
你想要的是:
Set WB = Application.Workbooks.Open(Range("H2").Value & Fac & " - Recipe Book")
假设创建的字符串包含文件的完整路径。
如果你这样做,你会遇到这条线的问题:
Workbooks(WB).Activate
这是因为WB被声明为工作簿,但您尝试将其用作sttring。你需要做任何一件事:
WB.Activate
或
Workbooks(Wb.Name).Activate
我认为您打算将WB声明为字符串,在这种情况下,您需要的唯一更改是:
Dim WB As String
假设文件已经打开。
**** **** EDIT
如果你这样做,你需要摆脱“Set”关键字,所以该行应该是:
WB = Range("H2").Value & Fac & " - Recipe Book"
答案 2 :(得分:1)
您尝试将字符串设置为工作簿对象,这就是您遇到错误的原因:
我添加了一个临时变量来显示问题的来源:
Sub Master_Recipe()
Dim MainLoop As Integer, _
WB As Workbook, _
WBmain As Workbook, _
Fac As Integer, _
TpStrWb As String
MainLoop = 2
Set WBmain = ActiveWorkbook
Do While MainLoop < 15
Fac = WBmain.Sheets("Fac").Range("B" & MainLoop).Value
'---------Changes here-------------
TpStrWb = WBmain.Sheets("Fac").Range("H2").Value & Fac & " - Recipe Book"
Set WB = Workbooks.Open(TpStrWb)
'---------Changes here-------------
WB.Range("C:G").Copy
WBmain.Sheets("Fac").Range("C1").Paste
MainLoop = MainLoop + 1
Loop
End Sub