对于学校,我必须制作一个程序,将二进制数转换为十进制数并向后。我希望它能让它在文本框中输入内容时发生变化。
每当我输入内容时,我都会收到错误,我应该点击上一个'Else'触发的文本框中的任何一个。
TextBox1是包含十进制数的文本框,TextBox2包含二进制数。
这是代码:
Public Sub DecBinConverter_Activate()
Dim x As Double
Dim i As Long
Dim Active As String
Active = "TextBox1"
End Sub
Private Sub TextBox1_Change()
Call ConvertDecBin
End Sub
Private Sub TextBox2_Change()
Call ConvertDecBin
End Sub
Public Sub TextBox1_Enter()
Active = "TextBox1"
End Sub
Public Sub TextBox2_Enter()
Active = "TextBox2"
End Sub
Public Sub ConvertDecBin()
If Active = "TextBox1" Then
If TextBox1.Text <> "" Then
If IsNumeric(TextBox1.Text) Then
x = Round(Val(TextBox1.Text), 0)
If x < 10000000000# Then
TextBox1.Text = x
TextBox2.Text = Trim(Str(x Mod 2))
If (x Mod 2) = 0 Then
x = x / 2
Else
x = (x - 1) / 2
End If
Do While x <> 0
TextBox2.Text = Trim(Str(x Mod 2)) & TextBox2.Text
If (x Mod 2) = 0 Then
x = x / 2
Else
x = (x - 1) / 2
End If
Loop
Else
TextBox2.Text = "ERROR: Overload (0-999999999)"
End If
Else
TextBox2.Text = "ERROR: You must fill in a decimal number"
End If
End If
ElseIf Active = "TextBox2" Then
If TextBox2.Text <> "" Then
If IsNumeric(TextBox2.Text) Then
If Len(Str(TextBox2.Text)) > 40 Then
TextBox1.Text = "ERROR: Fill in a number no longer than 40 characters!"
Else
If InStr(Str(TextBox2.Text), "2") Or InStr(Str(TextBox2.Text), "3") Or InStr(Str(TextBox2.Text), "4") Or InStr(Str(TextBox2.Text), "5") Or InStr(Str(TextBox2.Text), "6") Or InStr(Str(TextBox2.Text), "7") Or InStr(Str(TextBox2.Text), "8") Or InStr(Str(TextBox2.Text), "9") Then
TextBox1.Text = "ERROR: You must fill in a binary number!"
Else
x = Round(Val(TextBox2.Text), 0)
TextBox2.Text = x
TextBox1.Text = 0
For i = 1 To Len(Str(x))
If Mid(Str(x), i, 1) = "1" Then
TextBox1.Text = TextBox1.Text * 2 + 1
Else
TextBox1.Text = TextBox1.Text * 2
End If
Next i
End If
End If
Else
TextBox1.Text = "ERROR: You must fill in a binary number!"
End If
End If
Else
MsgBox "An unknown error occurred, please click either of the textboxes.", vbOKOnly, "ERROR"
End If
End Sub
答案 0 :(得分:0)
对您的代码提出几点意见:
你不需要有一个&#34; Active&#34;字段因为你的事件例程
分配给控件。
无论何时处理文本框字段,都可以使用&#34;更改&#34;事件被执行
你必须处理(我无法找到链接)
我建议使用&#34; Option Explicit&#34;。
每个人都有自己的风格;我希望这会对你有所帮助:
Option Explicit
' Textbox1 has decimal, textbox2 has binary
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim idec&, s1$
If KeyCode <> 13 Then Exit Sub ' Only act upon "Enter"
s1 = TextBox1.Value
If s1 = "" Then Exit Sub ' blank ok
If Not IsNumeric(s1) Then
MsgBox "Textbox1 is not numeric"
TextBox1.Value = ""
Exit Sub
End If
' -- decimal to binary
idec = Val(s1) ' have decimal number
s1 = "" ' start binary string
Do While idec > 0
If idec Mod 2 = 1 Then s1 = s1 & "1" Else s1 = s1 & "0"
idec = idec \ 2 ' integer divide
Loop
TextBox2.Value = s1
End Sub
Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim idec&, ibin&, ixch&, ch$, s1$
If KeyCode <> 13 Then exit Sub ' Only act upon "Enter"
s1 = TextBox2.Value
If s1 = "" Then Exit Sub ' blank ok
If Not IsNumeric(s1) Then
MsgBox "Textbox2 is not numeric"
TextBox2.Value = ""
Exit Sub
End If
idec = 0 ' start decimal number
For ixch = 1 To Len(s1) ' binary to decimal
ibin = Val(Mid$(s1, ixch, 1)) ' 0 or 1
If ibin < 0 Or ibin > 1 Then
MsgBox "Textbox2 is not binary"
TextBox2.Value = ""
Exit Sub
End If
idec = idec * 2 + ibin
Next ixch
TextBox1.Value = Str$(idec)
End Sub