【问题标题】:Writing a formula from VBA not working on every end-user's PC从 VBA 编写公式不适用于每个最终用户的 PC
【发布时间】:2017-11-23 20:39:56
【问题描述】:

我希望有人能帮我解决这个问题,因为我已经在互联网上爬了一段时间,找不到任何明显的原因为什么我的宏在 Excel 下的行为适用于某些用户(包括我当然)并且不适用于其他一些用户的笔记本电脑。

我的目标:

从 VBA 子例程在一个单元格中写入一个 vlookup 公式。基于该 vlookup,它要么找到某些东西并显示文本 A,要么 vlookup 抛出错误然后显示文本 B。

情况

如果我们从最终用户的角度直接在工作表中编写公式,则公式如下:=IF(NOT(ISERROR(VLOOKUP(C2,DataSet2!$A$2:$A$12,1,0))),"Direct Report","Team member of direct report")

当我们在 PC 上复制/粘贴该公式时,宏在电子表格中直接失败。有用。 当我们运行宏实际上试图将该公式合并到同一个单元格中时,它会失败并抛出错误 400。

下面是尝试在单元格中写入上述公式的 VBA 代码:

formulaString = "=IF(NOT(ISERROR(VLOOKUP(C" & CStr(counter + 2) & systemListSeparator & "DataSet2!$A$2:$A$" & CStr(2 + totalDirectReportsCount) & systemListSeparator & "1" & systemListSeparator & "0)))" & systemListSeparator & """Direct Report""" & systemListSeparator & """Team member of direct report"")"
Selection.Offset(counter, 0).Formula = formulaString

因此,正如您可能已经理解的那样,上述两条语句包含在一个循环中,对于我拥有的每一行,我想在当前选定单元格的第一个单元格中添加该公式。

让我抓狂的是:它在我的 PC 上运行良好,在芬兰同事的 PC 上运行良好,但在芬兰另一位同事的 PC 上运行却不行。我有 Windows 10 和 Office 2016,她也有 Windows 10 和 Office 2016...

所以我真的想知道是否有一些区域设置或 Excel 设置或系统设置可能使 HER Excel 无法将我的“formulaString”解释为对她的笔记本电脑可行。我已确保获取列表分隔符以避免那些通常的区域设置容易陷阱,但是否还有其他我不知道的类似陷阱?

非常感谢您提供的任何提示,以便我在调查中取得进展。 亲切的问候, 尼古拉斯 C.

【问题讨论】:

  • 你为什么在那里使用systemListSeparatorRange.Formulaalways en_US 格式,表示:英文函数名,逗号作为参数分隔符,点作为小数分隔符。只有Range.FormulaLocal 是语言环境格式,需要注意系统列表分隔符等。
  • @pnuts 不,我没有尝试“.FormulaLocal”
  • @NicolasC。 - 使用FormulaLocal,您将获得乌龙球。不要尝试。
  • 如果你的systemListSeparator不是逗号,那么它会有害,因为Range.Formula需要逗号作为参数分隔符。
  • 很高兴能为您提供帮助。但这与@Vityata 已经回答的基本相同。 Range.FormulaRange.FormulaR1C1 与区域设置无关,因为它始终需要 en_US 区域设置格式的公式。也许@Vityata 可以在他的回答中提到这一点。

标签: excel vba locale formula


【解决方案1】:

这确实是一个棘手的问题,但幸运的是 VBA 提供了一个很好的解决方案。

只需在 Excel 中编写公式,选择单元格并运行以下代码:

Public Sub TestMe()

    With ActiveCell
        Debug.Print .Formula
        Debug.Print .FormulaLocal
        Debug.Print .FormulaR1C1
    End With

End Sub

在德语 Excel 中,您会得到以下结果:

=SUM(C1+D1)
=SUMME(C1+D1)
=SUM(RC[2]+RC[3])

然后重建您的公式,仅使用.Formula.FormulaR1C1 以及来自即时窗口的结果。因此,来自世界各地的同事会非常高兴。如 3 个示例中所述,第一个和第三个示例始终给出相同的答案,遵循 en_US 格式


另一个选项是 Excel 和 VBA 不喜欢您的公式,因为芬兰的小数分隔符与美国的小数分隔符不同。请参阅How to add hardcoded float number values to the formula using VBA 进行一些更改。

解决方案 Nicolas C. 编辑:以上所有 cmets 和特此回答都帮助我解决了我的问题。非常感谢你们的及时反应和反馈。你真的拯救了我的一天。所以根本原因确实是我试图在他/她的语言环境和区域设置中捕获最终用户的系统偏好,并在 VBA 脚本中使用他/她的列表分隔符(实际上是 ; 这是一个糟糕的举动因为正如@AxelRichter 和@Vityata 所提到的,在VBA 脚本中,.Formula 需要始终以en_US 格式编写,即英文函数名、逗号等。

我现在删除了与用户相关的列表分隔符并用传统的逗号替换它,它解决了我的问题。

【讨论】:

  • 谢谢。我将控制我在芬兰的最终用户的笔记本电脑,在单元格中手动输入公式,然后尝试您的建议,看看 Excel 带来了什么。感谢您的提示!
  • @NicolasC。 - 只需在公式前的行中写上systemListSeparator = "," 即可。
猜你喜欢
  • 1970-01-01
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-28
相关资源
最近更新 更多