【问题标题】:Directly referencing userform entry in VBA instead of passing value to a variable在 VBA 中直接引用用户窗体条目,而不是将值传递给变量
【发布时间】:2015-02-19 21:41:14
【问题描述】:

伙计们。我是编程新手,但我正在编写一些宏来帮助管理我的工作共享 Excel 工作簿。

我正在为需要访问此工作簿的人员实施几个不同的用户角色。安全性不是很关键,只是为了防止人们意外地对他们不应该做的事情进行(和保存)更改。我只是有一个用户窗体提示输入密码,并根据输入的内容授予适当的访问权限。

我已将其写入,以便用户在 UserForm 上的文本框中输入直接引用为 Me.textboxPasswordEntry.Value 以进行任何比较。我突然想到这可能不是最佳实践,但我无法说明原因。也许我只是想多了?同时,声明一个变量,将值传递给变量,然后进行分析,这似乎很愚蠢和浪费。

下面的 Sub 来自用户窗体,我将其包含在内是为了向您展示我的意思。这是一个非常直接的场景,我知道,但是如果我通过更复杂的练习继续这种练习,我是否会遇到麻烦?如果是这样,我可能会遇到什么样的问题?

谢谢。

Private Sub buttonOK_adminPW_Click()
'The subs SetUserType_[level] are in the ChangeUserType module
'AdminPass and DesignPass are module-level variables set on UserForm initialization
'Default user type is User. Read-only access.
'Admins can edit the workbook, but must save via a macro to ensure
'   things are reset properly for Users (some sheets hidden, etc.)
'Designers can edit the workbook, but also have full ability to save using
'   the regular file menu/ctrl+s/etc.

    Application.ScreenUpdating = False
    Select Case Me.textboxPasswordEntry.Value
        Case AdminPass
            'Shows right control buttons and unlocks the wkbk for admin access
            SetUserType_admin
            Unload Me
        Case DesignPass
            'Shows all control buttons and unlocks the wkbk for designer access
            SetUserType_design
            Unload Me
        Case Else
            MsgBox ("Password incorrect. Please retry.")
            With Me.textboxPasswordEntry
                .Value = ""
                .SetFocus
            End With
    End Select
    Application.ScreenUpdating = True
End Sub

【问题讨论】:

  • 一般来说,使用变量来表示在过程中被多次引用的对象/值。在这种情况下,我不会将其更改为变量。当一个变量在一个过程中被多次使用时,更改赋值通常比定位和更改对它的每个引用更容易。例如,如果有人更改了您的 UI 设计并将控件重命名为 password_tbox,您只需在一处更改即可。
  • @DavidZemens,我在回顾这个问题时才意识到我忘了感谢您的回复。我的想法和你的一样,所以作为一个新手,能够得到确认并让那些挥之不去的疑问(有点)平静下来,这让我很放心。

标签: vba excel


【解决方案1】:

是的,这些年来我也思考过用户表单的“最佳实践”……我想这只是通过经验,我最常使用以下方法:

  1. 在用户窗体本身中使用尽可能少的代码(思考 是,如果表单尽可能少,它就更“可重用” 回到它的父级......它存在的原因只是为了获得输入)
  2. 请在表单的“激活”事件上使用代码来清除所有 表单上的字段(这在表单中是有意义的,因为那时 您无需记住要清除的表单上的每个控件 你使用它的每一点)
  3. 直接引用来自 您调用代码中的表单(即 stPassword = userform1.tbPassword.value) 或...
  4. 在 userform ...即在userform中的所有代码声明“public stPasswordInput as string”之前,您可以在调用代码中引用例如stPassword = userform1.stPasswordInput

不过,我很想看看其他人的建议!

【讨论】:

  • 嗨,西蒙。感谢您的答复!这些绝对是有用的提示。上个月我不得不离开这个项目,但有一点距离让我回顾我迄今为止的工作......嗯......值得畏缩。我计划彻底改革我迄今为止所做的工作,并将使用这四点。
猜你喜欢
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 2011-08-15
  • 2011-02-03
相关资源
最近更新 更多