Excel VBA用户表单。如果单击按钮,则将名称作为下一个模块的变量

Excel VBA用户表单。如果单击按钮,则将名称作为下一个模块的变量,excel,vba,class,userform,Excel,Vba,Class,Userform,我真的需要一些帮助,我是VBA编程新手,只是自学而已。 谢谢大家的帮助 我有什么问题? 我的工具中有1个以上的Userforms,每个Userform都包含很多按钮,有些按钮在其他Userforms上相同,有些则不同。 如果单击Userform中的某个按钮,则该类无法将my Userform.name作为变量提供给下一个模块 在代码中,“类”SUPERFORM始终为“无” 我的代码 用户表单 Option Explicit Private myBtn As clsCMD Private Sub

我真的需要一些帮助,我是VBA编程新手,只是自学而已。 谢谢大家的帮助

我有什么问题?

我的工具中有1个以上的Userforms,每个Userform都包含很多按钮,有些按钮在其他Userforms上相同,有些则不同。 如果单击Userform中的某个按钮,则该类无法将my Userform.name作为变量提供给下一个模块

在代码中,“类”SUPERFORM始终为“无”

我的代码 用户表单

Option Explicit
Private myBtn As clsCMD

Private Sub UserForm_Activate()
modUI.ufGETICON Me
End Sub

Private Sub UserForm_Initialize()

modMSG.ufINFO
modAUTOOPEN.Workbook_Open Me

Dim ctrl As Control

    For Each ctrl In frmMain.Controls
        If TypeOf ctrl Is MSForms.CommandButton Then
            Set myBtn = New clsCMD
            Set myBtn.Button = ctrl
        End If
    Next
End Sub
课程

Option Explicit
Public WithEvents Button As MSForms.CommandButton

Private Sub Class_Initialize()
    Static collButton As New Collection
    collButton.Add Me
End Sub

Private Sub Button_Click()

Dim sButton As String

sButton = Button.Name
CMDTEST *sUserform*, Button

End Sub
Private Sub CMDTEST(*sUserform As Object*, sButton As Object)



If sButton.Name = "cmd_Admin" Then
    modCMD.cmd_Admin
End If
If sButton.Name = "cmd_OItem" Then
    modCMD.cmd_OItem sUserform
End If

End Sub
模块

Option Explicit
Public sUserform As Object

Public Sub cmd_Admin()
Dim sAnswer As String

sAnswer = InputBox("Passwort f?r den Zugang zum Adminbereich eingeben:", "Zugang Adminbereich")

If sAnswer = sPASS Then
    Unload frmMain
    frmMain.Hide

ElseIf sAnswer = "" Then
    Exit Sub
Else
    MsgBox "Inkorrektes Passwort eingegeben", vbInformation + vbOKOnly, "Passwortabfrage negativ"
End If
Application.Visible = True

End Sub

Public Sub cmd_OItem(sUseform As Object)

sUserform.Hide

frmOnIt.Show

End Sub

如果不了解如何在用户表单中应用这些代码,就很难给出准确的答案

例如,如果您正在每个Userform上运行循环,那么您就不能向类中添加一个Userform属性并传入相应的Userform吗

For Each ctrl In frmMain.Controls
    If TypeOf ctrl Is MSForms.CommandButton Then
        Set myBtn = New clsCMD
        With myBtn
            Set .Owner = frmMain
            Set .Button = ctrl
        End With
    End If
Next
否则,我猜您只需运行控制阶梯,直到找到一个用户窗体:

Private Function GetUserFormName(ctrl As Object) As String

    Do
        Set ctrl = ctrl.Parent
    Loop Until TypeOf ctrl.Parent Is MSForms.UserForm And Not TypeOf ctrl.Parent Is MSForms.Frame

    GetUserFormName = ctrl.Parent.Name
End Function
因此,您的例程将包含如下代码:

Private Sub CMDTEST(sButton As Object)
    Dim n As String

    n = GetUserFormName(sButton)
End Sub

我现在解决了这个问题,我想听听你的反馈,这是不是一个好办法。也许有一些改进要做

  • 你必须知道这个项目是巨大的,我有超过20个用户表单和超过300个按钮。 这些按钮中的大多数类似于菜单(laststep、nextstep、finish、cancel、OItem、Test等)。每次都是一样的, 然后我有一些特殊的按钮,它们在所有用户窗体上只出现了1-5次,但这些按钮在用户窗体上也应该做同样的事情(比如刷新、从项目更改图片、更改其他内容等)

  • 我在3个用户窗体上的VBA项目上测试了这段代码

每次从modAUTOOPEN、Auto_Open启动代码

用户表单是: 所有用户表单此时都有相同的代码用于此测试

  • frmMain(起点)
  • 弗莫尼特
  • frmTeM

模块包括:

  • 莫达契夫 (不相关,只是旧材料-可能将来有用)
  • modAUTOOPEN (标准材料)

  • 莫德切克 (与atm无关,检查哪些用户正在使用该工具等)
  • modCMD (我为每个UF编制所有CMD)

  • modDATA (标准材料)
  • 莫德芬克 (与atm无关,用于新功能)
  • modLOAD (与atm无关,将所有数据加载到特定UF)
  • modMSG (对alle UF上的所有信息框进行编程和更新)
  • modSAVE (与atm无关,将所有数据从UF保存到WS或保存在新WB中)
  • 莫迪 (检查屏幕数量和打开位置,添加最小化按钮和Windows任务栏按钮等)
类模块是:

  • clsCMD(UF和modCMD上按钮之间的连接是否正确)


只是一个猜测,但你们能用button.parent.name吗?谢谢你们的快速帮助,但它不起作用。父对象将是框架而不是用户表单:(button.parent.parent.name?这在其他地方也可以,我只是不知道它是否可以通过classyes ofc工作。它可以工作,但不同级别上的按钮,因此一些button.parent.parent.name会更低一些,一些更高一些…我可以获得名称,但我需要它对所有用户都是动态的Forms不确定这是否有帮助,但在表单initialise中,您可以添加广告。)d ctrl.Tag=frmMain.Name然后你在按钮中有一个文本字符串,而不是对象引用。Tag非常感谢你的帮助,我会尝试这个,明天会给你答案。嘿,谢谢你的提示,你可以阅读下面我是如何解决的,也许你可以帮我改进我的代码很高兴你找到了解决方案。你会看到我编辑了你的帖子要删除一些“更粗俗”的语言,并消除一些语法歧义,请随时回滚这些编辑,如果我误解了,但请尽量保持您的语言干净。我不确定您是否意识到,但此网站是专门用来解决问题的,因此您不太可能收到关于您答案的反馈。最好是发布我的答案“但是尽量保持你的语言整洁”I’我会尽力的,对不起。
Option Explicit
Private myBtn As clsCMD
Private myBtnColl As Collection

Private Sub UserForm_Activate()
modUI.ufGETICON Me
End Sub

Private Sub UserForm_Initialize()

modMSG.ufINFO
modAUTOOPEN.Workbook_Open Me

Dim ctrl As Control
Set myBtnColl = New Collection

For Each ctrl In Me.Controls
    If TypeOf ctrl Is MSForms.CommandButton Then
        Set myBtn = New clsCMD
        Set myBtn.UserForm = Me
        Set myBtn.button = ctrl
        myBtnColl.Add myBtn
    End If
Next

End Sub
Option Explicit
Public sUSER As String
Public Const sPASS As String = "12345"

Public Sub Workbook_Open(sUSerform As Object)

modUI.ufPOSITION1 sUSerform

End Sub

Public Sub Auto_Open()

' User basierend auf Exceluser ausw?hlen
sUSER = Application.Username


modData.defDEFAULTS
modData.defWORKSHEETS

Load frmMain
frmMain.Show


End Sub
Option Explicit

Public Sub cmd_Admin()
Dim sAnswer As String

sAnswer = InputBox("Passwort f?r den Zugang zum Adminbereich eingeben:", "Zugang Adminbereich")

If sAnswer = sPASS Then
    Unload frmMain
    frmMain.Hide

ElseIf sAnswer = "" Then
    Exit Sub
Else
    MsgBox "Inkorrektes Passwort eingegeben", vbInformation + vbOKOnly, "Passwortabfrage negativ"
End If
Application.Visible = True

End Sub

Public Sub cmd_OItem(sUfName As Object)

Application.ScreenUpdating = False

sUfName.Hide
frmOnIt.Show

End Sub

Public Sub cmd_Test(sUfName As Object)

Application.ScreenUpdating = False

sUfName.Hide
frmTeM.Show

End Sub
Option Explicit
Public WithEvents button As MSForms.CommandButton
Private c_Userform As Object

Public Property Set UserForm(ByVal UfName As Object)
    Set c_Userform = UfName
End Property
Private Sub Button_click()

CMDTEST UfName, button

End Sub
Public Sub CMDTEST(UfName As Object, button As Object)

Dim sButton As String
Dim sUfName As String

sButton = button.Name
sUfName = c_Userform.Name

If button.Name = "cmd_Admin" Then
    modCMD.cmd_Admin
End If
If button.Name = "cmd_OItem" Then
    modCMD.cmd_OItem c_Userform
End If
If button.Name = "cmd_Test" Then
    modCMD.cmd_Test c_Userform
End If
'If Button.Name = "cmd_Auftragstool" Then
'    modCMD.cmd_Auftragstool c_Userform
'End If
'If Button.Name = "cmd_Beenden" Then
'    modCMD.cmd_Beenden c_Userform
'End If
End Sub