我的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位数的昏迷。
答案 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%肯定已经在这个网站的某个地方实现了它。
要明确:
当从文件加载表单并告诉我的用户使用“。”时,如何解决此而不用“。”替换任何“,”。 ?
你不能。