captainchaos666
Goto Top

automatisches Vorbelegen von Feldern nach auswahl aus einem Dropdown-Menü

Hallo Excel-Experten,

kann ich mit Excel ein definiertes Dropdown-Menü erstellen. Nach der Auswahl sollen dann verschieden Werte in Spalten geschrieben werden.

Beispiel:

Spalte A Auwahliste:

Bestellnummer 100
Bestellnummer 101
Bestellnummer 102

Danach soll Spalte B bei Auswahl Bestellnummer 100 z.B -15- anzeigen, sowie andere Werte in Spalte C und D
Danach soll Spalte B bei Auswahl Bestellnummer 101 z.B -222- anzeigen
Danach soll Spalte B bei Auswahl Bestellnummer 102 z.B -456- anzeigen

Dank Euch im Voraus, und noch ein erholsames Weihnachten


Gruß Alex

Content-Key: 47394

Url: https://administrator.de/contentid/47394

Printed on: April 24, 2024 at 03:04 o'clock

Member: miniversum
miniversum Dec 25, 2006 at 14:08:05 (UTC)
Goto Top
Willst Du ne lösung mit oder ohne Macro?

Ohne würd ichs über Daten -> Gültigkeit machen udn ihm im Benutzerdefinierten die Bestellnummern vorgeben. Dann in B, C und D mit ner Wenn funktion auf A verweisen.

Mit Macro dan halt entsprechend zur Gültigkeit mit gleich den einträgen in B,C und D.

miniversum
Member: captainchaos666
captainchaos666 Dec 25, 2006 at 14:21:58 (UTC)
Goto Top
Wow, das ging schnell,
mit oder ohne Makro ist mir egal, ich möchte danach die Daten aus einer anderen Anwendung mittels VisualBasic auslesen. Bekomme ich dann ein Problem wenn in der Spalte ein Wenn und Dann steht?

Kannst Du mir mal genauer erklären wie es mit Makros geht, hab da keine Ahnung, würde mich aber interessieren

Gruß Alex
Member: miniversum
miniversum Dec 25, 2006 at 14:59:31 (UTC)
Goto Top
Jetzt mal ohne zu Testen müßte das ungefär so aussehen :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Range(Target.Address).Column = Range("A:A").Column Then
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="Bestellnummer 100,Bestellnummer 101,Bestellnummer 102"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
End If

Select Case Range("A" & Range(Target.Address).Row).Value
Case "Bestellnummer 100"
Range("B" & Range(Target.Address).Row).Value = "-15-"
Range("C" & Range(Target.Address).Row).Value = "-25-"
Range("D" & Range(Target.Address).Row).Value = "-35-"
Case "Bestellnummer 101"
Range("B" & Range(Target.Address).Row).Value = "-222-"
Range("C" & Range(Target.Address).Row).Value = "-333-"
Range("D" & Range(Target.Address).Row).Value = "-444-"
Case "Bestellnummer 102"
Range("B" & Range(Target.Address).Row).Value = "-456-"
Range("C" & Range(Target.Address).Row).Value = "-567-"
Range("D" & Range(Target.Address).Row).Value = "-678-"
End Select

End Sub


miniversum
Member: captainchaos666
captainchaos666 Dec 25, 2006 at 21:44:09 (UTC)
Goto Top
@miniversum, Dank Dir das geht! Super!
Kannst du mir noch bis zum ersten End If kommentieren was dort geschieht. Es funktioniert, aber ich verstehe momentan nicht Warum!

Ist es außerdem noch möglich zum Beispiel bei Case "Bestellnummer 102" unter dem Wert "D" nochmals auszuwählen zu lassen

Standard -678- wenn nichts ausgewählt wird, oder alternativ -666-


Vielen Dank nochmals für deine Hilfe!


Gruß Alex
Member: miniversum
miniversum Dec 26, 2006 at 09:13:56 (UTC)
Goto Top
Ok hier die Erklärung:
Allgemeiner Ablauf:
Es wird geprüft ob du eine Zelle im der Spalte A markiert hast und wenn das so ist dan wird für diese Zelle eine Gültigkeitsprüfung erzeugt.

Ablauf im einzelnen:
'hier wird überprüft ob du eine Zelle in Spalte A markiert hast (über Target.Address)
If Range(Target.Address).Column = Range("A:A").Column Then
'ab hier wird eine Gültigkeitsprüfung erzeugt
With Selection.Validation
.Delete 'alte Werte für die Gültigkeitsprüfungen löschen
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=
xlBetween, Formula1:="Bestellnummer 100,Bestellnummer 101,Bestellnummer 102" 'Neue Werte für die Gültigkeitsprüfung anlegen
'ab hier noch andere Parameter wie Leerzeichen ignorieren, das der Pfeil angezeigt wird, und was bei andern Eingaben geschehen soll (Fehlermeldungen oder Hinweise oder so), ist nur der vollständigkeit halber.
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
End If


Wenn du jetzt bei D noch was haben willst könntest du das ganze noch in einander verschachteln, wird aber bei mehreren Angaben recht ausfendig.
Drum würd ich einfach noch den Block für D drunterhängen und die If bedingung am anfang anpassen.
Das ganze wäre also so:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Range(Target.Address).Column = Range("A:A").Column Then
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=
xlBetween, Formula1:="Bestellnummer 100,Bestellnummer 101,Bestellnummer 102"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
End If

Select Case Range("A" & Range(Target.Address).Row).Value
Case "Bestellnummer 100"
Range("B" & Range(Target.Address).Row).Value = "-15-"
Range("C" & Range(Target.Address).Row).Value = "-25-"
Range("D" & Range(Target.Address).Row).Value = "-35-"
Case "Bestellnummer 101"
Range("B" & Range(Target.Address).Row).Value = "-222-"
Range("C" & Range(Target.Address).Row).Value = "-333-"
Range("D" & Range(Target.Address).Row).Value = "-444-"
Case "Bestellnummer 102"
Range("B" & Range(Target.Address).Row).Value = "-456-"
Range("C" & Range(Target.Address).Row).Value = "-567-"
Range("D" & Range(Target.Address).Row).Value = "-678-"
End Select

'Ab hier für D die Auswahl
If Range(Target.Address).Column = Range("D:D").Column And _
Range("A" & Range(Target.Address).Row).Value = "Bestellnummer 102" Then
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=
xlBetween, Formula1:="-678-,-666-"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
End If

End Sub

miniversum
Member: captainchaos666
captainchaos666 Dec 26, 2006 at 09:34:37 (UTC)
Goto Top
Hallo miniversum,
bin begeistert! Danke für deine Hilfe

Wünsch Dir noch ein schönes Fest


Gruß Alex
Member: captainchaos666
captainchaos666 Dec 26, 2006 at 10:37:05 (UTC)
Goto Top
Bitte nochmals ein kleine Erklärung,
Ich habs zwar zum laufen gebracht, aber ich habs einfach in den Tabellen-Ordner und den Modul-Ordner kopiert und danach ein paar mal auf Makro ausführen gedrückt, dann lief es irgendwann!

Wie binde ich Quellcode am struktuiertesten ein?

Muss ich noch für die Auswahl D noch ein Case einbauen, wenn ich 666 bei dem Menü anwähle, dann bekomme ich ein leeres Feld, oder wenn ich nur auf die alte Zeile drücke dann bekomme ich wieder mein alten Wert 678

Gruß Alex
Member: miniversum
miniversum Dec 26, 2006 at 12:11:51 (UTC)
Goto Top
Ok war ein Fehler von mir:
Ändere den Case mal folgendermasen um:

Case "Bestellnummer 102"
Range("B" & Range(Target.Address).Row).Value = "-456-"
Range("C" & Range(Target.Address).Row).Value = "-567-"
if not Range("D" & Range(Target.Address).Row).Value = "-678-" or Range("D" & Range(Target.Address).Row).Value = "-666-" then Range("D" & Range(Target.Address).Row).Value = "-678-"

Das mit den einfach reinkopieren stimmt aber das mit dem selbst Makro ausführen brauchst du eigentlich nicht.
Es sollte immer laufen sobald du auf ein Feld in der Tabelle klickst, weil die Funktion ja Worksheet_SelectionChange(ByVal Target As Range) heißt.
Hast du es in einen Modul Ordner (modul 1 oder so) kopiert? Es muß im Tabellenblat (z.B. Tabelle1) stehen.


Wen du smal ausprobieren willst kannst du ja mal folgendes in Tabelle1 (oder wie es bei dir heist) kopieren:

Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox Target.Address
End Sub

Hier sollte einfach nur imemr in Meldungsfenster aufgeben was dir Anzeigt welche Zelle du angeklickt hast.

miniversum
Member: captainchaos666
captainchaos666 Dec 26, 2006 at 13:21:12 (UTC)
Goto Top
Hallo miniversum,
den Wert 666 kann ich immer noch nicht anwählen. Wenn ich auf 666 im Menü wähle bekomme ich ein leeres Feld, wenn ich die Zeile nochmals anklicke bekomme ich den default Wert! Denn Wert 666 kann ich nicht auswählen. Was wolltest du mit der If Not Bedingung erreichen, das der default Wert geschrieben wird oder?

Gruß Alex
Member: miniversum
miniversum Dec 26, 2006 at 14:44:19 (UTC)
Goto Top
Das er den wert ncith verändert wenn 678 oder 666 drinsteht
Ich hab das aus dem Kopf geschrieben und nicht getestet sorry.

Sollte eigentlch gehen so.

miniversum
Member: captainchaos666
captainchaos666 Dec 27, 2006 at 12:59:31 (UTC)
Goto Top
Hallo ich bekomme den Quellcode einfach nicht gebacken, kann mir jemand weiterhelfen


Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Range(Target.Address).Column = Range("A2:A10").Column Then
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="Bestellnummer 100,Bestellnummer 101,Bestellnummer 102"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
End If

'Hier für E die Auswahl
If Range(Target.Address).Column = Range("E2:E10").Column And Range("A" & Range(Target.Address).Row).Value = "Bestellnummer 101" Then
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="-678-,-666-"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
End If

' Vorbelegung Werte
Select Case Range("A" & Range(Target.Address).Row).Value
Case "Bestellnummer 100"
Range("B" & Range(Target.Address).Row).Value = "-15-"
Range("C" & Range(Target.Address).Row).Value = "-25-"
Range("D" & Range(Target.Address).Row).Value = "-35-"
Case "Bestellnummer 101"
Range("B" & Range(Target.Address).Row).Value = "-222-"
Range("C" & Range(Target.Address).Row).Value = "-333-"
Range("D" & Range(Target.Address).Row).Value = "-444-"
Case "Bestellnummer 102"
Range("B" & Range(Target.Address).Row).Value = "-456-"
Range("C" & Range(Target.Address).Row).Value = "-567-"
Range("D" & Range(Target.Address).Row).Value = "-777-"
End Select
End Sub

Hab momentan folgende Probleme!
- Mit Range("A2:A10") soll die erste Auswahl doch nur von Feld A2 bis A10 funktionieren, bei mir geht es über die ganze Excelliste (Zeile 1 bis Zeile xxxxx)?
- Bei Auswahl E kann ich zwar nach der Bedingung auswählen, aber es wird kein Wert angezeigt?
- Wenn ich in die Zeile Klicke egal wo, so wird die ganze Zeile aktualisiert, ist es möglich die Aktualisierung nur dann durchzuführen wenn auf Spalte A geklickt wurde oder was im Menü A ausgewählt wurde?

Kann mir jemand weiterhelfen

Gruß Alex
Member: bastla
bastla Dec 27, 2006 at 18:37:54 (UTC)
Goto Top
Hallo captainchaos666!

- Mit Range("A2:A10") soll die erste Auswahl doch nur von Feld A2 bis A10 funktionieren, bei mir geht es über die ganze Excelliste (Zeile 1 bis Zeile xxxxx)?
Ändere die Zeile If Range(Target.Address).Column = Range("A2:A10").Column Then in
If Not Intersect(Target, Range("A2:A10")) Is Nothing Then  

Analog dazu müsstest Du (zur Sicherheit) auch für die Spalte E schreiben:
If Not Intersect(Target, Range("E2:E10")) Is Nothing And Range("A" & Range(Target.Address).Row).Value = "Bestellnummer 101" Then  

- Bei Auswahl E kann ich zwar nach der Bedingung auswählen, aber es wird kein Wert angezeigt?
Ich gehe davon aus, dass das führende Minuszeichen zB in "-666-" stört. Kannst Du
  • dieses vermeiden,
  • durch ein benutzerdefiniertes Zahlenformat ersetzen oder
  • die Zellen vorweg als "Text" formatieren?
Ansonsten könntest Du noch im Code die Schreibweise mit Apostroph (') versuchen, also:
Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="'-678-,'-666-"  
- sieht zwar in der Liste nicht so gut aus, funktioniert aber (zumindest bei mir).

- Wenn ich in die Zeile Klicke egal wo, so wird die ganze Zeile aktualisiert, ist es möglich die Aktualisierung nur dann durchzuführen wenn auf Spalte A geklickt wurde oder was im Menü A ausgewählt wurde?
Meinst Du mit "aktualisiert", dass der Programmteil "Vorbelegung Werte" ausgeführt wird? Falls ja, könntest Du diesen Teil auf das Ereignis "Worksheet_Change" beziehen und den ganzen Block in das folgende Sub stellen (im "Worksheet_SelectionChange"-Ereignis brauchst Du ihn dann natürlich nicht mehr):
Private Sub Worksheet_Change(ByVal Target As Range)
'nur bei einer Änderung in den Zellen "A2:A10"  
If Intersect(Target, Range("A2:A10")) Is Nothing Then Exit Sub  

' Vorbelegung Werte  
Select Case Range("A" & Range(Target.Address).Row).Value  
Case "Bestellnummer 100"  
Range("B" & Range(Target.Address).Row).Value = "-15-"  
Range("C" & Range(Target.Address).Row).Value = "-25-"  
Range("D" & Range(Target.Address).Row).Value = "-35-"  
Case "Bestellnummer 101"  
Range("B" & Range(Target.Address).Row).Value = "-222-"  
Range("C" & Range(Target.Address).Row).Value = "-333-"  
Range("D" & Range(Target.Address).Row).Value = "-444-"  
Case "Bestellnummer 102"  
Range("B" & Range(Target.Address).Row).Value = "-456-"  
Range("C" & Range(Target.Address).Row).Value = "-567-"  
If Not Range("D" & Range(Target.Address).Row).Value = "-666-" Then Range("D" & Range(Target.Address).Row).Value = "-678-"  
End Select
End Sub
Die Zuweisung für Spalte D bei "Bestellnummer 102" habe ich so verstanden, dass eine Vorbelegung mit "-678-" erfolgen soll, falls nicht schon ein Eintrag "-666-" existiert - richtig? Auf Basis dieser Annahme habe ich den Code etwas vereinfacht.

HTH
bastla
Member: miniversum
miniversum Dec 27, 2006 at 18:41:04 (UTC)
Goto Top
Die Einschränkung, dass nur dann was verändert wird wenn du in einem bestimmten Bereich was änderst bzw. draufklickst sollte eigentlich durch das

If Range(Target.Address).Column = Range("A:A").Column Then

realisiert werden. -> Nur Änderungen bzw reagieren wenn Du irgentwo in die A Spalte klickst.

Target.Address liefert dir dabei die Zelle in die Du geklickt hast.
(Target.Address).Column Die Spalte in die du geklickt hast.
(Target.Address).Row Die Zeile in die du geklickt hast.

If Range(Target.Address).Column = Range("A2:A10").Column
bzw.
If Range(Target.Address).Column = Range("E2:E10").Column
kann also deshalb nicht Funktionieren weil du eine Spalte mit einer Spalte des Bereichs vergleichst. Du könntest aber die zeilen noch vergleichen udn dadurch den bereich einschränken.

miniversum