VB 实时计算

2025-12-16 11:32:10
推荐回答(5个)
回答1:

你只要求防溢出,没说要求精度.要想要精确的,自己再改下吧.就是把数据类型重定义下.

VERSION 5.00
Begin VB.Form form1
Caption = "多少钱?"
ClientHeight = 4005
ClientLeft = 60
ClientTop = 345
ClientWidth = 8295
LinkTopic = "Form1"
LockControls = -1 'True
ScaleHeight = 4005
ScaleWidth = 8295
StartUpPosition = 3 '窗口缺省
Begin VB.TextBox Text2
Height = 375
Left = 1680
Locked = -1 'True
TabIndex = 16
Top = 3360
Width = 6135
End
Begin VB.TextBox Text1
Height = 375
Index = 7
Left = 1680
TabIndex = 15
Top = 2640
Width = 2055
End
Begin VB.TextBox Text1
Height = 375
Index = 6
Left = 5760
TabIndex = 13
Top = 2640
Width = 2055
End
Begin VB.TextBox Text1
Height = 375
Index = 5
Left = 5760
TabIndex = 11
Top = 1920
Width = 2055
End
Begin VB.TextBox Text1
Height = 375
Index = 4
Left = 5760
TabIndex = 9
Top = 1080
Width = 2055
End
Begin VB.TextBox Text1
Height = 375
Index = 3
Left = 5760
TabIndex = 7
Top = 270
Width = 2055
End
Begin VB.TextBox Text1
Height = 375
Index = 2
Left = 1680
TabIndex = 5
Top = 1920
Width = 2055
End
Begin VB.TextBox Text1
Height = 375
Index = 1
Left = 1680
TabIndex = 3
Top = 1080
Width = 2055
End
Begin VB.TextBox Text1
Height = 375
Index = 0
Left = 1680
TabIndex = 1
Top = 270
Width = 2055
End
Begin VB.Label Label2
AutoSize = -1 'True
Caption = "总钱数"
BeginProperty Font
Name = "隶书"
Size = 14.25
Charset = 134
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 285
Left = 240
TabIndex = 17
Top = 3360
Width = 945
End
Begin VB.Label Label1
Alignment = 2 'Center
AutoSize = -1 'True
Caption = "一百元"
BeginProperty Font
Name = "隶书"
Size = 14.25
Charset = 134
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 285
Index = 7
Left = 240
TabIndex = 14
Top = 2610
Width = 975
End
Begin VB.Label Label1
Alignment = 2 'Center
AutoSize = -1 'True
Caption = "十 元"
BeginProperty Font
Name = "隶书"
Size = 14.25
Charset = 134
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 285
Index = 6
Left = 4200
TabIndex = 12
Top = 2640
Width = 975
End
Begin VB.Label Label1
Alignment = 2 'Center
AutoSize = -1 'True
Caption = "五 元"
BeginProperty Font
Name = "隶书"
Size = 14.25
Charset = 134
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 285
Index = 5
Left = 4200
TabIndex = 10
Top = 1920
Width = 975
End
Begin VB.Label Label1
Alignment = 2 'Center
AutoSize = -1 'True
Caption = "二 元"
BeginProperty Font
Name = "隶书"
Size = 14.25
Charset = 134
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 285
Index = 4
Left = 4200
TabIndex = 8
Top = 1080
Width = 975
End
Begin VB.Label Label1
Alignment = 2 'Center
AutoSize = -1 'True
Caption = "一 元"
BeginProperty Font
Name = "隶书"
Size = 14.25
Charset = 134
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 285
Index = 3
Left = 4200
TabIndex = 6
Top = 360
Width = 975
End
Begin VB.Label Label1
Alignment = 2 'Center
AutoSize = -1 'True
Caption = "五 角"
BeginProperty Font
Name = "隶书"
Size = 14.25
Charset = 134
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 285
Index = 2
Left = 240
TabIndex = 4
Top = 1860
Width = 975
End
Begin VB.Label Label1
Alignment = 2 'Center
AutoSize = -1 'True
Caption = "二 角"
BeginProperty Font
Name = "隶书"
Size = 14.25
Charset = 134
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 285
Index = 1
Left = 240
TabIndex = 2
Top = 1110
Width = 975
End
Begin VB.Label Label1
Alignment = 2 'Center
AutoSize = -1 'True
Caption = "一 角"
BeginProperty Font
Name = "隶书"
Size = 14.25
Charset = 134
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 285
Index = 0
Left = 240
TabIndex = 0
Top = 360
Width = 975
End
End
Attribute VB_Name = "form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Dim ChangeIndex As Integer
Dim ChangeSelPosition As Integer

Private Sub Form_Load()
Dim TextObj As Control
For Each TextObj In Me.Controls
If TypeName(TextObj) = "TextBox" Then
TextObj.Text = 0
End If
Next
End Sub

Private Sub Text1_Change(Index As Integer)
Dim i As Integer
For i = 0 To 7
If Text1(i) = "" Then
Text1(i) = 0
End If
Next i
If Text2.Text = "" Or Text2.Text = "." Then
Text2.Text = 0
End If
' 求和
Dim temCount As Double
temCount = CDbl(Text2.Text)
On Error GoTo check1
Text2.Text = CDbl(Format(CDbl(Text1(0).Text) * 0.1 + CDbl(Text1(1).Text) * 0.2 + CDbl(Text1(2).Text) * 0.5 + _
CDbl(Text1(3).Text) + CDbl(Text1(4).Text) * 2 + CDbl(Text1(5).Text) * 5 + _
CDbl(Text1(6).Text) * 10 + CDbl(Text1(7)) * 100, "###########################0.##"))
Exit Sub
check1:
Text2.Text = temCount
Text1(ChangeIndex).Text = Left(Text1(ChangeIndex).Text, ChangeSelPosition) _
& Right(Text1(ChangeIndex).Text, Len(Text1(ChangeIndex).Text) - ChangeSelPosition - 1)
Text1(ChangeIndex).SelStart = Len(Text1(ChangeIndex).Text)
End Sub

Private Sub Text1_KeyPress(Index As Integer, KeyAscii As Integer)
' 过滤
TextMask Text1(Index), KeyAscii ', Shift

ChangeIndex = Index
ChangeSelPosition = Text1(Index).SelStart
End Sub
Private Sub TextMask(Text1 As TextBox, KeyCode As Integer) ', Shift As Integer)
If IsNumeric(Chr(KeyCode)) Then
If Text1.SelLength > 0 Then
Text1.SelText = ""
End If

' If Shift <> 0 Then
' Shift = 0
' KeyCode = 0
' End If
ElseIf KeyCode = 8 Then

Else
KeyCode = 0
End If
If Text1.Text = "" Then
Text1.Text = 0
End If
End Sub

回答2:

iq0050说的是通用的方法,不过本题人民币就这有限的几种面额,只要用0.1代表1角,001代表1元,010代表十元....,代码可以更简单如下:
Dim a As single
Dim b As single
Private Sub Text1_Change()
a = Val(Text1)
If a > 100 Then
Text1 = ""
ElseIf (Text1 = "0." OrText1 = "0" Or Text1 = "1" Or Text1 = "10" Or Text1 = "05" Or Text1 = "02" Or Text1 = "01" Or Text1 = "00") Then
ElseIf (Text1 = "0.1" Or Text1 = "0.2" Or Text1 = "0.5" Or Text1 = "100" Or Text1 = "050" Or Text1 = "020" Or Text1 = "010" Or Text1 = "005" Or Text1 = "002" Or Text1 = "001") Then
b = Val(Text2)
Text2 = Str(a + b)
Text1 = ""
Else
Text1 = ""
End If
End Sub
至于防溢出得根据你的需要自行修改b的数据类型
防粘贴有两种情况:
1防止右键粘贴
private sub text1_mousedown(botton as integer, ......)
if button and vbrightbutton then
text1.enabled=false
PopupMenu 你自己的弹出菜单
text1.enabled=true
end if
end sub
2防止ctrl+V
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyV And (Shift And 2) Then
Text1.Locked = True
End If
End Sub

Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
Text1.Locked = False
End Sub

回答3:

Private Sub Txt_KeyPress(Index As Integer, KeyAscii As Integer)
Dim i As Integer
Dim LstRst As String
'txt(0)-1角:txt(1)-2角:txt(2)-5角
'txt(3)-1元:txt(4)-2元:txt(5)-5元
'txt(6)-10元:txt(7)-20元:txt(8)-50元

If KeyAscii < 48 Or KeyAscii > 57 Then '只可输入数字,不能输入其它
If KeyAscii = 8 Or KeyAscii = 46 Then Exit Sub
KeyAscii = 0
End If

LstRst = Val(Txt(0)) * 0.1 + Val(Txt(1)) * 0.2 + Val(Txt(2)) * 0.5 _
+ Val(Txt(3)) * 1 + Val(Txt(4)) * 2 + Val(Txt(5)) * 5 _
+ Val(Txt(6)) * 10 + Val(Txt(7)) * 20 + Val(Txt(8)) * 50
Text1.Text = LstRst '结果
End Sub

Private Sub Txt_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
'防止鼠标粘贴
Clipboard.Clear
End Sub
经测试,输入无限小数也不会溢出,当在txt中输入数据时,会自动计算出值

回答4:

首先实时显示不点按钮你只需要把text的事件改成change
然后把text1的小数限制成2位
text2限制成不可以编辑
代码:(我没有VB可能有出入)
if IsNumeric(text1.text) then
a=val(text1.text)
if a>=0 then
c=a-int(a)*100
a=int(a)
d100=a\100
d50=(a-d100*100)\50
d10=(a-d100*100-d50*50)\10
d5=(a-d100*100-d50*50-d10*10)\5
d2=(a-d100*100-d50*50-d10*10-d5*5)\2
d1=a-d100*100-d50*50-d10*10-d5*5-d2*2
e50=c\50
e10=(c-e50*50)\10
e5=(c-e50*50-e10*10)\5
e2=(c-e50*50-e10*10-e5*5)\2
e1=c-e50*50-e10*10-e5*5-e2*2
text2.text=d100 & "个100元面值" & d50 & "个50元" & d10 & "个10元" & d5 & "个5元" & d2 & "个2元" & d1 & "个1元" & e50 & "个5毛" & e20 & "个2毛" & e10 & "个1毛" & e5 & "个5分" & e2 & "个2分" & e1 & "个1分"
else
msgbox"你的数字小于0,你见过这样的RMB吗?"
end if
else
msgbox"请不要输入非法字符!"
end if

回答5:

又看到把窗体属性在代码里设置的了.....
直接在组件设计的时候就加进去就行了嘛,代码长得要死又没用.