【问题标题】:Formula works with manual input but not through VBA公式适用于手动输入,但不适用于 VBA
【发布时间】:2018-11-12 16:18:39
【问题描述】:

我有一个如下所示的数据集:

A   B   C
1   10  145
1.1 11  0
1.2 12  0
1.3 13  0
2   14  145
2.1 15  0
2.2 16  0
3   17  145
3.1 18  0
3.2 19  0

表格中的A列和B列是我的输入数据,C列是用以下公式创建的:

=IF(MOD([@A],1)=0,SUM([B]),0)

这是一个简化的示例,而不是我使用的实际公式,但它足以作为一个最小的可重现示例。

当我手动将此公式输入到编辑栏中时,它会完全按预期工作并生成上表中的值。但是,当我尝试使用 VBA 将此公式输入到单元格中时,它会失败。它给了我一个错误:

错误:名称无效

如果我然后单击单元格并进入编辑栏,就好像我想手动操作公式并立即按 Enter 键,而不实际更改公式中的任何内容,则错误消失并且结果再次像以前一样正确显示.

我用来通过 VBA 将公式输入单元格的代码如下:

Sub InputFormula()
    Set srcTable = ActiveSheet.ListObjects(1)
    fmtString = "=IF(MOD([@A],1)=0,SUM([B]),0)"
    Range(srcTable.Name & "[C]").Formula = fmtString
End Sub

为什么明显正确的公式在通过 VBA 应用时会被破坏,我该如何更正它以便通过 VBA 进行应用?

我在 Windows 10 x64 上使用 Excel 2019。

【问题讨论】:

  • 我无法重现。我假设这个数据集是一个列表对象/表?
  • 在 Excel 2016 中按预期工作。
  • 我也没有,您的 Listobject 列有不同的名称吗?即 A B C,在 ListObject 之外不起作用
  • 我编辑了问题以反映我使用的是 Excel 2019。数据集位于一个表中。我使用上面提供的完全相同的示例进行了测试,包括值和列名。
  • 考虑将最后一行更改为Range(srcTable.Name & "[C]").Formula = 0 -- 以确定提供给Range 的参数是问题还是公式本身。

标签: excel vba


【解决方案1】:

我找到了解决问题的方法:

我使用的是非英文版的 Excel。当我尝试在 VBA 中使用本地化函数名称时,会出现问题中描述的错误。但是,当我使用相应的英文名称时,一切都按预期进行。

这是违反直觉的,因为当我通过 VBA 应用条件格式时,我必须使用本地化的函数名称。使用那里的英文是行不通的。

【讨论】:

  • 您选择了一个不好的示例,因为您的示例公式是一个有效的en-us 公式,并且正如您所说的被界面接受,我假设您使用了en-us Excel。是的,.Formula 仅接受 en-us 公式,.FormulaLocal 接受本地化公式。对于仅适用于 en-us.FormulaArray,您没有选择,而且正如您所发现的,对于仅适用于本地化公式的条件格式。
  • 我想让每个人都能重现这个例子,这就是为什么我把名字翻译成英文,这样每个人都能理解。如果我知道这正是问题所在,我显然不会那样做 :) 至少它帮助我弄清楚我做错了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
相关资源
最近更新 更多