前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >窗体UserForm——我也是类

窗体UserForm——我也是类

作者头像
xyj
发布2020-07-28 11:37:50
7970
发布2020-07-28 11:37:50
举报
文章被收录于专栏:VBA 学习

UserForm是一种交互界面,方便与用户交互。如果设计了一个这样的交互界面:需要用户输入名称,然后根据名称来运行程序,那么应该如何实现?

最简单的方法自然是在普通模块设置一个公用变量,在UsefForm内部使用这个变量来接收设置的值,然后再执行其他程序。

首先,设置窗体界面:

公用模块:

代码语言:javascript
复制
Public sName As String

Sub TestUserFrom()
    FInputName.Show
        
    '要执行的程序…………
    MsgBox sName
End Sub

窗体代码:

代码语言:javascript
复制
Private Sub btnOK_Click()
    sName = tbName.Text
    Unload Me
End Sub

Private Sub btnCancel_Click()
    Unload Me
End Sub

这种设计存在的问题:窗体内部的代码依赖了外部的变量,这里举的例子比较简单,只有一个变量,如果设计的是一个较为复杂的窗体,变量很多的情况下,一旦需要复用窗体到其他程序,这时候,还要把普通模块中的变量一起复制过去。

所以,上面这种设计是不合适的,作为这个只需要对外传递某些数据的窗体来说,它的功能应该仅仅是对外传递数据,不依赖外部变量,不包含逻辑代码,它就是一个独立的对象,能够对外提供接口读取数据,这就是了。

窗体本身就是一种特殊的类,只是它多了一个交互界面,类的那些特性窗体是都具有的,所以,根据类的设计方法,给这个窗体设置一个可以读取的属性UserName:

代码语言:javascript
复制
'设置只读属性
Property Get UserName() As String
    UserName = tbName.Text
End Property

Private Sub btnOK_Click()
    '隐藏窗体
    Me.Hide
End Sub

Private Sub btnCancel_Click()
    tbName.Text = ""
    Me.Hide
End Sub

这里必须用Me.Hide这种隐藏的方式,如果使用Unload Me,会销毁窗体,那么TextBox设置的内容也会被销毁,读取属性也会出错。

外部普通模块调用的时候,就像是使用一个普通的类一样:

代码语言:javascript
复制
Sub TestUserFrom()
    Dim f As FInputName
    
    '创建窗体实例
    Set f = New FInputName
    '显示窗体
    f.Show
    
    Dim sName As String
    '获取设置的名称
    sName = f.UserName
    If sName <> "" Then
        '要执行的程序…………
        MsgBox sName
    End If
    
    Set f = Nothing
End Sub

这样,这个窗体就是一个独立完整的东西,可以在其他任何需要的地方直接调用它,然后读取它设置的数据。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 VBA 学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档