【问题标题】:Excel VBA reference named workbook in vlookup formula in DoWhile loopExcel VBA 参考在 Do While 循环中的 vlookup 公式中命名工作簿
【发布时间】:2016-07-13 14:25:56
【问题描述】:

这看起来应该很简单,但我真的坚持下去了。

这是从目录中的多个工作簿中获取值并将它们编译到一个工作簿中的代码。我使用 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!"

【问题讨论】:

    标签: vba excel loops vlookup


    【解决方案1】:

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

    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
    

    【讨论】:

    • 感谢您的提示,它解决了我的第一个问题。
    【解决方案2】:

    将用作公式的字符串放在一起时,不能直接使用Range object。将Range.Address property 连接到字符串中。

    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)"
    

    【讨论】:

    • 我喜欢您将 .address 与 External 属性一起使用。好电话。
    • 感谢您的解释,这在概念上是有道理的。我玩弄了该代码,但不断收到“应用程序定义或对象定义的错误”。
    • 对不起,我怀疑 xlR1C1 范围会导致问题,应该测试一下。在任一公式中使用wb.Worksheets(1).Range("A18:F28").Address(...)$ 锚点在 Range("A18:F28") 中不是必需的,但它们由 .Address.. 放入
    【解决方案3】:

    对于公式,您需要将工作簿的名称添加到字符串中。当它是字符串的一部分时,您不能引用变量 wb。您还需要引用工作簿和工作表名称。

    所以我建议使用以下方法来获取这些名称:

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

    【讨论】:

    • 谢谢,效果很好!看到以这种方式排列的工作簿和工作表名称很有意义
    • 根据我的经验,单引号(或 ticks)应始终围绕工作表名称。如果它们不是必需的(例如,工作表名称不包含一个或多个空格),那么它们不会造成伤害。如果由于工作表名称中的空格而需要它们并且不存在,则公式被破坏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多