Excel 使用小数更新记录时出现用户窗体错误
Userform Error in Excel When updating record with decimals
我编写了一个用户表单,用于编辑来自 Excel table 的记录。
Private Sub UserForm_Initialize()
Dim ActiveRow As Long
ActiveRow = ActiveCell.Row
...
Me.Controls("exchangeRate").Value = Cells(ActiveRow, 21)
在用户表单中,该值按预期显示。我们从我们的银行复制这个值,并在那里收到一个带有很多小数位的长值。
示例:
10,8116705323301
所以用户窗体显示这个值,没问题。但是当我再次保存这个值时,逗号被删除了。
108116705323301
Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
Sheets("sheet").Unprotect Password:="xxx"
Dim ActiveRow As Long
ActiveRow = ActiveCell.Row
Cells(ActiveRow, 21).Value = exchangeRate.Value
Application.ScreenUpdating = True
Sheets("sheet").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFormattingRows:=True, AllowFormattingColumns:=True, Password:="xxx"
我做错了什么?
TextBox 值为字符串
由于您的本地号码设置(偏离VBA的号码格式),有一些问题导致了您的问题:
- 显然你的
Application.DecimalSeparator
等于 ► ,
而 不是 [=58 中使用的默认逗号 .
=]
(在许多中欧国家/地区,默认逗号由一列 ,
表示,而本地 Application.ThousandsSeparator
是一个点 .
)。
- 最初,您将双精度类型的单元格值分配给只能容纳文本的文本框。
VBA 倾向于将此数字(VBA 内部值:
10.8116705323301
)转换为本地格式化的字符串
显示为 10,8116705323301
.
- 将基本上 数字字符串 写回单元格将被解释为数字,但遵循英文默认设置。
如果在数字字符串中出现英文千位分隔符(即冒号
,
),这将被忽略为不必要的装饰,
从而导致单元格值为 108116705323301
(假设本地数字格式为“0”)。
补救措施
我想您打算继续在用户窗体中以本地格式显示值,
您必须将控件值转换为数字(双精度类型)。如果您确定您的
Application.DecimalSeparator
等于 "," 而不是英文冒号,您可以将 CommandButton1_Click()
事件重新编码如下:
ThisWorkbook.WorkSheets("sheet").Cells(activeRow, 21).Value = Val(Replace(Me.TextBox1, "," , "."))
顺便说一句,始终使用完全限定的范围引用;请注意,最好使用 sheet 的 CodeName
而不是
其他用户很容易覆盖的正常 sheet 名称。
我编写了一个用户表单,用于编辑来自 Excel table 的记录。
Private Sub UserForm_Initialize()
Dim ActiveRow As Long
ActiveRow = ActiveCell.Row
...
Me.Controls("exchangeRate").Value = Cells(ActiveRow, 21)
在用户表单中,该值按预期显示。我们从我们的银行复制这个值,并在那里收到一个带有很多小数位的长值。
示例:
10,8116705323301
所以用户窗体显示这个值,没问题。但是当我再次保存这个值时,逗号被删除了。
108116705323301
Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
Sheets("sheet").Unprotect Password:="xxx"
Dim ActiveRow As Long
ActiveRow = ActiveCell.Row
Cells(ActiveRow, 21).Value = exchangeRate.Value
Application.ScreenUpdating = True
Sheets("sheet").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFormattingRows:=True, AllowFormattingColumns:=True, Password:="xxx"
我做错了什么?
TextBox 值为字符串
由于您的本地号码设置(偏离VBA的号码格式),有一些问题导致了您的问题:
- 显然你的
Application.DecimalSeparator
等于 ►,
而 不是 [=58 中使用的默认逗号.
=] (在许多中欧国家/地区,默认逗号由一列,
表示,而本地Application.ThousandsSeparator
是一个点.
)。 - 最初,您将双精度类型的单元格值分配给只能容纳文本的文本框。
VBA 倾向于将此数字(VBA 内部值:
10.8116705323301
)转换为本地格式化的字符串 显示为10,8116705323301
. - 将基本上 数字字符串 写回单元格将被解释为数字,但遵循英文默认设置。
如果在数字字符串中出现英文千位分隔符(即冒号
,
),这将被忽略为不必要的装饰, 从而导致单元格值为108116705323301
(假设本地数字格式为“0”)。
补救措施
我想您打算继续在用户窗体中以本地格式显示值,
您必须将控件值转换为数字(双精度类型)。如果您确定您的
Application.DecimalSeparator
等于 "," 而不是英文冒号,您可以将 CommandButton1_Click()
事件重新编码如下:
ThisWorkbook.WorkSheets("sheet").Cells(activeRow, 21).Value = Val(Replace(Me.TextBox1, "," , "."))
顺便说一句,始终使用完全限定的范围引用;请注意,最好使用 sheet 的 CodeName
而不是
其他用户很容易覆盖的正常 sheet 名称。