Vba 如何为按键事件制作sub?

Vba 如何为按键事件制作sub?,vba,excel,Vba,Excel,我正在用宏编写excel。我有一个带有文本框的userform,其中有几个只用于按数字的函数 如何将select案例放在程序或函数上 然后在我需要的任何按键事件中调用它(在本例中,quantity1 quantity2、price1和price2,但买方中没有)? 我尝试制作一个使用与事件相同参数的sub,例如: Sub Only_Numbers(ByVal KeyAscii As MSForms.ReturnInteger) 下面是我为您创建的一个快速示例 假设您的用户表单如下所示 现在

我正在用宏编写excel。我有一个带有文本框的userform,其中有几个只用于按数字的函数

如何将select案例放在程序或函数上 然后在我需要的任何按键事件中调用它(在本例中,quantity1 quantity2、price1和price2,但买方中没有)? 我尝试制作一个使用与事件相同参数的sub,例如:

Sub Only_Numbers(ByVal KeyAscii As MSForms.ReturnInteger)

下面是我为您创建的一个快速示例

假设您的用户表单如下所示

现在将其放在类模块中

Public WithEvents TextBoxEvents As MSForms.TextBox

Private Sub TextBoxEvents_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Select Case KeyAscii
        Case Asc("0") To Asc("9")
        Case Else
            KeyAscii = 0
    End Select
End Sub
屏幕截图

并将其放入userform中

Dim myTBs() As New Class1

Private Sub UserForm_Initialize()
    Dim i As Integer, objControl As Control

    For Each objControl In Me.Controls
        If TypeOf objControl Is MSForms.TextBox Then
            i = i + 1
            ReDim Preserve myTBs(1 To i)
            Set myTBs(i).TextBoxEvents = objControl
        End If
    Next objControl
    Set objControl = Nothing
End Sub
屏幕截图

现在尝试在任何文本框中输入
text/numbers

编辑

@悉达多哇!真棒的回答!几乎是这样,但我要求userform上的某些文本框(不是全部)可以有此限制。我想如果我这样做的话,设置myTBs(I).TextBoxEvents=quantity1(考虑到quantity1是一个文本框)应该会起作用6分钟前的fjatp

如果objControl的类型为MSForms.TextBox,则
选择Case objControl.Name

案例“TextBox1”、“TextBox3”、“TextBox4”这里是我为您创建的一个快速示例

假设您的用户表单如下所示

现在将其放在类模块中

Public WithEvents TextBoxEvents As MSForms.TextBox

Private Sub TextBoxEvents_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Select Case KeyAscii
        Case Asc("0") To Asc("9")
        Case Else
            KeyAscii = 0
    End Select
End Sub
屏幕截图

并将其放入userform中

Dim myTBs() As New Class1

Private Sub UserForm_Initialize()
    Dim i As Integer, objControl As Control

    For Each objControl In Me.Controls
        If TypeOf objControl Is MSForms.TextBox Then
            i = i + 1
            ReDim Preserve myTBs(1 To i)
            Set myTBs(i).TextBoxEvents = objControl
        End If
    Next objControl
    Set objControl = Nothing
End Sub
屏幕截图

现在尝试在任何文本框中输入
text/numbers

编辑

@悉达多哇!真棒的回答!几乎是这样,但我要求userform上的某些文本框(不是全部)可以有此限制。我想如果我这样做的话,设置myTBs(I).TextBoxEvents=quantity1(考虑到quantity1是一个文本框)应该会起作用6分钟前的fjatp

如果objControl的类型为MSForms.TextBox,则
选择Case objControl.Name

案例“TextBox1”、“TextBox3”、“TextBox4”作为对Siddharth代码的轻微修改,我使用集合而不是数组。其他一切都是一样的

Option Explicit

Dim myTBs As New Collection

Private Sub UserForm_Initialize()
    Dim i As Integer, objControl As Control
    Dim TB As Class1

    For Each objControl In Me.Controls
        If TypeOf objControl Is MSForms.TextBox Then
            Set TB = New Class1
            Set TB.TextBoxEvents = objControl
            myTBs.Add TB
        End If
    Next objControl
    Set objControl = Nothing
End Sub

作为对Siddharth代码的轻微修改,我使用集合而不是数组。其他一切都是一样的

Option Explicit

Dim myTBs As New Collection

Private Sub UserForm_Initialize()
    Dim i As Integer, objControl As Control
    Dim TB As Class1

    For Each objControl In Me.Controls
        If TypeOf objControl Is MSForms.TextBox Then
            Set TB = New Class1
            Set TB.TextBoxEvents = objControl
            myTBs.Add TB
        End If
    Next objControl
    Set objControl = Nothing
End Sub

您需要的是一个控制数组来处理
\u按键
。不幸的是,我的网站正在装修中,否则我会给你指出一个完整的例子。您现在可能需要在web上搜索VBA控件阵列。您能否详细说明此表单需要执行的操作?它需要在后台运行吗?“帮助我”不是问题。请学习如何编写有效的问题。@ashleedawg是一个带有一些文本框的用户表单,您可以在其中输入值,这些值可以稍后放到表中。@fjatp-…那么我不明白您为什么不使用常规的文本框输入法?您需要的是一个控件数组来处理
\u KeyPress
。不幸的是,我的网站正在装修中,否则我会给你指出一个完整的例子。您现在可能需要在web上搜索VBA控件阵列。您能否详细说明此表单需要执行的操作?它需要在后台运行吗?“帮助我”不是问题。请学习如何编写有效的问题。@ashleedawg这是一个带有一些文本框的用户表单,您可以在其中输入值,这些值可以稍后放到表中。@fjatp-…那么我不明白您为什么不使用常规的文本框输入法?我通常使用集合来执行此操作我通常使用集合来执行此操作