Clever-Excel-Forum

Normale Version: Optionsbutton in Formular wechselweise auswählen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,

ich habe ein Formular, in dem soll pro Zeile immer 1 von 3 oder 1 von 2 Knöpfen ausgewählt werden können.

Ich habe so begonnen:
Frage geschrieben und in die Folgespalte 3 Options-Buttons eingefügt. Nun kann ich von den 3 Buttons einen auswählen. Wenn ich einen anderen auswähle, wird die erste Wahl gelöscht.

Da es ungefähr 100 Fragen werden sollen, dachte ich, ich kopiere die Buttons in die Folgezeilen.

Wenn ich aber nun diese drei Buttons in die zweite Zeile kopiere, werden die 3 der zweiten Zeile mit den ersten 3 verknüpft, es geschieht also die Auswahl 1 aus 6 und nicht 2x 1 aus 3.


Wie kann ich das machen, daß immer nur in jeder Zeile 1 aus 3 ausgewählt werden kann?
Geht das mit diesen Knöpfen überhaupt?
Sollte ich andere Buttons nehmen? Welche?
Hallo Ralf,

wenn ich mich nicht irre, mußt Du die Buttons gruppieren. Und pro Gruppierung kannst Du dann wie gewünscht einen Button auswählen.
Hallo Ralf,

bei ActiveX - Buttons geht das über die Eigenschaft GroupName. Wenn Du die einfügst, steht bei Excel normalerweise der Name des Tabellenblattes drin. Da machst Du bei den jeweils zusmamengehörenden was anderes draus, kann ja in Anlehnung an den Blattname z.B. Tabelle1_01, Tabelle1_02 sein.
Hi Stefan,

(28.06.2014, 20:49)Steffl schrieb: [ -> ]wenn ich mich nicht irre, mußt Du die Buttons gruppieren. Und pro Gruppierung kannst Du dann wie gewünscht einen Button auswählen.

nein, das war es leider nicht. Aber Andrés Tipp hat geholfen, so geht es.
Hi André,

(28.06.2014, 20:53)schauan schrieb: [ -> ]kann ja in Anlehnung an den Blattname z.B. Tabelle1_01, Tabelle1_02 sein.

ja, das ist eine Lösung. Das geht, ist aber natürlich etwas mühsam bei 100 Fragen.

Kann ich diesen Namen auch automatisch ändern? Oder kann ich ein Makro schreiben, daß mir immer in die Zeile, in der in B was steht, in C, D und E einen ActiveX-Button einfügt und und diese 3 über den Namen verknüpft.

Ich habe mir folgenden umgangssprachlichen Code-Text ausgedacht:

Code:
Sub Buttons_erzeugen_umbenennen()
For i = 2 to 500
   j = 2
   If range("B" & i) <> "" then
      kopiere Button Tabelle1_01 in Range("C" & i)
      kopiere Button Tabelle1_01 in Range("D" & i)
      kopiere Button Tabelle1_01 in Range("E" & i)
      Rename Button Tabelle1_neu zu Button Tabelle1_j
   End If
   j = j + 1
Next i
End Sub

Geht das überhaupt?
Wie müßte das Makro lauten?
(28.06.2014, 21:01)Rabe schrieb: [ -> ]Hi Stefan,

(28.06.2014, 20:49)Steffl schrieb: [ -> ]wenn ich mich nicht irre, mußt Du die Buttons gruppieren. Und pro Gruppierung kannst Du dann wie gewünscht einen Button auswählen.

nein, das war es leider nicht. Aber Andrés Tipp hat geholfen, so geht es.

Hallo Ralf,

und was ist da jetzt der Unterschied?
Gruppieren und GroupName vergeben ist doch dasselbe.

Und die zweite Variante (in Userforms) ist die Einbindung in verschiedene Frames. Smile

Gruß Uwe
Hallo Uwe,

... ist es wohl nicht, probiers mal aus.

Hallo Ralf,

in Excel geht das Erzeugen von OptionButtons und Zuweisen von Eigenschaften im Prinzip so. Manche Eigenschaften des OptionButtons kannst Du im ersten WITH setzen - z.B. LinkedCell. Andere wiederum musst Du im zweiten WITH .OBJECT setzen, musst Du mal ausprobieren - mach ich auch nicht anders Wink

Alternativ wäre die Klassenprogrammierung möglich bzw. nötig, wenn Du z.B. code zuweisen willst.

Code:
Option Explicit
'Variablendeklaration
'Integer fuer alle mit i beginnenden Variablen
DefInt I

Sub Makro1()
'Variablendeklarationen - Typ Integer ueber DefInt
Dim iCnt1, iCnt2, iCnt3
'Schleife 6 mal durchlaufen
For iCnt1 = 1 To 6
  'Multiplikator fuer Left und Zeilennummer, Gruppenname
  iCnt2 = Int((iCnt1 - 1) / 3) + 1
  'oButtonbeschriftung
  iCnt3 = (iCnt1 + 2) Mod 3
  'oButton erzeugen, Positionieren anhand Variablen und Zellposition, feste Breite und Hoehe anhand positionierter Zelle
  With ActiveSheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1", Link:=False, _
      DisplayAsIcon:=False, Left:=Cells(iCnt2, 5).Left + iCnt3 * 30, Top:=Cells(iCnt2, 5).Top, Width:=30, Height:= _
      Cells(iCnt2, 5).Height)
    'Verknuepfung
    .LinkedCell = "Tabelle1!" & Cells(iCnt2, iCnt3 + 1).Address
    'mit dem (erzeugten) Objekt
    With .Object
      'Beschriftung
      .Caption = Format(iCnt3, "0#")
      'Gruppenname
      .GroupName = "Tabelle1_" & Format(iCnt2, "0#")
    'Ende mit dem (erzeugten) Objekt
    End With
  'Ende oButton erzeugen, ...
  End With
  'Ende Schleife 6 mal durchlaufen
Next
End Sub
Hi André,

(29.06.2014, 05:35)schauan schrieb: [ -> ]in Excel geht das Erzeugen von OptionButtons und Zuweisen von Eigenschaften im Prinzip so. Manche Eigenschaften des OptionButtons kannst Du im ersten WITH setzen - z.B. LinkedCell. Andere wiederum musst Du im zweiten WITH .OBJECT setzen, musst Du mal ausprobieren - mach ich auch nicht anders ;-)

danke.
Ich habe mir nun das Makro so angepaßt, daß es mir in 100 Zeilen nach Inhalt in Spalte B sucht und dort dann die 3 Buttons in Spalte C einfügt.

Option Explicit
'Variablendeklaration
'Integer fuer alle mit i beginnenden Variablen
DefInt I

Sub oButtons_einfügen()
    'Variablendeklarationen - Typ Integer ueber DefInt
    Dim iCnt1, iCnt2, iCnt3, iZeile, iStart
   
    'Setzen Startzeile
    iStart = 6
   
    'Löschen aller Buttons
    For iZeile = iStart To iStart + 100
         ActiveSheet.OLEObjects.Delete
    Next iZeile
    '    MsgBox ("alle gelöscht")
   
    'Schleife für 100 Zeilen
    For iZeile = iStart To iStart + 100
         'Falls in Spalte B etwas steht
         If Range("B" & iZeile) <> "" Then
              'Schleife 6 mal durchlaufen, das bedeutet 6 Buttons (= 2x 3)
              For iCnt1 = 1 To 3          'geändert auf 3 Buttons
                   'Multiplikator fuer Left und Zeilennummer, Gruppenname
                   iCnt2 = Int((iCnt1 - 1) / 3) + 1
                   'oButtonbeschriftung
                   iCnt3 = (iCnt1 + 2) Mod 3
                   
                   'oButton erzeugen, Positionieren anhand Variablen und Zellposition, feste Breite und Hoehe anhand positionierter Zelle
                   With ActiveSheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1", Link:=False, _
                       DisplayAsIcon:=False, Left:=Cells(iZeile, 3).Left + iCnt3 * 30, _
                       Top:=Cells(iZeile, 3).Top, Width:=30, Height:=Cells(iZeile, 3).Height)
                        'Verknuepfung
                        '.LinkedCell = "Tabelle1!" & Cells(iCnt2, iCnt3 + 1).Address
                       
                        'mit dem (erzeugten) Objekt
                        With .Object
                             'Beschriftung
                             .Caption = ""               'Format(iCnt3, "0#")
                             'Gruppenname
                             .GroupName = ActiveSheet.Name & "_" & Format(iZeile, "0#")    ' "Tabelle1_" & Format(iZeile, "0#")
                             'Ende mit dem (erzeugten) Objekt
                        End With
                       
                        'Ende oButton erzeugen, ...
                   End With
                   
                   'Ende Schleife 6 mal durchlaufen
              Next iCnt1
             
              'Ende Prüfung Inhalt Spalte B
         End If
         
         'Ende Schleife 100 Zeilen
    Next iZeile
   
End Sub



Wie ist es möglich, die drei Buttons nicht in Spalte C, sondern je einen in C, D und E einzufügen?
Hallo Ralf,

jetzt wird die linke Position so gesetzt:

Code:
Left:=Cells(iZeile, 3).Left + iCnt3 * 30,

Die 3 steht für Spalte C, und mit iCnt3 berechne ich einen Versatz. iCnt3 ist beim ersten Durchlauf 0, dann 1, dann 2 In der nächsten Zeile geht's wieder mit 0 los.

Wenn Du die Buttons in 3 Spalten willst, dann addiere iCnt zur Spaltenzahl und nim dafür den Versatz weg - also

Code:
Left:=Cells(iZeile, 3 + iCnt3).Left
Hi André,

(29.06.2014, 13:01)schauan schrieb: [ -> ]Wenn Du die Buttons in 3 Spalten willst, dann addiere iCnt zur Spaltenzahl und nim dafür den Versatz weg - also

Code:
Left:=Cells(iZeile, 3 + iCnt3).Left

schön, so habe ich es nun geändert und dabei auch gleich ein ungefähres Zentrieren der Buttons in der Spalte realisiert:

                    With ActiveSheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1", Link:=False, _
                        DisplayAsIcon:=False, Left:=Cells(iZeile, 3 + iCnt3).Left + Cells(iZeile, 3 + iCnt3).Width / 3, _
                        Top:=Cells(iZeile, 3).Top + 2, Width:=10, Height:=10)