Я решил проблему сейчас, и я хотел бы услышать ваши отзывы, если это хороший способ или нет.Может быть, есть какие-то улучшения?
Вы должны знать, что этот проект огромен, и у меня более 20 пользовательских форм и над всеми пользовательскими формами более 300 кнопок.Большинство из этих кнопок похожи на меню (последний шаг, следующий шаг, завершение, отмена, OItem, тест и некоторые другие).Они все делают то же самое каждый раз, и затем у меня есть несколько специальных кнопок, они только 1-5 раз для всех пользовательских форм, но эти кнопки должны также делать то же самое для их пользовательских форм (например, обновить, изменить изображение из элемента, изменить что-то еще и т. Д..)
Я тестировал этот код в проекте VBA для 3 пользовательских форм
Код запускается каждый раз из modAUTOOPEN, Auto_Open
Пользовательские формы: ВСЕ Пользовательские формы в настоящее время имеют одинаковый код для этого теста.
- frmMain (начальный сайт)
- frmOnIt
- frmTeM
.
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
Модули:
- modARCHIV (не актуально, просто старый материал - может быть, он полезен вбудущее)
- modAUTOOPEN (стандартный материал)
.
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
- modCHECKS (не актуально, проверка, какие пользователи используют инструмент и т. д..)
- modCMD (где я программирую все свои CMD для каждой UF)
.
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
- modDATA (стандартный материал)
- modFUNC (не актуально atm, для новых функций)
- modLOAD (не актуально atm, загрузить все данные в конкретную UF)
- modMSG (программирование и обновление всех инфобоксов на всех UF)
- modSAVE (не актуально, сохраните все данные из UF в WS или в новый WB)
- modUI (проверяя, какмножество экранов и места их открытия, добавление кнопки минимизации и кнопки панели окна и т. д.)
ClassModules:
- clsCMD (если соединение установлено междукнопки на UF и modCMD)
.
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