VBA小数点分隔符错误

时间:2017-12-12 16:58:35

标签: excel vba

我的VBA小数分隔符有问题。

我的文件使用表单将数据输入到标签中。

我的变量是货币类型。

每当用户在表单中输入1,25并验证文件中的正确金额(即逗号用作小数分隔符)时,如果用户输入1,256,则在文件中输入1 256。如果用户输入1.256,则输入正确的值1,256。 真正的问题是,如果用户在表单中输入1.256,验证然后在同一个Excel行重新加载表单,则表单将显示1,256,因为excel会显示它。因此,如果用户再次验证,将输入数量1 256.

我已经尝试将excel和VBA设置更改为使用“,”作为小数点分隔符而不是千位分隔符,但问题仍然存在。

如何解决这个没有用“。”替换任何“,”。从文件加载表单并告诉我的用户使用“。” ?

编辑: 这里有一部分代码(我删除了标签中使用的很多其他变量):

Option Explicit


Public ReaQte As Long
Public ReaCost As Currency

Sub InitializeVariables()

    'INITIALIZE COLUMNS
    ReaQteCol = Worksheets("!V").Cells(3, 23)
    ReaCostCol = Worksheets("!V").Cells(4, 23)

    'INITIALIZE VARIABLES

    ReaQte = ActiveSheet.Cells(ActiveCell.Row, ReaQteCol)
    ReaCost = ActiveSheet.Cells(ActiveCell.Row, ReaCostCol)

End Sub

Sub LoadCurrentRecordDetails()
    'LOAD ROW IN FORM

    'LOAD FORM

    Menu.ReaQte.Text = ReaQte
    Menu.ReaCost.Text = ReaCost

    'SET VISIBILITY OF FORM ITEMS

    'DISPLAY FORM
    Menu.Show
End Sub

Sub ModifyRecord(TargetRow As Long)
    'INSERT FORM VALUES INTO LINE


    If EstPoche Then
        ActiveSheet.Cells(TargetRow, BudCol) = Menu.BudPoche.Text
        ActiveSheet.Cells(TargetRow, MonthBudCol) = Menu.MonthBudList.Text
    Else
        ActiveSheet.Cells(TargetRow, ReaQteCol) = Menu.ReaQte.Text
        ActiveSheet.Cells(TargetRow, ReaCostCol) = Menu.ReaCost.Text

    End If

    Unload Menu
End Sub

基本上这可以如下工作:

该文件有很多不同人使用的不同表格。所有工作表都具有相同的选项卡格式每当用户单击单元格到选项卡时,它都会打开一个表单并将行详细信息加载到选项卡中。然后,用户可以修改表单中的内容并验证将其输入到选项卡中。

编辑2:部分解决方案

我意识到尽管我的变量是Currency类型,但表单中存储的值不是任何类型。因此将其转换为:

ActiveSheet.Cells(TargetRow, ReaCostCol) = CCur(Menu.ReaCost.Value)

解决问题。但是我使用这种方法后只能得到2位数的昏迷。

1 个答案:

答案 0 :(得分:1)

If EstPoche Then
    ActiveSheet.Cells(TargetRow, BudCol) = Menu.BudPoche.Text
    ActiveSheet.Cells(TargetRow, MonthBudCol) = Menu.MonthBudList.Text
Else
    ActiveSheet.Cells(TargetRow, ReaQteCol) = Menu.ReaQte.Text
    ActiveSheet.Cells(TargetRow, ReaCostCol) = Menu.ReaCost.Text
End If

您要将单元格值分配给String值。之前将它们转换为Double

If EstPoche Then
    ActiveSheet.Cells(TargetRow, BudCol) = CDbl(Menu.BudPoche.Text)
    ActiveSheet.Cells(TargetRow, MonthBudCol) = CDbl(Menu.MonthBudList.Text)
Else
    ActiveSheet.Cells(TargetRow, ReaQteCol) = CDbl(Menu.ReaQte.Text)
    ActiveSheet.Cells(TargetRow, ReaCostCol) = CDbl(Menu.ReaCost.Text)
End If

如果VBA不理解文本框中的数字值,则此转换将失败;在这种情况下,您需要进一步的文本处理逻辑,使值的字符串表示与VBA期望看到的数字格式对齐。

实现此目的的一种方法是处理文本框'KeyDown事件,并彻底禁止输入非法字符(例如空格,逗号)。

实现此目的的另一种方法是实现自己的字符串到双转换函数,并以这样的方式实现它,即解析输入的十进制和千位分隔符,并用系统定义的分隔符替换它们,你可以从Application.International属性获取:

Dim decimalSeparator As String
decimalSeparator = Application.International(XlApplicationInternational.xlDecimalSeparator)
Dim thousandsSeparator As String
thousandsSeparator = Application.International(XlApplicationInternational.xlThousandsSeparator)

玩得开心吧!或者..我99%肯定已经在这个网站的某个地方实现了它。

要明确:

  

当从文件加载表单并告诉我的用户使用“。”时,如何解决此而不用“。”替换任何“,”。 ?

你不能。