【问题标题】:VBA Formula Application/Object Defined ErrorVBA 公式应用程序/对象定义错误
【发布时间】:2019-01-04 23:57:18
【问题描述】:

我知道有很多这样的问题;但我已经尝试从我见过的各种东西中实现一些东西,但还没有找到正确的结构。我不断收到应用程序/对象定义的错误。我确定是引号,但我似乎无法弄清楚我在哪里有太多与不够。最终目标是让这个公式出现在一定范围的行(newrows 变量)之后,并在它填满每一行之后动态更新。

我尝试删除字符串部分周围的额外引号,但它随后在代码开头附近出现“预期:语句结束”错误。当我在记事本 ++ 中查看它时,它看起来是正确的,但在 excel 中运行宏时仍然会在 VBA 本身中出现错误。

Range("R" & newrows & ":R1000").Formula = "=iferror(IF(""E""" & newrows & "= ""Planning"",VLOOKUP(""D""" & newrows & ",DataCheck4!A:F,3,FALSE),IF(""E""" & newrows & "=""Fieldwork"",VLOOKUP(""D""" & newrows & ",DataCheck4!A:F,4,FALSE),IF(""E""" & newrows & "=""Reporting"",VLOOKUP(""D""" & newrows & ",DataCheck4!A:F,5,FALSE),IF(""E""" & newrows & "=""Wrap Up"",VLOOKUP(""D""" & newrows & ",DataCheck4!A:F,6,FALSE),IF(""E""" & newrows & "=""Proj. Mgmt"",VLOOKUP(""D""" & newrows & ",DataCheck4!A:F,6,FALSE),"""")))))"

代码应该根据行中单元格的值(E 列)和项目名称(D 列)来查找值。 newrows 是由动态列表生成的数值变量。工作表的顶部有我不想覆盖的现有任务,但我希望该公式在该列表最后一行之后的所有单元格中。我一直在学习 VBA,因为我一直在做这个项目,所以这可能是我还没有遇到过的东西,所以我很感激帮助!

ETA:今天早上我尝试将带有 newrows 的序列转换为带有列字母的变量,并得到相同的应用程序定义错误。

firstloc = "E" & newrows
secondloc = "D" & newrows
Range("R" & newrows & ":R1000").Formula = "=iferror(IF(" & firstloc & "= ""Planning"",VLOOKUP(" & secondloc & ",DataCheck4!A:F,3,FALSE),IF(" & firstloc & "=""Fieldwork"",VLOOKUP(" & secondloc & ",DataCheck4!A:F,4,FALSE),IF(" & firstloc & "=""Reporting"",VLOOKUP(" & secondloc & ",DataCheck4!A:F,5,FALSE),IF(" & firstloc & "=""Wrap Up"",VLOOKUP(" & secondloc & ",DataCheck4!A:F,6,FALSE),IF(" & firstloc & "=""Proj. Mgmt"",VLOOKUP(" & secondloc & ",DataCheck4!A:F,6,FALSE),"""")))))"    

【问题讨论】:

  • 尝试 ...IF(E" & newrows ... 并在其他地方重复该更改。
  • Range("R" & newrows & ":R1000").Formula = 替换为Debug.Print,然后运行它并查看打印到即时窗格中的内容 (Ctrl+G) - 然后获取该输出,复制并粘贴到单元格中 - Excel会抱怨公式无效;在 Excel 中修复公式,然后返回代码并进行相应修复。
  • 嗨,Mathieu,它在行调用周围显示“”:IE If("E"23=.......但是,如果我删除那组引号,我会得到预期的编译错误语句结束。
  • 您想要的输出字符串中的每个双引号 " 都需要转义,即加倍;所以a = """" 正在分配一个包含单个" 双引号字符的字符串文字。原因是 " 字符恰好是 字符串文字 分隔符标记,因此如果该字符需要出现在字符串文字中,则需要以某种方式进行转义:在 VBA 中,您可以转义 double通过将它们加倍来引用,就是全部。

标签: excel vba


【解决方案1】:

蛇式

如果 DE 是列字母,那么

Sub SnakeFormula()

    Range("R" & newrows & ":R1000").Formula = "=iferror(IF(E" & newrows _
            & "=""Planning"",VLOOKUP(D" & newrows _
            & ",DataCheck4!A:F,3,FALSE),IF(E" & newrows _
            & "=""Fieldwork"",VLOOKUP(D" & newrows _
            & ",DataCheck4!A:F,4,FALSE),IF(E" & newrows _
            & "=""Reporting"",VLOOKUP(D" & newrows _
            & ",DataCheck4!A:F,5,FALSE),IF(E" & newrows _
            & "=""Wrap Up"",VLOOKUP(D" & newrows _
            & ",DataCheck4!A:F,6,FALSE),IF(E" & newrows _
            & "=""Proj. Mgmt"",VLOOKUP(D" & newrows _
            & ",DataCheck4!A:F,6,FALSE),""""))))))"

End Sub

【讨论】:

  • 您好,谢谢您,不幸的是,它给了我之前删除无关的“”时遇到的相同的应用程序定义错误。
  • @M. R. 我认为您可能缺少一个右括号。为 iferror 添加第六个 (6th)。
  • 我添加了第六个,不幸的是仍然是应用程序定义的错误。
【解决方案2】:

我想我终于让它按我的预期工作了。谢谢大家的帮助。它缺少括号(感谢 VBasic2008)。它似乎也不喜欢列字母和变量的组合,所以我在序列之外做了。最后,我删除了 iferror 并仅使用 if 语句的 else 结果在不满足任何条件时返回 null。

Dim firstloc As String
Dim secondloc As String
Dim varloc As String

firstloc = "E" & newrows
secondloc = "D" & newrows
varloc = "R" & newrows
Range("R" & newrows & ":R1000").Formula = "=IF(" & firstloc & "= ""Planning"",VLOOKUP(" & secondloc & ",DataCheck4!A:F,3,FALSE),IF(" & firstloc & "=""Fieldwork"",VLOOKUP(" & secondloc & ",DataCheck4!A:F,4,FALSE),IF(" & firstloc & "=""Reporting"",VLOOKUP(" & secondloc & ",DataCheck4!A:F,5,FALSE),IF(" & firstloc & "=""Wrap Up"",VLOOKUP(" & secondloc & ",DataCheck4!A:F,6,FALSE),IF(" & firstloc & "=""Proj. Mgmt"",VLOOKUP(" & secondloc & ",DataCheck4!A:F,6,FALSE),"""")))))"

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多