Excel VBA用户表单。如果单击按钮,则将名称作为下一个模块的变量
我真的需要一些帮助,我是VBA编程新手,只是自学而已。 谢谢大家的帮助 我有什么问题? 我的工具中有1个以上的Userforms,每个Userform都包含很多按钮,有些按钮在其他Userforms上相同,有些则不同。 如果单击Userform中的某个按钮,则该类无法将my Userform.name作为变量提供给下一个模块 在代码中,“类”SUPERFORM始终为“无” 我的代码 用户表单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
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项目上测试了这段代码
- 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