我正在尝试做文本框,这将是验证输入(仅用于数字)。
我还是个新手,对一些事情感到有点困惑,但我正在努力学习。我在用户表单中有多个文本框,并希望它们中的每一个都只是数字输入。一开始,我只选中了一个文本框(vzdalenost1)。
创建textbox和类之间的连接的第一个代码
Dim chk As New Class1
Private Sub UserForm_Initialize()
Set chk.ChkEvents = Controls("Vzdalenost1")
End Sub第二个代码是实际的类模块
Option Explicit
Public WithEvents ChkEvents As MSForms.TextBox
Private Sub ChkEvents_change()
If IsNumeric(Me.Value) Or Me.Value = "" Then
Else
MsgBox "blablabla"
Me.Value = ""
End If
End Sub当我尝试将某些内容写入文本框"vzdalenost1“时,excel显示错误信息”找不到方法或数据成员“。
我甚至有一些类似于用"me.control.value“替换"me.value”的东西,这也不起作用..
发布于 2019-08-12 01:42:55
此上下文中的关键字Me指的是类对象本身,而不是文本框。使用ChkEvents引用textbox - ChkEvents.Value。
下面是如何重写代码以处理多个文本框的方法。首先,让我们给你的类起一个有意义的名字,我们称它为clsTextbox。然后,为了与封装原则保持一致,让我们在类中将对象声明为Private,而不是Public。这将阻止公众直接访问它。相反,我们将使用一个成员函数将一个文本框分配给一个类对象。所以我们的类模块的代码看起来就像这样…
Option Explicit
Private WithEvents tb As MSForms.TextBox
Private Sub tb_Change()
MsgBox tb.Name
End Sub
Public Function SetTextbox(ByRef obj As MSForms.TextBox)
Set tb = obj
End Function然后,对于我们的userform,我们首先在模块级别声明一个集合来保存我们的类对象。然后,因为我们将创建多个类对象,所以我们声明一个不带关键字New的类对象。相反,我们将在每次创建新对象时使用该关键字,然后将该新对象添加到集合中。所以我们的用户表单的代码应该是这样的…
Option Explicit
Dim textboxCollection As Collection
Private Sub UserForm_Initialize()
Set textboxCollection = New Collection
Dim cTextbox As clsTextbox
Dim ctrl As MSForms.Control
For Each ctrl In Me.Controls
If TypeName(ctrl) = "TextBox" Then
Set cTextbox = New clsTextbox
cTextbox.SetTextbox ctrl
textboxCollection.Add cTextbox
End If
Next ctrl
End Sub发布于 2019-08-12 16:50:15
如果我没弄错你的问题,你想让textbox只接受数字,对吗?在这种情况下,尝试这样做:
Private Sub TextboxName_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
char = Chr(KeyAscii)
KeyAscii = Asc(UCase(char))
Debug.Print KeyAscii
If KeyAscii >= 48 And KeyAscii <= 57 Then
Debug.Print "number"
Else
Debug.Print "other"
KeyAscii = 0
End If
End Sub只需将Sub name中的TextboxName替换为您已有的任何名称,它就会正常工作。
https://stackoverflow.com/questions/57451176
复制相似问题