2017-12-28 6 views
0

In meiner Userform gibt es CommandButton1, 2, 3, 4, 5, 6 ........, und sie alle die gleiche Aufgabe zu tun. Zum Beispiel:. Range("A1").value = "Good"schreiben Ein Code für zwei Steuerelemente? Zum Beispiel zwei Befehlsschaltfläche

Hier kommt die Frage, gibt es eine Möglichkeit, dass ich nur einen Code für alle von ihnen schreiben kann?

Wenn die Antwort ja ist, kann ich die Reichweite variabel machen? Beispiel: CommandButton1: Bereich ("A1"). Value = "Gut", CommandButton2: Bereich ("A2"). Value = "Gut".

Vielen Dank für Ihre Antwort.

Antwort

0

VBA verfügt nicht über ein ausgeklügeltes Ereignismodell. Stattdessen können Sie erstellen, und rufen, ein gemeinsames Unter Verfahren, das insbesondere Argument übergeben (n), dass die Unter seinem Ergebnis bestimmen muss:

Private Sub CommandButton1_Click() 
    Call Clicker("A1") 
End Sub 

Private Sub CommandButton2_Click() 
    Call Clicker("A2") 
End Sub 

Private Sub Clicker(sRange As String) 
    'MsgBox sRange 
    Range(sRange).Value = "Good" 
End Sub 

Der Parameter hat keinen String sein, könnte es sein, a Range.

Oder der Wert „A1“ usw., könnte gespeichert und abgerufen wird, als Eigenschaft der Form (anstatt es als Argument übergeben).

Eine mögliche Alternative ist die ActiveControl und dann verhalten sich entsprechend zu überprüfen:

Private Sub Clicker() 
    MsgBox ActiveControl.Name 
    'do something according to the name 
End Sub 

Ich mag das nicht und die erste Alternative bevorzugen, da der Wert (e) sind wahrscheinlich für das Klick spezifisch sein Schaltfläche (und der Name der Schaltfläche kann sich ändern). Der Code kann auch aufgerufen werden, ohne dass eine relevante Schaltfläche aktiv ist.

Eine dritte Alternative besteht darin, ein eigenes benutzerdefiniertes Klassen- und Ereignismodell zu erstellen, das einige Nachforschungen erfordern würde.


Hier ein Beispiel ist eine benutzerdefinierte Eigenschaft von der Userform mit:

Private sCellOfInterest As String 

Private Property Get CellOfInterest() As String 
    CellOfInterest = sCellOfInterest 
End Property 

Private Property Let CellOfInterest(ByVal sRange As String) 
    sCellOfInterest = sRange 
End Property 


Private Sub CommandButton1_Click() 
    CellOfInterest = "A1" 
    Call Clicker2 
End Sub 

Private Sub CommandButton2_Click() 
    CellOfInterest = "A2" 
    Call Clicker2 
End Sub 


Private Sub Clicker2() 
    MsgBox CellOfInterest 
End Sub 

Auch hier könnte das Objekt ein Objekt sein, eher als ein String, dann würde Property Set anstatt Property Let verwendet werden.

+0

Hallo Andy G Ihre Antwort verkürzen meinen Code in Excel VBA sehr. Vielen Dank. – kan

Verwandte Themen