Excel VBA参考在DoWhile循环的vlookup公式中命名工作簿

这似乎应该是简单的,但我真的坚持下去。

这是从目录中的多个工作簿中获取值并将其编译到一个工作簿中的代码。 我正在使用vlookup,因为值不总是在完全相同的单元格,但始终具有相同的行标题。 该代码打开目录中的每个工作簿并将其命名为wb。

我想在Vlookup公式中引用wb,但是在做这件事时遇到了麻烦。 当我尝试下面的代码,它给了我一个“循环没有做”的错误(但是当我运行相同的代码没有公式,只是复制和粘贴范围,这是好的)。 我也尝试在wb中命名一个范围并引用它。

'Target File Extension myExtension = "*.xls" 'Target Path with Ending Extention myFile = Dir(myPath & myExtension) 'Loop through each Excel file in folder Do While myFile <> "" 'Set variable equal to opened workbook Set wb = Workbooks.Open(fileName:=myPath & myFile) 'Put ID from filename into sheet If right(wb.Name, 5) = "h.xls" Then wb.Worksheets(1).Range("B16").Select ActiveCell.Value = Left(wb.Name, 9) 'Get value from wb using Vlookup MasterBook.Activate ActiveCell.Offset(1, 0).Select ActiveCell.FormulaR1C1 = "=VLOOKUP(""Sugar (g)"",wb!R18C1:R28C6,2,FALSE)" 'Close Workbook wb.Close SaveChanges:=True 'Get next file name myFile = Dir Loop 'Message Box when done MsgBox "Task Complete!" 

对于公式,您需要将工作簿的名称添加到string中。 当它是string的一部分时,不能引用variableswb。 您还需要参考工作簿和工作表名称。 完全合格的名称

所以我会build议如下这些名字:

 ActiveCell.FormulaR1C1 = "=VLOOKUP(""Sugar (g)"",[" & wb.name & "]" & wb.Worksheet(1).Name & "!R18C1:R28C6,2,FALSE)" 

将一个string作为公式使用时,不能直接使用Range对象 。 将Range.Address属性连接到string中。

 ActiveCell.FormulaR1C1 = "=VLOOKUP(""Sugar (g)"", " & _ wb.Worksheets(1).Range("A18:F28").address(External:=true, ReferenceStyle:=xlR1C1) & _ ", 2, FALSE)" 'or, ActiveCell.Formula = "=VLOOKUP(""Sugar (g)"", " & _ wb.Worksheets(1).Range("A18:F28").address(External:=true) & _ ", 2, FALSE)" 

我在这种情况下所做的是继续删除部分代码,直到它工作或给出不同的错误消息或其他东西。 这样你可以缩小到错误的地方。

Do While .. Loop看起来不错,我想你错过了End If

 If Right(wb.Name, 5) = "h.xls" Then wb.Worksheets(1).Range("B16").Select ActiveCell.Value = Left(wb.Name, 9) End If