Mehrere OptionButton mit CommandButton nacheinander durchschalten

  • Excel

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Mehrere OptionButton mit CommandButton nacheinander durchschalten

    Hi, nun ist es mittlerweile halb drei Uhr morgens und ich sitze immer noch vor dem Pc auf der Suche nach einer Lösung für meine kleine Spinnerei.
    Da ich mich vor lauter Sucherei mittlerweile aber kaum mehr konzentrieren geschweige etwas lesen kann und selbst einfach nicht weiter komme, bitte ich eben mal um Hilfe.

    Ich habe mehrere OptionButton die keine einzelne Funktion zugewiesen haben, sondern lediglich quasi als Marker dienen sollen. Ähnlich einer Checkbox nur eben mit dem Feature dass immer nur eine Box angewählt ist ohne die anderen abwählen zu müssen. Diese OptionButtons möchte ich nun mit jedem Klick auf ein und demselben CommandButton nacheinander um eins weiter schalten. Bis der letzte wieder auf den ersten springt.

    Aber ich kriege das nicht hin. Ich bräuchte wohl irgend so was wie einen Next oder Loop Code den ich aber nirgends finden kann.

    Könnt Ihr mir helfen wie ich das gebacken bekomme.

    Besten Dank
    Gruß
    Willkommen im Forum.
    Du postest im VBA-Forum, also programmierst Du wohl nach eigenen Angaben in Excel oder Word. Ich habe es probiert. Funktioniert. Da Du nicht angegeben hast, ob Deine Buttons in Excel liegen oder nicht, ging Neptun von einem UserForm aus. Und da klappt es. Wenn da was von den angenommenen Voraussetzungen nicht stimmt, sollte klar sein, dass Deine nächste Frage genauer/mit mehr Infos kommen sollte. Dann schreibst Du, dass eine Fehlermeldung kommt. Hilfreich wäre es von Dir, wenn Du diese zitieren, also wortgenau wiedergeben würdest, sonst ist Hilfe da nahezu ein Ding der Unmöglichkeit. Dass Du nun eine Lösung hast, ist gut - für Dich. Da dies hier aber ein Forum mit vielen Hilfesuchenden ist, wäre es sinnvoll für andere Suchende, dass Du Deine Lösung teilst. Ansonsten wäre es ein Nehmen ohne Geben.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Hallo, Du wirst mir wohl zustimmen wenn ich sage dass dieses Excel und VBA eine riesige Welt ist. Und mein Wissen ist verschwindend gering, ja eigentlich nicht einmal erwähnenswert würde ich sagen. Deshalb bat ich auch um Hilfe. So war es mir vor deinem Post noch nicht einmal bekannt dass man damit anscheinend auch in Word hantieren kann. ?( Und so ist mir auch der Begriff UserForm etwas fremd. Deshalb mag meine Beschreibung für Euch etwas schwammig, bzw. uneindeutig sein. Mir ist gerade mal so viel bekannt, dass Codes in das Tabellenblatt eingetragen oder als Makro direkt einem Button zugewiesen werden können. Aber selbst dies verwirrt mich häufig so dass ich mich intensiv darauf konzentrieren muss den Durchblick zu behalten. Mein Post war aus Unwissenheit so undefiniert formuliert, möchte ich damit sagen.

    Zu meinem Fall:
    Meine OptionButtons und mein dazugehöriger CommandButton liegen in Excel auf demselben Tabellenblatt.
    Per Rechtsklick navigiere ich über "Code anzeigen" zum Codefenster von Tabellenblatt1.
    In diesem stand folgender Code für den CommandButton:

    SQL-Abfrage

    1. Private Sub CommandButton1_Click()
    2. Range("Punkte").Value = 0
    3. ActiveSheet.Range("b06").Select
    4. End Sub


    Damit setze ich einen definierten Bereich auf "0" zurück und zugleich springt mein Cursor wieder an den Anfang der Tabelle.

    Zu diesem CommandButton wollte ich nun eben diese OptionButton Funktion hinzufügen.
    Das habe nun mit folgender Modifizierung realisieren können:

    SQL-Abfrage

    1. Private Sub CommandButton1_Click()
    2. Dim lngCount As Long
    3. For lngCount = 1 To 5 ' Anzahl OptionButton
    4. If lngCount = 5 Then
    5. Me.Shapes("OptionButton1").OLEFormat.Object.Object.Value = True
    6. Else
    7. If Me.Shapes("OptionButton" & lngCount).OLEFormat.Object.Object.Value = True Then
    8. Me.Shapes("OptionButton" & lngCount + 1).OLEFormat.Object.Object.Value = True: Exit For
    9. End If
    10. End If
    11. Next lngCount
    12. Range("Punkte").Value = 0
    13. ActiveSheet.Range("b06").Select
    14. End Sub


    Nur leider habe ich ein weiteres Problem festgestellt, denn ich möchte nach Bedarf einige OptionButtons ausblenden, und diese sollten dann mit aktiviertem Blattschutz entsprechend übersprungen und gleich der übernächste angewält werden. Ausgeblendet bekomm ich sie aber übersprungen werden sie leider nicht. Sie werden nicht sichtbar im Hintergrund angewählt. Das hätte ich gern noch irgendwie gelöst...


    Und bei dem in diesem Thread genannten Code von Neptun kommt bei mir die Fehlermeldung:
    "Fehler beim Kompilieren: Methode oder Datenobjekt nicht gefunden"
    Mit eben dem Verweis auf "Me.Controls".


    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „toub“ ()

    Aha. Also kein UserForm. Dann kann der Code von Neptun auch nicht funktionieren.
    Ein UserForm kannst Du im VB-Teil von Excel oder Word erstellen und ermöglicht Dir die Erstellung eines Eingabe- und Auswertungsformulars im VB6-Stil.


    Du arbeitest also mit CEs, die direkt auf dem Tabellenblatt sind, ok. Aber Achtung für zukünftige Fragen: Es gibt 2 Arten von direct-to-sheet-CEs: Formularsteuerelemente und ActiveX-Steuerelemente.

    Du verwendest hier ActiveX-CEs.

    Würde mich nicht wundern, wenn z.B. @petaod noch einen einfacheren Weg kennt, aber probier das hier mal:

    Visual Basic-Quellcode

    1. Private Sub CommandButton1_Click()
    2. ToggleOptionButtons
    3. End Sub
    4. Private Sub ToggleOptionButtons()
    5. Static CurrentCeIndex As Integer
    6. Do
    7. CurrentCeIndex = (CurrentCeIndex Mod Me.OLEObjects.Count) + 1
    8. If TypeName(Me.OLEObjects(CurrentCeIndex).Object) = "OptionButton" Then
    9. If Me.OLEObjects(CurrentCeIndex).Visible Then
    10. Me.OLEObjects(CurrentCeIndex).Object.Value = True: Exit Do
    11. End If
    12. End If
    13. Loop
    14. End Sub

    Der Button ruft nur die Sub ToggleOptionButtons auf. Man kann's auch direkt im Button-Click machen. Ich hab mir aber es in VB.Net anders angewöhnt, aber wurscht.
    Zur Erläuterung: Zuerst wird eine Static-Variable angelegt, die ihren Wert behält, auch wenn die Sub verlassen wird. Alternativ kann man auch nach dem selektierten OptionButton suchen und daraufhin ermitteln, welcher der nächste wäre. Wie gewünscht. Danach, in der Do-Schleife, wird der Wert der Static-Variablen um 1 erhöht. Wenn es aber größer als die Anzahl der ActiveX-CEs ist, wird der Wert wieder auf 1 gesetzt (ja, alles in einer Zeile). Danach wird geschaut, ob das xte* CE ein OptionButton ist. Wenn ja und wenn der OptionButton sichtbar ist, wird dieser OptionButton selektiert, erhält also den Auswahlpunkt (o). Danach wird die Do-Schleife verlassen und die Prozedur beendet. Sollte das xte CE aber kein OptionButton sein oder sollte er unsichtbar sein, wird die Schleife wiederholt und das nächste CE ausgewertet.

    *Wenn also die Static-Variable CurrentCeIndex den Wert 3 hat, wird das 3. CE auf dem Blatt ausgewertet
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Hi, vielen Dank für Deine Mühen.

    Hab es getestet. Wählt die OptionButten wunderbar durch, aber markiert den ausgeblendeten trotzdem

    Ich hab aber festgestellt, wenn ich den OptionButton in den Eigenschaften auf VISIBLE:False stelle, dann wird er wie gewünscht übersprungen. Ich müsste also, so meine ich zumindest, nur rausfinden wie ich die OptionButton in das CheckBox-Makro integriert bekomme, damit die dort zeitgleich mit Ausblenden der entsprechenden Zeilen auf VISIBLE:tru/false gestellt werden.

    So sollte es doch klappen oder etwa nicht?!? ;(
    Öhm ... Was verstehst Du unter ausgeblendet, wenn nicht Visible = False? Mit welcher Methode blendest Du Deine OptionButtons sonst aus?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Hallo zusammen,
    ich habe es zum laufen bekommen. VaporiZed´s Code zusammen mit folgendem Kontrollkästchen-Makro bringt genau den gewünschten Erfolg.

    Sub Kontrollkästchen35_Klicken()
    Rows("16:18").Select
    If Selection.EntireRow.Hidden = False Then
    Selection.EntireRow.Hidden = True
    Else
    Selection.EntireRow.Hidden = False
    End If

    Range("$A$1").Select

    If ActiveSheet.OLEObjects("OptionButton5").Visible = False Then
    ActiveSheet.OLEObjects("OptionButton5").Visible = True
    Else
    ActiveSheet.OLEObjects("OptionButton5").Visible = False
    End If
    End Sub


    Vielen lieben Dank nochmal! Alleine hätte ich es nie geschafft.
    Ich wünsche euch alles Gute!
    Gruß
    Sowas hier

    Visual Basic-Quellcode

    1. If Selection.EntireRow.Hidden = False Then
    2. Selection.EntireRow.Hidden = True
    3. Else
    4. Selection.EntireRow.Hidden = False
    5. End If

    kannst Du stark vereinfachen zu:

    Visual Basic-Quellcode

    1. Selection.EntireRow.Hidden = Not Selection.EntireRow.Hidden

    entsprechend der 2. Teil:

    Visual Basic-Quellcode

    1. ActiveSheet.OLEObjects("OptionButton5").Visible = Not ActiveSheet.OLEObjects("OptionButton5").Visible
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.