从 VBA 编写公式不适用于每个最终用户的 PC
Writing a formula from VBA not working on every end-user's PC
我希望有人能帮我解决这个问题,因为我已经在互联网上爬了一段时间了,找不到任何明显的原因来说明我的宏在 Excel 下的行为有效对于某些用户(当然也包括我),在其他一些用户的笔记本电脑上无法使用。
我的objective:
从 VBA 子例程在一个单元格中编写一个 vlookup 公式。基于该 vlookup,它要么找到某些内容并显示文本 A,要么 vlookup 抛出错误然后显示文本 B。
情况
如果我们从最终用户的角度直接在 sheet 中编写公式,则公式如下:=IF(NOT(ISERROR(VLOOKUP(C2,DataSet2!$A:$A,1,0))),"Direct Report","Team member of direct report")
当我们copy/paste PC 上的那个公式直接在传播失败时sheet。有用。
当我们 运行 宏实际上试图将该公式合并到完全相同的单元格中时,它失败并抛出错误 400。
下面是试图在单元格中写入上述公式的 VBA 代码:
formulaString = "=IF(NOT(ISERROR(VLOOKUP(C" & CStr(counter + 2) & systemListSeparator & "DataSet2!$A:$A$" & CStr(2 + totalDirectReportsCount) & systemListSeparator & "1" & systemListSeparator & "0)))" & systemListSeparator & """Direct Report""" & systemListSeparator & """Team member of direct report"")"
Selection.Offset(counter, 0).Formula = formulaString
因此,正如您可能已经理解的那样,上述 2 个语句包含在一个循环中,对于我拥有的每一行,我想将该公式添加到当前选定单元格的第一个单元格中。
让我发疯的是:它在我的 PC 上运行良好,在我在芬兰的同事的 PC 上运行良好,但在另一位同样在芬兰的同事的 PC 上,它却不能。我有 Windows 10 和 Office 2016,她有 Windows 10 和 Office 2016...
所以我真的很想知道是否有一些区域设置或 Excel 设置或系统设置可能会使她 Excel 无法将我的 "formulaString" 解释为适合她的笔记本电脑。我已确保获取列表分隔符以避免那些常见的区域设置容易陷入陷阱,但是否还有其他我不知道的类似陷阱?
非常感谢您给我的任何提示,以便我的调查取得进展。
亲切的问候,
尼古拉斯·C.
这确实是一个棘手的问题,但幸运的是VBA提供了一个很好的解决方案。
只需将公式写在Excel、select单元格和运行下面的代码:
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
以及直接 window 的结果。因此,您来自世界各地的同事将非常高兴。如 3 个示例中所述,第一个和第三个始终给出相同的答案,遵循 en_US 格式 .
另一种选择是 Excel 和 VBA 不喜欢您的公式,因为芬兰的小数点分隔符与美国的小数点分隔符不同。请参阅 How to add hardcoded float number values to the formula using VBA 稍微更改一下。
解决方法
Nicolas C. 编辑:以上所有评论和特此回答都帮助我解决了我的问题。非常感谢你们的迅速反应和反馈。你真的救了我的命。所以根本原因确实是我试图在 his/her 语言环境和区域设置上捕获最终用户的系统偏好,并在 [=42] 中使用 his/her 列表分隔符(实际上是) =] 脚本这是一个糟糕的举动,因为正如@AxelRichter 和@Vityata 所提到的,在 VBA 脚本中,.Formula 需要始终以 en_US 格式编写,即英文函数名称,逗号等
我现在删除了与用户相关的列表分隔符并将其替换为传统逗号,这解决了我的问题。
我希望有人能帮我解决这个问题,因为我已经在互联网上爬了一段时间了,找不到任何明显的原因来说明我的宏在 Excel 下的行为有效对于某些用户(当然也包括我),在其他一些用户的笔记本电脑上无法使用。
我的objective:
从 VBA 子例程在一个单元格中编写一个 vlookup 公式。基于该 vlookup,它要么找到某些内容并显示文本 A,要么 vlookup 抛出错误然后显示文本 B。
情况
如果我们从最终用户的角度直接在 sheet 中编写公式,则公式如下:=IF(NOT(ISERROR(VLOOKUP(C2,DataSet2!$A:$A,1,0))),"Direct Report","Team member of direct report")
当我们copy/paste PC 上的那个公式直接在传播失败时sheet。有用。 当我们 运行 宏实际上试图将该公式合并到完全相同的单元格中时,它失败并抛出错误 400。
下面是试图在单元格中写入上述公式的 VBA 代码:
formulaString = "=IF(NOT(ISERROR(VLOOKUP(C" & CStr(counter + 2) & systemListSeparator & "DataSet2!$A:$A$" & CStr(2 + totalDirectReportsCount) & systemListSeparator & "1" & systemListSeparator & "0)))" & systemListSeparator & """Direct Report""" & systemListSeparator & """Team member of direct report"")"
Selection.Offset(counter, 0).Formula = formulaString
因此,正如您可能已经理解的那样,上述 2 个语句包含在一个循环中,对于我拥有的每一行,我想将该公式添加到当前选定单元格的第一个单元格中。
让我发疯的是:它在我的 PC 上运行良好,在我在芬兰的同事的 PC 上运行良好,但在另一位同样在芬兰的同事的 PC 上,它却不能。我有 Windows 10 和 Office 2016,她有 Windows 10 和 Office 2016...
所以我真的很想知道是否有一些区域设置或 Excel 设置或系统设置可能会使她 Excel 无法将我的 "formulaString" 解释为适合她的笔记本电脑。我已确保获取列表分隔符以避免那些常见的区域设置容易陷入陷阱,但是否还有其他我不知道的类似陷阱?
非常感谢您给我的任何提示,以便我的调查取得进展。 亲切的问候, 尼古拉斯·C.
这确实是一个棘手的问题,但幸运的是VBA提供了一个很好的解决方案。
只需将公式写在Excel、select单元格和运行下面的代码:
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
以及直接 window 的结果。因此,您来自世界各地的同事将非常高兴。如 3 个示例中所述,第一个和第三个始终给出相同的答案,遵循 en_US 格式 .
另一种选择是 Excel 和 VBA 不喜欢您的公式,因为芬兰的小数点分隔符与美国的小数点分隔符不同。请参阅 How to add hardcoded float number values to the formula using VBA 稍微更改一下。
解决方法 Nicolas C. 编辑:以上所有评论和特此回答都帮助我解决了我的问题。非常感谢你们的迅速反应和反馈。你真的救了我的命。所以根本原因确实是我试图在 his/her 语言环境和区域设置上捕获最终用户的系统偏好,并在 [=42] 中使用 his/her 列表分隔符(实际上是) =] 脚本这是一个糟糕的举动,因为正如@AxelRichter 和@Vityata 所提到的,在 VBA 脚本中,.Formula 需要始终以 en_US 格式编写,即英文函数名称,逗号等
我现在删除了与用户相关的列表分隔符并将其替换为传统逗号,这解决了我的问题。