# Dropdown-Menü abhängig machen von eingegebener Zahl?



## noshapes (31. Juli 2012)

Hallo!

Ich schreibe gerade an einem Kalkulations-Werkzeug wo wir Menüs berechnen - automatisch. Soweit so gut aber jetzt würde ich gerne das in einem weiteren Tabellenblatt die Anzahl der Dropdown-Menüs variabel sind. Sprich ich gebe 2 ein und es tauchen auch nur zwei auf. Gebe ich fünf ein sollen es entsprechend mehr sein oder bei 1 eben weniger.

Ist Excel dazu fähig? Wenn ja wie?


----------



## tombe (31. Juli 2012)

Hallo,

welche Art von Dropdown Menüs verwendest du da.
Sind das normale Zellen denen eine bestimmte Gültigkeit zugeordnet wurde oder sind das Listen die mit der Steuerelement-Toolbox erstellt wurden?

Guß Thomas


----------



## noshapes (31. Juli 2012)

Hallo,

ich verwende Excel 2010 und die Dropdown-Variante, die sich über Daten -> Datenüberprüfung und Datenüberprüfung erstellen lässt. Oder hatte das zumindest vor. Sprich in verschiedenen Zellen die nötigen Daten eingeben und bei Bedarf ausgeben lassen (in entsprechender Anzahl).

Meine Idee wäre das mit einer WENN-Abfrage zu gestalten und dann zu sagen: WENN <0; DANN DD ausgeben. Wobei dann die DDs unterhalb erfolgen sollen und die 0 entsprechend hoch sein wird (je nach Anzahl der Menüs, die benötigt werden).

Hoffe das ist irgendwie verständlich ausgdedrückt. ;-)


----------



## HonniCilest (31. Juli 2012)

Schau mal hier:


```
' Excel-Event, welches bei Zell-Änderung ausgelöst wird, d.h. manuelles Makro-Ausführen nicht notwendig
' Die Funktion muss dem Eingabe-Tabellenblatt hinterlegt werden!
Private Sub Worksheet_Change(ByVal Target As Range)

    ' überprüft, ob es sich bei der geänderten Zelle um das Eingabefeld (hier A1) handelt
    If Target.Row = 1 And Target.Column = 1 Then
    
        ' überprüft, ob im Eingabefeld ein Zahlenwert eingetragen wurde
        If IsNumeric(Target.Text) Then
        
            ' leert alle bestehenden Dropdowns (hier Tabelle2 Spalte A)
            Worksheets(2).Columns(1).Clear
        
            ' von Zeile 1 bis angegebene Zeile
            For I = 1 To Int(Target.Text)
            
                ' setze Dropdown (hier mit X,Y) in der aktuellen Zeile und der entsprechenden Spalte (hier Tabelle2 SpalteA)
                ' dieser Block wurde mit Macro-Recorder aufgezeichnet
                With Worksheets(2).Cells(I, 1).Validation
                    .Delete
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="X,Y"
                    .IgnoreBlank = True
                    .InCellDropdown = True
                    .InputTitle = ""
                    .ErrorTitle = ""
                    .InputMessage = ""
                    .ErrorMessage = ""
                    .ShowInput = True
                    .ShowError = True
                End With
                
            Next I
        End If
    End If
End Sub
```

Das muss natürlich entsprechend angepasst werden.
Hinweis von mir am Rande: Gültigkeits-Werte kannst du entweder im Code definieren (wie oben), im gleichen Tabellenblatt wie Dropdowns definieren oder im seperaten Tabellen definieren, hier muss der Bereich aber ein benannter Bereich sein.


----------



## noshapes (31. Juli 2012)

Großartig. Ich versteh nur Bahnhof aber ich kämpf mich da mal beizeiten durch. Bei Fragen dazu stell ich sie hier. Mal schauen.


----------



## noshapes (1. August 2012)

Hallo,

ich kann ohne VBA-Kenntnisse nichts mit den Zeilen 17-29 anfangen. Steht X,Y für den "Koordinaten" in der Tabelle wo die Daten für das Dropdown zu finden sind? Also inkl. dem angelegten Dropdown-Menü als solches?

Wenn "Worksheets" namen haben, muss dort ein Name statt der Zahl eingefügt werden? Wenn ja mit irgendwelchen "umgebenden" Zeichen? Also 'Tabelle1', 'Tabelle2'...?

MUss in Zeile 15 hinter dem "to" noch eine Zahl eingegeben werden oder ist das aktuell ausreichen?


----------



## tombe (1. August 2012)

Diese Anweisungen erzeugen "nur" die Listen in Excel. Genauso wie wenn du im Menü auf "Daten -> Gültigkeit -> Liste" gehst.

Die Angaben "X, Y" sind keine Zellbezüge sondern die Werte die in der Liste erscheinen. Es kommte genauso "Hund, Katze, Maus" heißen.

Anstatt "Worksheets" kannst du auch schreiben "Tabelle1" oder "Tabelle2" usw. wobei du einfach nur den Namen schreibst ohne irgendwelche Zeichen.

Hinter "To" steht ja quasi eine Zahl. Es ist der Wert den du in die Zelle eingibst. Beispielsweise also 1, 2, ..., 5.


----------



## HonniCilest (1. August 2012)

noshapes hat gesagt.:


> Großartig. Ich versteh nur Bahnhof aber ich kämpf mich da mal beizeiten durch. Bei Fragen dazu stell ich sie hier. Mal schauen.



Alternativ kannst du mir auch folgende Angaben geben und ich ändere die entsprechenden Stellen um:
- Welches ist die Eingabezelle?
- Wo ist der Inhalt der ComboBox definiert?
- Wo sollen die ComboBoxen erscheinen?


----------



## noshapes (1. August 2012)

Danke für die Hilfe.

Problem ist allerdings nun, dass ich versuchen soll das simpler zu gestalten damit andere Mitarbeiter, die da nicht so firm sind auch Änderungen vornehmen können.

Sprich:
Ich versuche gerade mit einer WENN-Abfrage zu realisieren, dass bei "größer-als" die Liste ausgegeben wird (aus einem anderen Tabellenblatt namens "DD"). Funktioniert aber so irgendwie nicht.
Hatte bisher folgendes:

```
=WENN(B1>0;INDIREKT("DD!$A$1");)
```
Dachte so würde das ganze DD-Menü mitbekommen was in Tabelle DD auf A1 liegt aber da kam nur der Text im Feld.

@HonniCilest
Falls du magst kannst du Bezeichnungen ja verwenden, vielleicht bekomme ich das nur so mit VBA hin allerdings fehlen auch mir da die Kenntnisse für weitere Arbeiten daran (später).


----------



## HonniCilest (1. August 2012)

noshapes hat gesagt.:


> Problem ist allerdings nun, dass ich versuchen soll das simpler zu gestalten damit andere Mitarbeiter, die da nicht so firm sind auch Änderungen vornehmen können.



Klingt als wüsstest ihr garnicht so richtig, was ihr eigentlich wollt. Wenn die Anforderungen klar wären müsste man doch nichts mehr anpassen später?

Aus deiner Formel kann ich nur herauslesen, dass das Eingabefeld B1 ist. Was ist mit den anderen 2 Fragen?


----------



## noshapes (1. August 2012)

Eingabezeile? Von was? Des Dropdown-Menüs? Tabelle5 oder als Name "DD", A1. Ausgegeben soll das in B1 in Tabelle4. Das Eingabefeld der Zahl, welche nachher bestimmt wieviele Dropdownmenüs untereinander erscheinen soll (Tab4, B1, C1, D1,...).

Mit nicht wissen was wir wollen hat das nichts zu tun. Menükarten sind saisonbedingt und das hier soll das anpassbar sein.


----------



## HonniCilest (2. August 2012)

> Eingabezeile? Von was? Des Dropdown-Menüs? Tabelle5 oder als Name "DD", A1. Ausgegeben soll das in B1 in Tabelle4. Das Eingabefeld der Zahl, welche nachher bestimmt wieviele Dropdownmenüs untereinander erscheinen soll (Tab4, B1, C1, D1,...).



Verwirrt mich ein wenig. Mit Eingabfeld meinte ich das Feld, wo drin steht wieviele ComboBoxen erscheinen sollen. Heißt das jetzt du hast mehrere davon?



> Mit nicht wissen was wir wollen hat das nichts zu tun. Menükarten sind saisonbedingt und das hier soll das anpassbar sein.



Doch eigentlich schon. Ein Tool ist normalerweisse nicht dazu da jedes Jahr bzw. Saison angepasst zu werden. Die einzigste Anpassung wäre in meinen Augen hier die Auswahl in der ComboBox, ich gehe davon aus, dass es sich hier um verfügbare Getränke/Speisen oder dergleichen handelt. Aber diese Anpassung kann man trotz dem Code auch ohne Makro-Kenntnis vornehmen, wenn das Tool entsprechend aufgebaut ist.

Ich biete dir weiterhin an es entsprechend aufzubauen/anzupassen, aber ich bräuchte dafür einfach klar definierten Input.


----------



## noshapes (2. August 2012)

Ich fange von vorne an.

Auf dem vierten Tabellenblatt namens "Auto-Kalk" ist in B1 eine Zahl anzugeben. Diese wird bestimmen wieviele Boxen mit dem gleichen Inhalt auf A2, A3, A4 (also untereinander) erscheinen. Das Dropdown-Menü fängt im fünften Blatt namens DD an (A1:A5).

Erscheinen die Auswahlmenüs sollen die Einträge (1 Eintrag / Zelle auf Blatt 5 DD ab A2:A5; also vier Einträge) anschließend klickbar sein. Ist der Eintrag ausgewählt soll aus dem dritten Blatt "Einzelmenüs" dann der jeweilige Preis herausgezogen werden. Sprich Menü1 soll dann aus Blatt 3 "Einzelmenüs" aus J17 ziehen usw.


----------



## HonniCilest (2. August 2012)

Ich hab' mal ein Beispiel gemacht wie ich es mir etwa vorstelle und mich dabei an ein paar Angaben von dir orientiert. Das Tabellenblatt DD habe ich dabei bewusst weggelassen.


----------



## noshapes (3. August 2012)

Vielen Dank. In deiner File funktionierts, passe ich es an (oder versuche es), klappt es wieder nicht. Eigentlich müsste ich nur Speisen in Gerichtname umwandeln und die Spalte anpassen, brauche ich aber (glaube ich) nicht, da die ganze Matrix ja verwendet wird oder wird irgendwas spezifiziert irgendwo? Sprich nur Spalte J oder dergleichen? Versuche es nur zu verstehen da ich auch mal unabhängig sowas machen möchte und verstehen will.


----------



## HonniCilest (3. August 2012)

noshapes hat gesagt.:


> Eigentlich müsste ich nur Speisen in Gerichtname umwandeln und die Spalte anpassen, brauche ich aber (glaube ich) nicht, da die ganze Matrix ja verwendet wird oder wird irgendwas spezifiziert irgendwo?



Ja, es ist etwas außerhalb des Codes definiert, der benannte Bereich. Den Benannten Bereich musst du für die Spalte J abändern. Das machst du unter Einfügen --> Namen --> Definieren


----------



## noshapes (3. August 2012)

Ist das da wo 
	
	
	



```
For I =
```
 im Makro-Code steht? Muss da dann 
	
	
	



```
For J =
```
 stehen. Entschuldigt die vielleicht etwas "unsinnige" Fragerei, versuch das nur zu verstehen. Sonst blicke ich da keine andere aus meine Sicht sinnige Anpassungsmöglichkeit. Wofür 
	
	
	



```
Cells(I, 3).FormulaR1C1 = "=VLOOKUP(RC[-2],Einzelmenüs!R2C2:R1001C3,2,FALSE)"
```
?
 Und wie definiere ich einen Namen in 2010? Da muss ich ja nur rechter Mausklick und Namen der Zelle definieren, richtig? Das habe ich schon, klappt aber dennoch nicht.

Code sieht wie folgt aus:

```
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Row = 1 And Target.Column = 2 Then
        If IsNumeric(Target.Text) Then
            Range("A2:C1001").Clear
            For I = 2 To Int(Target.Text) + 1
                With Cells(I, 1).Validation
                    .Delete
                    .Add Type:=x1ValidateList, AlertStyle:=x1ValidAlertStop, Operator:=x1Between, Formula1:="=Gerichtname"
                    .IgnoreBlank = True
                    .InputTitle = ""
                    .ErrorTitle = ""
                    .InputMessage = ""
                    .ErrorMessage = ""
                    .ShowInput = True
                    .ShowError = True
                End With
                
                Cells(I, 3).FormulaR1C1 = "=VLOOKUP(RC[-2],Einzelmenüs!R2C2:R1001C3,2,FALSE)"
            Next I
        End If
    End If
End Sub
```

Die Spalte wo die Inhalte für die DD-Menüs zur Auswahl des jeweiligen Menüs ausgewählt wird liegt in "Einzelmenüs" auf Spalte "A" wobei ab A3 senkrecht es dann los geht. In A3 steht dann auch "Gerichtname". Das musste ich ja im Code auch schreiben anstatt Speisen, korrekt?


----------



## HonniCilest (3. August 2012)

Speisen ist der Name des Benannten Bereiches und hat nichts mit der Spaltenüberschrift zu tun. Auch in Office 2010 müsstest du den Menüpunkt unter "Einfügen" finden. Schau dort mal nach Namen definieren.


----------

