Excel VBA Userform.Name как переменная для следующего модуля в случае нажатия кнопки - PullRequest
1 голос
/ 07 марта 2019

Мне действительно нужна помощь, я новичок в программировании на VBA и просто учусь сам. Спасибо за помощь.

В чем моя проблема?

У меня более 1 пользовательской формы в моем инструменте, и каждая пользовательская форма содержит множество кнопок, некоторые кнопки одинаковы для других пользовательских форм, а некоторые - разные. если я нажимаю кнопку в пользовательской форме, класс не может передать свой userform.name в качестве переменной следующему модулю.

в коде "Class" sUserform всегда "ничего"

Мой код UserForm

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

Modul

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

Ответы [ 2 ]

3 голосов
/ 07 марта 2019

Трудно дать вам точный ответ, не видя, как вы хотите применить этот код к своим пользовательским формам.

Если, например, вы запускаете циклы для каждой пользовательской формы, то не могли бы вы просто добавить свойство пользовательской формы в свой класс и передать соответствующую пользовательскую форму?

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
0 голосов
/ 08 марта 2019

Я решил проблему сейчас, и я хотел бы услышать ваши отзывы, если это хороший способ или нет.Может быть, есть какие-то улучшения?

  • Вы должны знать, что этот проект огромен, и у меня более 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...