【问题标题】:Application-defined or object-defined error with formula VBA使用公式 VBA 的应用程序定义或对象定义错误
【发布时间】:2017-05-29 07:49:02
【问题描述】:

我是 VBA 新手,遇到了

应用程序定义或对象定义的错误

在做的时候。

Set twb = ThisWorkbook
Set extwbk = Workbooks.Open("abc.xlsx")
Set x = extwbk.Worksheets("FILTERED").Range("$A:$A")

With twb.Sheets("FILTERED")

    For rw = 9 To .Cells(Rows.Count, 1).End(xlUp).Row
        .Cells(rw, 34).Formula = "=IF(ISERROR(VLOOKUP(.Cells(rw, 1).Value2, x, 1, False))=TRUE,""New"",""Old"")"
    Next rw

End With

这可以手动完成,但我被要求通过编程来完成。它只是简单地将 AH9 中的公式应用于数据的末尾。请问for循环有没有编码错误?

提前致谢。

【问题讨论】:

    标签: vba excel formula vlookup


    【解决方案1】:

    不要将 VBA 变量放在字符串公式中。 在 VBA 中解析它们并将结果注入公式:

     .Formula = "=IF(ISERROR(VLOOKUP(" & .Cells(rw, 1).Value2 & "," & _
       x.Address(External:=True) & ", 1, False))=TRUE,""New"",""Old"")"
    

    附言不要使用=TRUE 来检查布尔值,If ISERROR(Something) = TRUE 之类的东西没有意义。只需If ISERROR(Something)

    .Formula = "=IF(ISERROR(VLOOKUP(" & .Cells(rw, 1).Value2 & "," & _
      x.Address(External:=True) & ", 1, False)),""New"",""Old"")"
    

    如果您希望公式是动态的,并在将来(rw, 1) 处的单元格发生变化时进行相应的重新计算,请使用.Address 而不是.Value2

    '                                                vvvvvvvv
    .Formula = "=IF(ISERROR(VLOOKUP(" & .Cells(rw, 1).Address & "," & _
      x.Address(External:=True) & ", 1, False)),""New"",""Old"")"
    

    【讨论】:

    • 感谢您的帮助。它成功地工作。还有一个问题:因为这段代码会导致在 A9 中查找确切的值。我不知道为什么将精确值更改为单元格 A9 会导致结果不同。
    • @AngYiwei 如果您希望公式是动态的并在A9 更改时重新计算,请将.Cells(rw, 1).Value2 替换为.Cells(rw, 1).Address。那是你要的吗? (请参阅答案的最后一部分)
    • 感谢您的回答。我通过将其替换为 " & "$A" & rw & " 来做到这一点,并且两者都可以正常工作。但是我担心的是相同的单元格(带有公式),一个具有精确值,一个具有位置,在 vlookup 后都会给出两种不同的结果。
    • @AngYiwei 这很奇怪。那个单元格中有什么样的数据? (A9)
    • A9 中有一个公式是基于 B9,E9 和 AC9 的。我想知道是不是公式造成的。 [=IF(E9="A",IF(LEFT(AC9,2)="B",LEFT(AC9,12),B9),B9)]。
    猜你喜欢
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多