通过文件循环
在行BI有一个代码列表,在H2中我有一个文件夹path ,其中包含这些列出的代码的所有文件。
我试图循环访问这个列表,激活相应的文件,将这些值复制并粘贴到原始文件中相应的选项卡中。 虽然我似乎无法得到这个代码工作。
有人可以告诉我如何解决它?
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
有很多问题需要解决(所以我会在你提供的解释中更新答案)。
没有定义表单的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
问题在于你说的那句话:
Set WB = Range("H2").Value & Fac & " - Recipe Book"
WB被声明为一个工作簿,但你试图使它等于一个string。
你想要的是:
Set WB = Application.Workbooks.Open(Range("H2").Value & Fac & " - Recipe Book")
假定创build的string包含文件的完整path。
如果你这样做,你会遇到以下问题:
Workbooks(WB).Activate
这是因为WB被声明为工作簿,但是您试图将其用作sttring。 您需要执行以下操作之一:
WB.Activate
要么
Workbooks(Wb.Name).Activate
我想你打算把WB声明为一个string,在这种情况下,你需要的唯一改变是:
Dim WB As String
假定文件已经打开。
****编辑****
如果你这样做,你需要摆脱“设置”关键字,所以行应该是:
WB = Range("H2").Value & Fac & " - Recipe Book"
您试图将string设置为工作簿对象 ,这就是为什么您有错误:
我添加了一个临时variables来告诉你问题来自哪里:
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