我在VBA宏中使用Double
类型变量时遇到一个奇怪的问题。
当我在某些系统上测试宏时,宏工作正常,但会导致运行时错误' 1004'在另一个具有不同语言设置的系统上测试时。 两个系统都使用Office 2013。
我在表单中有一个ScrollBar,其值介于-50到+50之间。 基本上是增加/减少范围值的指标 - / + 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)时,表单运行文件没有任何错误,但如果它有正值或负值,则返回
运行时错误1004:应用程序定义/对象定义错误
(在我的系统上,两者都可以正常工作)
所以,我猜测乘数无法取小数点的值(例如1.07增加7%)
(不太重要的问题) 它还会在另一张纸上导致奇怪的格式错误。 我计算列表框中几行的平均值并将值粘贴到一个范围。在某些系统上,格式保留,但在其他系统上,它会更改并乘以数百万,并显示一个大数字(如10 ^ E6次)
由于这仅限于某些系统 - 是否存在任何区域/语言相容性问题与起诉" Double"变量类型。
答案 0 :(得分:2)
这确实是一个本地化问题。只要您使用.Formula
,区域设置始终是标准美国,这意味着乘数必须为1.07
(例如,不是1,07
)。
但是,如果本地化是德语,那么如果将乘数转换为字符串,它将变为1,07
,但.Formula
需要美国标准1.07
。
解决方案1
使用,
multiplier
中的所有逗号.
替换为replace()
解决方案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
的每个旧公式。