运行 使用变量类型的时间和兼容性错误 "Double"

Run Time and Compatibility Errors using Variable Type "Double"

我在 VBA 宏中使用 Double 类型变量时遇到一个奇怪的问题。

宏在某些系统上测试时工作正常,但在具有不同语言设置的另一个系统上测试时会导致运行时错误“1004”。 两个系统都使用 Office 2013.

我在表单中有一个 ScrollBar,值范围从 -50 到 + 50。 基本上是 increase/decrease 范围值的指标 -/+ 50% 宏很简单,如下所示:


Dim multiplier As Double

multiplier = CLng(Me.DPScroll.Value) / 100 + 1
ThisWorkbook.ActiveSheet.Range("AB11:AB" & LR).Formula = "=H11*" & multiplier

DPScroll.Value = 0(乘数=1)时,表格运行文件没有任何错误,但如果它有一个正值或负值,它returns

Run-time Error 1004 : Application Defined/Object Defined Error

(在我的系统上,两者都工作正常)

所以,我猜乘数不能取小数点的值(例如 1.07 增加 7%)

(不太重要的问题) 它还会在另一个 sheet 上导致奇怪的格式错误。 我正在计算列表框中几行的平均值并将该值粘贴到一个范围内。在某些系统上,格式会保留,但在其他系统上会发生变化并乘以数百万,并显示一个大数字(如 10^E6 次)

由于这仅限于某些系统 - 使用 "Double" 变量类型是否存在任何 regional/language 兼容性问题。

确实是本地化问题。只要您使用 .Formula,区域设置始终是标准美国,这意味着乘数必须是 1.07(例如,不是 1,07)。

但是如果本地化是德语,那么如果乘数转换为字符串,它将变为 1,07.Formula 需要美国标准 1.07.


解决方案 1
使用 replace()

multiplier 中的任何逗号 , 替换为 .

解决方案 2
使用 .FormulaLocal 使用本地化公式:

ThisWorkbook.ActiveSheet.Range("AB11:AB" & LR).FormulaLocal= "=H11*" & multiplier

但是你可能不得不处理其他问题,例如=IF(A1=0,TRUE,FALSE) 也变得本地化(例如对于德语):=WENN(A1=0;WAHR;FALSCH).


解决方案 3
另一种方法是将乘数写入命名范围,这样您就可以在公式中直接使用该名称,如下所示:

ThisWorkbook.ActiveSheet.Range("AB11:AB" & LR).Formula = "=H11*multiplier"

因此您可以使用 ActiveWorkbook.Names.Add "multiplier", multiplier,这样您甚至不需要该命名范围的辅助单元格。

但是,如果您随时更改乘数,它也会随着工作表中使用命名范围 multiplier 的每个旧公式而改变。