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的号码格式),有一些问题导致了您的问题:

  1. 显然你的 Application.DecimalSeparator 等于 ► , 不是 [=58 中使用的默认逗号 . =] (在许多中欧国家/地区,默认逗号由一列 , 表示,而本地 Application.ThousandsSeparator 是一个点 .)。
  2. 最初,您将双精度类型的单元格值分配给只能容纳文本的文本框。 VBA 倾向于将此数字(VBA 内部值:10.8116705323301)转换为本地格式化的字符串 显示为 10,8116705323301.
  3. 将基本上 数字字符串 写回单元格将被解释​​为数字,但遵循英文默认设置。 如果在数字字符串中出现英文千位分隔符(即冒号,),这将被忽略为不必要的装饰, 从而导致单元格值为 108116705323301(假设本地数字格式为“0”)。

补救措施

我想您打算继续在用户窗体中以本地格式显示值, 您必须将控件值转换为数字(双精度类型)。如果您确定您的 Application.DecimalSeparator 等于 "," 而不是英文冒号,您可以将 CommandButton1_Click() 事件重新编码如下:

    ThisWorkbook.WorkSheets("sheet").Cells(activeRow, 21).Value = Val(Replace(Me.TextBox1, "," , "."))

顺便说一句,始终使用完全限定的范围引用;请注意,最好使用 sheet 的 CodeName 而不是 其他用户很容易覆盖的正常 sheet 名称。