首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何对文本框进行自身检查

如何对文本框进行自身检查
EN

Stack Overflow用户
提问于 2019-08-11 23:13:51
回答 2查看 83关注 0票数 0

我正在尝试做文本框,这将是验证输入(仅用于数字)。

我还是个新手,对一些事情感到有点困惑,但我正在努力学习。我在用户表单中有多个文本框,并希望它们中的每一个都只是数字输入。一开始,我只选中了一个文本框(vzdalenost1)。

创建textbox和类之间的连接的第一个代码

代码语言:javascript
运行
复制
Dim chk As New Class1
Private Sub UserForm_Initialize()
    Set chk.ChkEvents = Controls("Vzdalenost1")
End Sub

第二个代码是实际的类模块

代码语言:javascript
运行
复制
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”的东西,这也不起作用..

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-12 01:42:55

此上下文中的关键字Me指的是类对象本身,而不是文本框。使用ChkEvents引用textbox - ChkEvents.Value

下面是如何重写代码以处理多个文本框的方法。首先,让我们给你的类起一个有意义的名字,我们称它为clsTextbox。然后,为了与封装原则保持一致,让我们在类中将对象声明为Private,而不是Public。这将阻止公众直接访问它。相反,我们将使用一个成员函数将一个文本框分配给一个类对象。所以我们的类模块的代码看起来就像这样…

代码语言:javascript
运行
复制
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的类对象。相反,我们将在每次创建新对象时使用该关键字,然后将该新对象添加到集合中。所以我们的用户表单的代码应该是这样的…

代码语言:javascript
运行
复制
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
票数 0
EN

Stack Overflow用户

发布于 2019-08-12 16:50:15

如果我没弄错你的问题,你想让textbox只接受数字,对吗?在这种情况下,尝试这样做:

代码语言:javascript
运行
复制
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替换为您已有的任何名称,它就会正常工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57451176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档