如何从22个文本框中为20个文本框创建一个代码,而不是相同的20倍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从22个文本框中为20个文本框创建一个代码,而不是相同的20倍相关的知识,希望对你有一定的参考价值。

我有一组22个文本框。前20个是1到10之间的数字,textbox21是textbox22,每个组的总数为10.我对textbox1有一个直到textbox20相同的代码,但是如何让这更容易?

您可以在下面看到我为其中一个文本框提供的代码。

Private Sub TextBox1_Change()
    korps(1) = 0
    korps1
    If TextBox1.Value = "" Then
                            TextBox1.SetFocus
                            Exit Sub
    End If
            If Not IsNumeric(TextBox1.Value) Then
                MsgBox "Sorry, only numbers allowed"
                TextBox1.Value = ""
                Exit Sub
            End If
    If TextBox1.Value = 0 Then TextBox1.Value = 10
    korps(1) = TextBox1.Value
    korps1
End Sub
答案

如果您按照我的评论中的链接,您可以创建一个名为txtBox和以下代码的类

Option Explicit

Private WithEvents mTextBox As MSForms.Textbox

Property Set Box(nBox As MSForms.Textbox)
    Set mTextBox = nBox
End Property

Private Sub mTextBox_Change()

    If mTextBox.Value = "" Then
        mTextBox.SetFocus
        Exit Sub
    End If
    If Not IsNumeric(mTextBox.Value) Then
        MsgBox "Sorry, only numbers allowed"
        mTextBox.Value = ""
        Exit Sub
    End If
    If mTextBox.Value = 0 Then mTextBox.Value = 10

End Sub

在表单中,您需要一个类似于以下代码的代码

Option Explicit

Dim colTxtBoxes As Collection

Private Sub UserForm_Initialize()

Dim m_txtBox As txtBox
Dim ctl As MSForms.Control

    Set colTxtBoxes = New Collection

    For Each ctl In Me.Controls

        If ctl.Name = "TextBox21" Or ctl.Name = "TextBox22" Then
        Else
            If TypeName(ctl) = "TextBox" Then
                Set m_txtBox = New txtBox
                Set m_txtBox.Box = ctl
                colTxtBoxes.Add m_txtBox
            End If
        End If

    Next ctl

End Sub
另一答案

这是一个只需要代码一次的解决方案。以下是您需要的程序。它们应该位于Userform的代码表中,您可以在其中拥有所有文本框。

Option Explicit

    Dim Korps() As Long

Private Sub UserForm_Initialize()
    ' 01 Jan 2018
    ' presuming that all Tbxs are 0 upon initialisation.
    ' if they are not, transfer their initial values to Korps here.

    ReDim Korps(1 To 10, 1 To 2)
    SetTotals
End Sub

Private Function KeyPress(Tbx As MSForms.TextBox, _
                          ByVal Key As Integer) As Integer
    ' 01 Jan 2018
    ' Message is shown after each 3rd wrong entry,
    ' regardless of the Tbx in which it occurred.

    Static Count As Integer

    If Not IsNumeric(Chr(Key)) Then
        Key = 0
        Count = Count + 1
        If Count = 3 Then
            MsgBox "Only numbers may be entered", _
                    vbInformation, "Entry restrictions"
            Count = 0
        End If
    End If
    KeyPress = Key
End Function

Private Sub TbxUpdate(Tbx As MSForms.TextBox)
    ' 01 Jan 2018

    Dim Idx As Integer                      ' Tbx number
    Dim Grp As Integer                      ' 1 = 1 to 10, 2 = 11 to 20

    With Tbx
        Idx = Mid(.Name, Len("TextBox") + 1)
        Grp = Int((Idx - 1) / 10) + 1
        If Trim(.Text) = "" Then
            ' reject blank: restore previous value
            .Value = Korps(Idx, Grp)
            .SetFocus
        Else
            If .Value = 0 Then .Value = 10
            Korps(Idx, Grp) = .Value
            SetTotals Grp
        End If
    End With
End Sub

Private Sub SetTotals(Optional ByVal Grp As Integer)
    ' 01 Jan 2018
    ' if Grp isn't supplied, both groups are summed up

    Dim Ttl As Double
    Dim LoopStart As Integer, LoopEnd As Integer
    Dim i As Long

    If Grp Then
        LoopStart = Grp
        LoopEnd = Grp
    Else
        LoopStart = 1
        LoopEnd = 2
    End If

    For Grp = LoopStart To LoopEnd
        Ttl = 0
        For i = 1 To 10
            Ttl = Ttl + Korps(i, Grp)
        Next i
        Me.Controls("TextBox2" & Grp).Value = Ttl
    Next Grp
End Sub

如你所见,我猜测你的变量korpskorps1程序。

对于20个文本框中的每个文本框,您将需要以下事件过程。除了声明中的TextBox编号外,它们都是相同的。这就是Storax建议改造课程的优越性。如果您愿意创建一个我应该推荐的课程。

Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    ' 01 Jan 2018
    TbxUpdate ActiveControl
End Sub

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    ' 01 Jan 2018
    KeyAscii = KeyPress(ActiveControl, KeyAscii)
End Sub

观察我建议使用与您想到的事件不同的事件。我认为即使您选择创建课程,也应该重新考虑。 Change事件将触发输入的每个角色。这对于捕获非数字条目非常有用,除了KeyPress事件更适合它,因为它可以阻止字符出现在文本框中。

至于维持运行总计,Change事件是冒险的,因为当输入多位数时它会产生无意义的总数。我建议使用Update事件,当用户将焦点(和光标)移动到另一个控件时发生。

以上是关于如何从22个文本框中为20个文本框创建一个代码,而不是相同的20倍的主要内容,如果未能解决你的问题,请参考以下文章

用户输入值时如何从文本框中填充消息框?

在 C# 中为富文本框分配内存

java如何制作个向网页文本框中自动填写数据

从同一文本框中获取第二个输入

Java编程(基于图形界面)从文件中读出数据,显示在文本框中

如何从报表上的选定文本框中提取文本? VBA