2017-06-11 4 views
1

Ich habe einen Code in VBA erstellt, um Daten mit einem mehrseitigen Steuerelement zu sammeln. In jeder Seite habe ich Kontrollkästchen dynamisch basierend auf Zeilen aus dem Arbeitsblatt in Excel und für jede Option hinzugefügt, gibt es eine Textbox und zwei Befehlsschaltflächen, genau wie das Bild unten:Dynamisches Textfeld nach dem Drücken der Taste neu schreiben

Eingabefenster: image

der Code automatisch Steuerelemente hinzufügen ist:

Private Sub UserForm_Initialize() 
fmat_disp.Value = 0 
fmat_set.Value = 0 


'--------------------------------------------------------------------------------------------- 
'Inspeção de Mecânica 
Sheets("Mecânica").Activate 
n_anom = Application.WorksheetFunction.CountA(Range("1:1")) - 1 
AreasInspecao.mecanica.ScrollHeight = 10 + 18 * (n_anom) 
For i = 1 To n_anom 
'Selecionar anomalia 
Set SelAnom = AreasInspecao.mecanica.Controls.Add("Forms.CheckBox.1", "sel_anom_" & i) 
SelAnom.Caption = Worksheets("Mecânica").Cells(1, i + 1) 
SelAnom.AutoSize = True 
SelAnom.Height = 18 
SelAnom.Left = 5 
SelAnom.Top = 5 + (SelAnom.Height) * (i - 1) 
SelAnom.Tag = i 

Same geht auf die Textbox und Plus/minus-Tasten, nur die Beschriftungen ändern.

Was ich will, ist: 1) bei aktivierter Checkbox, jeweils TEXTBOX zeigen muss 1 2), wenn MINUS Zeichen gedrückt wird, müssen entsprechende TEXTBOX 3) verringern, wenn PLUS Zeichen gedrückt wird, entsprechende TEXTBOX muss erhöht 4) Wenn "Finalizar Inspção" gepresst wird, müssen alle gesammelten Daten an Excel gesendet werden und ein Arbeitsblatt ausfüllen.

Ich weiß einfach nicht, wie Sie jede Schaltfläche/Checkbox mit Ihrem jeweiligen Textfeld verknüpfen, ohne für jedes ein Unterprogramm zu erstellen! Ich habe ~ 500 Subroutinen .... das ist unmöglich manuell zu verwalten ....

+0

Wo ist das Bild? –

+0

Entschuldigung ... imgurl Link zum Bild hinzugefügt! –

+1

Wenn Sie Steuerelemente dynamisch hinzufügen, benötigen Sie Folgendes: http://www.siddharthrout.com/2011/08/05/vba-control-arrays/ Das zeigt Ihnen, wie Sie die Ereignisse erfassen: alles, was Sie brauchen Geben Sie Ihre Steuerelemente so an, dass die Gruppen verwandter Steuerelemente im ausgelösten Code identifiziert werden können. –

Antwort

0

OK hier ist eine grobe Gliederung für die Handhabung der Klickereignisse auf den Kontrollkästchen und Schaltflächen.

Die ersten zwei benutzerdefinierten Klassen für die Erfassung der Klicks: Jeder von diesen ist sehr einfach - sie rufen nur eine Methode auf dem Benutzerformular mit dem angeklickt Steuerelement als ein Argument.

'clsCheck 
Public WithEvents chk As MSForms.CheckBox 

Private Sub chk_Click() 
    frmExample.HandleClick chk 
End Sub 

'clsButton 
Public WithEvents btn As MSForms.CommandButton 

Private Sub btn_Click() 
    frmExample.HandleClick btn 
End Sub 

Benutzerformularcode - mein Formular heißt "frmExample".

Beachten Sie die Namenskonvention, die es ermöglicht, Gruppen von Steuerelementen als "Einheit" zu behandeln.

Option Explicit 

'These two global collections hold instances of the custom classes 
Dim colCheckBoxes As Collection 
Dim colButtons As Collection 


Private Sub UserForm_Activate() 

    Const CON_HT As Long = 18 
    Dim x As Long, cbx As MSForms.CheckBox, t 
    Dim btn As MSForms.CommandButton, txt As MSForms.TextBox 
    Dim oCheck As clsCheck, oButton As clsButton 

    Set colCheckBoxes = New Collection 
    Set colButtons = New Collection 

    For x = 1 To 10 

     t = 5 + CON_HT * (x - 1) 

     Set cbx = Me.Controls.Add("Forms.CheckBox.1", "cbox_" & x) 
     cbx.Caption = "Checkbox" & x 
     cbx.Width = 80 
     cbx.Height = CON_HT 
     cbx.Left = 5 
     cbx.Top = t 
     colCheckBoxes.Add GetCheckHandler(cbx) '<< save in collection 

     Set btn = Me.Controls.Add("Forms.CommandButton.1", "btnplus_" & x) 
     btn.Caption = "+" 
     btn.Height = CON_HT 
     btn.Width = 20 
     btn.Left = 90 
     btn.Top = t 
     btn.Enabled = False '<<buttons start off disabled 
     colButtons.Add GetButtonHandler(btn) '<< save in collection 

     Set btn = Me.Controls.Add("Forms.CommandButton.1", "btnminus_" & x) 
     btn.Caption = "-" 
     btn.Height = CON_HT 
     btn.Width = 20 
     btn.Left = 130 
     btn.Top = t 
     btn.Enabled = False '<<buttons start off disabled 
     colButtons.Add GetButtonHandler(btn) '<< save in collection 

     'no events are captured for the textboxes... 
     Set txt = Me.Controls.Add("Forms.Textbox.1", "txt_" & x) 
     txt.Width = 30 
     txt.Height = CON_HT 
     txt.Left = 170 
     txt.Top = t 

    Next x 

End Sub 

'All "clicked" controls saved in instances of the custom classes 
' get passed here. Handle based on control type/name 
Public Sub HandleClick(ctrl As MSForms.Control) 
    Dim num 
    num = Split(ctrl.Name, "_")(1) 'which set of controls are we working with? 
    Dim txt As MSForms.TextBox 
    'get the matching text box... 
    Set txt = Me.Controls("txt_" & num) 
    If ctrl.Name Like "cbox_*" Then 
     If ctrl.Value Then txt.Value = 1 
     Me.Controls("btnplus_" & num).Enabled = ctrl.Value 
     Me.Controls("btnminus_" & num).Enabled = ctrl.Value 
    ElseIf ctrl.Name Like "btnplus_*" Then 
     txt.Value = txt.Value + 1 
    ElseIf ctrl.Name Like "btnminus_*" Then 
     txt.Value = txt.Value - 1 
    End If 
End Sub 


'couple of "factory" functions for the event-handling classes 
Private Function GetCheckHandler(cb As MSForms.CheckBox) 
    Dim rv As New clsCheck 
    Set rv.chk = cb 
    Set GetCheckHandler = rv 
End Function 

Private Function GetButtonHandler(btn As MSForms.CommandButton) 
    Dim rv As New clsButton 
    Set rv.btn = btn 
    Set GetButtonHandler = rv 
End Function 

Beispieldatei: https://www.dropbox.com/s/k74c08m0zkwn9l7/tmpFormEvents.xlsm?dl=0

+0

danke, Tim! es funktionierte wie ein Charme, obwohl ich ein paar Änderungen in meiner Schnittstelle vornehmen musste ... Ich denke, ich kann dies nicht innerhalb einer Multipage tun, also habe ich Frames mit Schaltflächen verknüpft und machte einen Rahmen sichtbar bei a Zeit, basierend auf welcher Schaltfläche aktiviert wurde –

Verwandte Themen