运行 使用变量类型的时间和兼容性错误 "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
的每个旧公式而改变。
我在 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
的每个旧公式而改变。