Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1860to1864
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Mehrfachauswahl drop down

Mehrfachauswahl drop down
06.12.2021 07:55:16
Hannes
Hallo zusammen,
hier eine Beispieldatei zu meinem Problem:
https://www.herber.de/bbs/user/149609.xlsm
Wenn ich in Spalte 1 nun die Auswahl 1 treffe und daraufhin die Auswahl 2, wird es wie gewünscht in einer Zelle mit kommatrennung angezeigt.
Wenn ich nun eine Zelle tiefer gehe und 3 auswähle erhalte ich 1, 2, 3. Bei Sprung in eine neue Zelle soll allerdings nicht der Wert aus der davorriegen übertragen werden. Gleiches passiert auch bei sprung in eine Zelle einer anderen Spalte.
Kann mir da jemand den Code entsprechend umschreiben, dass ich bei Eingabe in eine neue Zelle nicht die Einträge der davorriegen erhalte?
Mein Code ist wie folgt:
Const bolSorted As Boolean = True ' Legt fest, ob die Werte noch sortiert werden.
Dim blockedEvent As Boolean
Dim TargetOldText As String

Private Sub Worksheet_Change(ByVal Target As Range)
Dim strResult As String
Dim strTarget As String
Dim arrSorted As Variant
Dim i As Long
If Target.Column = 1 Or Target.Column = 2 Or Target.Column = 3 Then
strTarget = Trim(Target.Value)
If Not blockedEvent Then
blockedEvent = True
If Not TargetOldText = "" And Not Target.Value = "" Then
If InStr(1, TargetOldText, Target.Value) > 0 Then
strResult = Replace(TargetOldText, ", " & strTarget, "")
strResult = Replace(strResult, strTarget & ", ", "")
strResult = Replace(strResult, strTarget, "")
Else
strResult = TargetOldText & ", " & Target.Value
End If
If bolSorted Then
arrSorted = Split(strResult, ", ")
strResult = ""
Call Selectionsort(arrSorted)
For i = 0 To UBound(arrSorted)
strResult = strResult & arrSorted(i) & ", "
Next i
If Len(strResult) > 1 Then _
strResult = Left$(strResult, Len(strResult) - 2)
End If
Target.Value = strResult
Else
Target.Value = Target.Value
End If
TargetOldText = Target.Value
Else
blockedEvent = False
End If
Else
TargetOldText = ""
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
If Target.Column = TargetColumn Then
TargetOldText = Target.Value
End If
[TargetZeile] = Target.Row
[TargetSpalte] = Target.Column
[TargetValue] = Target.Value
End Sub

Private Sub Selectionsort(ByRef data As Variant)
Dim OG&, i&, j&, k&, h As Variant
OG = UBound(data)
For i = 0 To OG - 1
h = data(i)
k = i
For j = i + 1 To OG
If data(j) 

21
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
um Sicherzustellen, dass wir verstanden haben...
06.12.2021 09:40:56
Yal
Hallo Hannes,
Du möchtest, wenn man in Spalte A die Zelle 1 und 2 selektiert hat, dass in der Zielzelle
Inhalt A1, Semikolon, Inhalt A2
angezeigt wird.
Dementsprechend bei 1,2,6
A1;A2;A6
und nicht die Verkettung von alles dazwischen.
Ich gehe davon aus, dass deine Bestellung in der Worksheet_Change eingebaut/geliefert werden soll. Also brauchen wir den Rest nicht.
Richtig so?
VG
Yal
AW: um Sicherzustellen, dass wir verstanden haben...
06.12.2021 09:52:02
Hannes
Hallo,
Ich denke du hast es verstanden.
Vielleicht hilft diese Beschreibung noch mal...
Es geht mir darum, dass ich eine Zelle per dropdown füllen kann. Dabei soll bei mehrfachauswahl des dropdowns eine Auflistung in der Zelle selber erfolgen. Das passiert ja auch, aber bei auswahl einer neuen Zelle wird der eintrag aus der davorriegen zelle übernommen und dann mit der auswahl aus dem drop down der jetzt ausgewählten Zelle ergänzt. Hier soll der Inhalt aber erst leer bleiben und dann mit der auswahl gefüllt werden.
Ich hoffe ich konnte mein Problem einigermaßen Beschreiben.
Gruß Hannes
Anzeige
Datei ist notwendig
06.12.2021 10:08:45
Yal
Hallo Hannes,
Du hast den haken bei "Frage noch offen" vergessen.
Der Code ist in dem Fall nicht ausreichend, um zu nachvollziehen, was da passiert.
Die Datei ist notwendig.
(Beseitige davor alles, was nicht in der Öffentlichkeit gehört, aber lasse so viel rein, dass nachvollziehbar ist, was passiert/passieren soll.)
Vergiss den "Frage offen" nicht. Ich komme heute vielleicht nicht dazu und jemand anderes könnte so das Thema übernehmen.
VG
Yal
AW: Datei ist notwendig
06.12.2021 10:18:31
Hannes
Hallo,
vielen Dank für den Hinweis mit dem Haken.
In dieser Datei sollte mein Anliegen klar werden:
https://www.herber.de/bbs/user/149609.xlsm
Wenn ich in A2 1,2 wähle und dann in A3 nur 3 per drop down auswählen möchte, erhalte ich in A3 den Eintrag 1,2,3 ... es soll aber nur 3 erscheinen
Anderes Beispiel:
Ich wähle in A2 per dropdown 1 aus und möchte daraufhin in B2 per dropdown A auswählen... es folgt der Eintrag 1,A wobei nur A erscheinen soll
Ich hoffe mein Anliegen ist jetzt deutlich ansonsten gerne weiter fragen, damit ich hoffentlich verständlich antworten kann.
Gruß Hannes
Anzeige
AW: Datei ist notwendig
06.12.2021 11:47:42
Yal
Hallo Hannes,
ändere deine Ereignis-Prozedure Worksheet_SelectionChange in folgendem

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
TargetOldText = Target.Value
End Sub
Was passiert dabei?
der Text der Zelle, die gerade aktiviert wurde, wird in der Variable TargetOldText "auf die Seite gestellt". Vorher war es den Text der Zelle, die man gerade verlassen hat.
Die Bearbeitung der Inhalt dieser Variable bleibt unverändert.
Tipp: wenn Du "voran" kommen möchtest, musst Du dich unbedingt mit dem Code auseinandersetzen, auch wenn es am Anfang ein Bischen viel oder kompliziert ist. Es ist nicht alles so kompliziert, wie es aussieht.
Ein Beispiel:

If Target.Column = 1 Or Target.Column = 2 Or Target.Column = 3 Then
Wenn man bedenkt, dass Column nicht negativ sein kann, was wäre dann die mögliche Abkürzung?
VG
Yal
Anzeige
AW: Datei ist notwendig
06.12.2021 12:07:17
Hannes
Hallo Yal,
ich danke dir, das Problem ist damit gelöst. Ein neues Problem tritt allerdings auf, wenn ich an die Bearbeitung in meinen Anwendungsfall denke: Wenn ich nun in A2 die Eingabe 1,2 tätige und die Zelle daraufhin markiere und sie dann mit Strg+C in mehrere andere Zellen darunter kopieren möchte erhalte ich einen Laufzeitfehler und bei Debuggen markierter mir die fettgedruckte Zeile:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
TargetOldText = Target.Value
End Sub
Hast du dafür evtl. auch noch eine Lösung? Also, dass ich die Werte entsprechend kopieren kann? Das wäre für den Anwendungsfall echt hilfreich.
Ja, du hast vollkommen recht, dass ich mit dem Code Schreiben ,,voran" kommen muss. Das zusammenfassen der Spalten 1 bis 3 habe ich schon mit schreibweisen wie If Target.Column = 1:3 Then oder If Target.Columns = 1,2,3 Then versucht aber das hat danach nicht mehr funktioniert..... auch ein Anwenden des Codes auf alle Spalten in der Tabelle habe ich nicht zusammengetragen bekommen :/
Anzeige
AW: Datei ist notwendig
06.12.2021 12:13:56
Yal
Hallo Hannes,
ja, klaro. Zu kurz gedacht. Die Value-Übertragung funktioniert nur, wenn eine Target nur eine Zelle darstellt. Bei mehrere sollte man den Vorgang überspringen.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Cells.Count = 1 Then TargetOldText = Target.Value
End Sub
VG
Yal
AW: Datei ist notwendig
06.12.2021 12:58:12
Matze
Hallo...
Ein Laufzeitfehler tritt aber auch auf wenn er mehrere Zellen markiert und den Inhalt entfernt!

strTarget = Trim(Target.Value)
auch hier sollte/muss nachgebessert werden.
Gruß ...
Anzeige
AW: Datei ist notwendig
06.12.2021 13:14:41
Hannes
Hallo Matze,
Ja du hast Recht.
Hast du/habt ihr denn eine Lösung, wie der Code umgeschrieben werden kann?
Gruß Hannes
AW: Datei ist notwendig
06.12.2021 13:30:23
Yal
Hallo zusammen,
das ist der Punkt, wenn ich sage, sich mit dem Code auseinandersetzen und versuchen zu verstehen, um die Abhängigkeit von nicht immer verfügbare Helfer zu reduzieren.
Ich hatte den Punkt der nicht-Behandlung bei mehr als eine Zelle angesprochen. Diese war in Worksheet_SelectionChange eingetragen, aber nicht in Worksheet_Change.
Was muss man dann in Worksheet_Change anpassen, um die Behandlung zu verweigern, wenn mehr als ein Zelle in Target vorhanden ist? (Tipp: If ... Then Exit Sub)
VG
Yal
Anzeige
AW: Datei ist notwendig
06.12.2021 14:33:37
Hannes
Ich schaffs leider nicht......
Habe den Exit Sub an verschiedenen Stellen eingefügt, wo ich ich für möglich gehalten hab, dass es funktionieren könnte, aber es klappt nicht...
So ist es z.B. Also auch falsch.... :(
Const bolSorted As Boolean = True ' Legt fest, ob die Werte noch sortiert werden.
Dim blockedEvent As Boolean
Dim TargetOldText As String

Private Sub Worksheet_Change(ByVal Target As Range)
Dim strResult As String
Dim strTarget As String
Dim arrSorted As Variant
Dim i As Long
If Target.Column = 1 Or Target.Column = 2 Or Target.Column = 3 Then
strTarget = Trim(Target.Value)
If Not Exit Sub Then
blockedEvent = True
If Not TargetOldText = "" And Not Target.Value = "" Then
If InStr(1, TargetOldText, Target.Value) > 0 Then
strResult = Replace(TargetOldText, ", " & strTarget, "")
strResult = Replace(strResult, strTarget & ", ", "")
strResult = Replace(strResult, strTarget, "")
Else
strResult = TargetOldText & ", " & Target.Value
End If
If bolSorted Then
arrSorted = Split(strResult, ", ")
strResult = ""
Call Selectionsort(arrSorted)
For i = 0 To UBound(arrSorted)
strResult = strResult & arrSorted(i) & ", "
Next i
If Len(strResult) > 1 Then _
strResult = Left(strResult, Len(strResult) - 2)
End If
Target.Value = strResult
Else
Target.Value = Target.Value
End If
If Target.Cells.Count = 1 Then TargetOldText = Target.Value
Else
blockedEvent = False
End If
Else
TargetOldText = ""
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Cells.Count = 1 Then TargetOldText = Target.Value
End Sub

Private Sub Selectionsort(ByRef data As Variant)
Dim OG&, i&, j&, k&, h As Variant
OG = UBound(data)
For i = 0 To OG - 1
h = data(i)
k = i
For j = i + 1 To OG
If data(j) 

Anzeige
AW: Datei ist notwendig
06.12.2021 16:56:50
Yal
Hallo Hannes,
mein Tipp: gehe den Code in deutsche Sprache durch:
Wenn das zutrifft,
dann mache dies
sonst mache das
Dabei wird oder sollte Dir die Unterschied zwischen eine Prüfung (was daraus nur richtig oder falsch sein kann) und eine Anweisung (machen) auffallen.
Wenn ich schreibe
If ... Then Exit Sub
lasse es so lesen:
wenn ... (also hier irgendwas, was geprüft wird)
dann Exit Sub (gehe raus aus dem Sub)
Dann ist Exit Sub eine Anweisung. Zwar liefern manche Anweisungen auch gleichzeitig einen Ergebnis, dass in True/False mündet, aber selten. Daher kannst Du den Befehl ("gehe raus aus dem Sub") nicht als eine Prüfung verwenden: es würde wahrscheinlich bedeuten, dass "geh raus" erfolgreich war. Dann wäre jegliche weitere Anweisung nutzlos. Man müsste nicht mal testen, ob erfolgreich oder nicht.
Mit ein Bischen Erinnerungsvermögen hat man noch den Worksheet_SelectionChange im Blick (worauf ich hingewiesen habe):

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Cells.Count = 1 Then TargetOldText = Target.Value
End Sub
Dann liest man das auf Deutsch:
Wenn die Anzahl an Zellen des übergegebenen Target genau eins (nur eine Zelle wurde übergeben) ist,
Dann nehme in die Variable "TargetOldText" den Wert von der Zelle, die durch "Target" definiert wurde, auf.
Programmieren ist nur Logik und logische Reihenfolge und Übung und Übung und Übung.
Naja, vielleicht doch ein Bischen Denken und Konzentrieren, aber das braucht man auch beim Socken anziehen.
Lernen ist wiederum Willen.
VG
Yal
Anzeige
AW: Datei ist notwendig
06.12.2021 13:40:35
Matze
Hallo ...
Yal hat Dir ja schon den Weg aufgezeigt ...
Nun kommt es darauf an ob Du mehrere Zellinhalte in einem Ritt entfernen willst, oder immer nur einzeln.
Dafür gibt es verschiedene Möglichkeiten.
Gruß ...
AW: Datei ist notwendig
06.12.2021 14:58:39
Hannes
Ich denke ich will mehrere Inhalte auf einen Ritt entfernen, allderdings komm ich mit meinen VBA kenntnissen nicht weiter.
Würde mich echt freuen, wenn mir einer die Lösung zuschicken könnte, vllt kann ich es ja dann nachvollziehen.
Muss ich davon ausgehen...
06.12.2021 16:34:50
ausgehen...
..., dass Du noch nicht soweit bist, auf die Lösung selber zu kommen.
wir haben schon den Worksheet_SelectionChange fixiert

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Cells.Count = 1 Then TargetOldText = Target.Value
End Sub
Der Worksheet_Change braucht eine ähnliche Prüfung + Ausstieg, falls Prüfung negativ (=False)

Private Sub Worksheet_Change(ByVal Target As Range)
Dim strResult As String
Dim strTarget As String
Dim arrSorted As Variant
Dim i As Long
If Target.Cells.Count > 1 Then Exit Sub
If Target.Column 
VG
Yal
Anzeige
AW: Muss ich davon ausgehen...
06.12.2021 16:54:09
ausgehen...
HI,
Ja das ist es!!!
Ich muss eingestehen, dass ich da von alleine nicht drauf gekommen wäre... Hoffentlich NOCH nicht... So verstehe ich auf jeden Fall was gemacht wird, allerdings habe ich die Schreibweisen überhaupt nicht drauf....learning by doing (wobei ich jetzt nicht alltäglich mit solchen excel(problemen) zu tun habe)
Ich danke vielmals für eure Zeit und Hilfe !!! :) :) :)
Und jetzt für zukünftige Menchen mit ähnlichem / gleichen Problem:
Hier der follständige Code:
Const bolSorted As Boolean = True ' Legt fest, ob die Werte noch sortiert werden.
Dim blockedEvent As Boolean
Dim TargetOldText As String

Private Sub Worksheet_Change(ByVal Target As Range)
Dim strResult As String
Dim strTarget As String
Dim arrSorted As Variant
Dim i As Long
If Target.Cells.Count > 1 Then Exit Sub
If Target.Column  0 Then
strResult = Replace(TargetOldText, ", " & strTarget, "")
strResult = Replace(strResult, strTarget & ", ", "")
strResult = Replace(strResult, strTarget, "")
Else
strResult = TargetOldText & ", " & Target.Value
End If
If bolSorted Then
arrSorted = Split(strResult, ", ")
strResult = ""
Call Selectionsort(arrSorted)
For i = 0 To UBound(arrSorted)
strResult = strResult & arrSorted(i) & ", "
Next i
If Len(strResult) > 1 Then _
strResult = Left$(strResult, Len(strResult) - 2)
End If
Target.Value = strResult
Else
Target.Value = Target.Value
End If
If Target.Cells.Count = 1 Then TargetOldText = Target.Value
Else
blockedEvent = False
End If
Else
TargetOldText = ""
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Cells.Count = 1 Then TargetOldText = Target.Value
End Sub

Private Sub Selectionsort(ByRef data As Variant)
Dim OG&, i&, j&, k&, h As Variant
OG = UBound(data)
For i = 0 To OG - 1
h = data(i)
k = i
For j = i + 1 To OG
If data(j) 

AW: Vielen Dank für die Rückmeldung...
09.12.2021 15:31:06
Hannes
Hallo,
ich muss nochmal zu dieser Formel fragen... Wieso bekomme ich einen laufzeitfehler, wenn ich alle zellen anwähle? Der fall, wenn ich zum beispiel in der gesamten arbeitsmappe die Spaltenbreite anpassen will anwähle...
Er ist bei:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Cells.Count = 1 Then TargetOldText = Target.Value
End Sub

AW: Vielen Dank für die Rückmeldung...
09.12.2021 19:14:17
Yal
Hallo Hannes,
weil Excel doof ist ;-)
Target.Cells.Count liefert die Anzahl an markierten Zelle und ist vom Typ Long.
Aber wenn man alle Zellen markiert, übersteigt die Anzahl von Zelle die Kapazität vom "Long" (nur bis 2.147.483.647, das reicht nur für 2 Spalten!) und es kommt zu einen "Überlauf".
Verschiedene Möglichkeiten, das umzugehen:
Man zählt die Spalte * Rows (arg gebastelt, wenn Du mich fragst):

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With Target
If .Columns.Count * .Rows.Count = 1 Then TargetOldText = .Value
End With
End Sub
oder man baut eine Fehlerbehanldung, die nichts anderes tut, als auszusteigen, falls Fehler (wirkt etwa professioneller):

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error GoTo Finally
If Target.Cells.Count = 1 Then TargetOldText = Target.Value
Finally:
End Sub
oder man nimmt grundsätzlich immer nur die erste Zelle der Auswahl (schlank, aber könnte zu unerwünschten Nebeneffekt führen):

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
TargetOldText = Target.Range("A1").Value
End Sub
VG
Yal
AW: Vielen Dank für die Rückmeldung...
10.12.2021 15:04:56
Hannes
Ja, das ist des Rätsels Lösung! :) Danke
Ist es eigentlich generell möglich solche Funktionen If Target auf bestimmte Spalten einer Tabelle zu beziehen (also Tabelle xy und dann die Spalte mit einer bestimten Überschrift) ?
Geht mir darum, dass sich bei einfügen einer neuen Spalte diese Funktion sich ja nicht mitverschiebt, wenn man die Spalte mit z.b. target.Colum = 3 definiert.
also wenn ich davor eine Spalte einfüge der Bezug nicht mehr passt...
AW: Vielen Dank für die Rückmeldung...
10.12.2021 15:26:45
Yal
Hallo Hannes,
also Thema doch nicht abgeschlossen. Eine neue Thread wäre in dem Fall nicht falsch gewesen.
Man kann den Target prüfen, meistens so (am Beispiel "ist gerade eine Wert in C1 eingegeben worden?")

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("C1")) Is Nothing Then
'... hier tut sich was
End If
End Sub
Nur dass bei SelectionChange der Target immer die Zelle übergeben wird, die gerade selektiert wurde, und nicht die, die man verlassen hat.
Man muss eine "Gedächnis"-Variable verwenden, die immer beim verlassen von SelectionChange neugesetzt und beim Eintritt in SelectionChange geprüft wird:
(am Beispiel: "war die Zelle/eine der Zellen, die wir gerade verlassen haben, in Spalte C?")

Dim OldTarget As Range 'Gedächnisvariable
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Test: wo waren wir
If Not OldTarget Is Nothing Then
If Not Intersect(OldTarget, Range("C:C")) Is Nothing Then
'... hier tut sich was
End If
End If
'Gedächnis setzen: da wo wir jetzt sind, aber bei nächsten Aufruf nicht mehr werden.
Set OldTarget = Target
End Sub
VG
Yal

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige