Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1168to1172
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

Datenüberprüfung und Auswahlliste

Datenüberprüfung und Auswahlliste
Rene
Hallo an alle Forennutzer,
Ich habe fogendes Problem worauf ich bisher noch keine Lösung gefunden haben:
Hier meine Testdatei für euch:
https://www.herber.de/bbs/user/70992.xlsx
Ich möchte gerne wenn ich in B17 z.B. Käse eingegeben habe, das ich für C17 eine Auswahlliste mit allen darüberliegenden Käsesorten bekomme (ich denke mal als Liste über die Funktion Datenüberprüfung).
Sollte bei der Auswahl nichts passendes dabei sein muss die Möglichkeit bestehen Manuel die enstprechende Sorte einzutragen.
Ich hoffe ich habe mich nicht zu wirr ausgedrückt!!! :-)
Danke für eure Hilfe
René
AW: Datenüberprüfung und Auswahlliste
10.08.2010 12:25:29
Tino
Hallo,
versuch mal diesen Code, kommt in die entsprechende Tabelle.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngBereich As Range
Dim oDic As Object, oArrLst As Object
Dim tmpAr(), strAusgabe$
Dim nCount&, A&

Set rngBereich = Intersect(Columns(2), Target)
If rngBereich Is Nothing Then Exit Sub
If rngBereich.Rows(rngBereich.Rows.Count) = 1 Then Exit Sub

Set oDic = CreateObject("Scripting.Dictionary")
Set oArrLst = CreateObject("System.collections.arraylist")

For Each rngBereich In rngBereich
    If rngBereich.Row > 1 Then
            tmpAr = Range(Cells(1, 2), Cells(rngBereich.Row - 1, 3))
            For A = 1 To Ubound(tmpAr)
                If tmpAr(A, 1) = rngBereich.Value Then
                    If Not oDic.Exists(tmpAr(A, 2)) Then
                        oDic(tmpAr(A, 2)) = 0
                        oArrLst.Add tmpAr(A, 2)
                    End If
                End If
            Next A
    
            If oDic.Count > 0 Then
                oArrLst.Sort
                strAusgabe = Join(oArrLst.ToArray, ",")
            End If
            
            With rngBereich.Offset(0, 1).Validation
                .Delete
                If oDic.Count > 0 Then
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                    xlBetween, Formula1:=strAusgabe
                    .IgnoreBlank = True
                    .InCellDropdown = True
                    .ShowInput = False
                    .ShowError = False
                End If
            End With
            
            oArrLst.Clear
            oDic.RemoveAll
            strAusgabe = ""
    End If
    
Next rngBereich

End Sub
Gruß Tino
Anzeige
geht auch nur mit Collections.ArrayList ...
10.08.2010 13:01:00
Tino
Hallo,
und ohne Dictionary- Object.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngBereich As Range
Dim oArrLst As Object
Dim tmpAr(), strAusgabe$
Dim nCount&, A&

Set rngBereich = Intersect(Columns(2), Target)
If rngBereich Is Nothing Then Exit Sub
If rngBereich.Rows(rngBereich.Rows.Count) = 1 Then Exit Sub

Set oArrLst = CreateObject("System.collections.arraylist")

For Each rngBereich In rngBereich
    If rngBereich.Row > 1 Then
            tmpAr = Range(Cells(1, 2), Cells(rngBereich.Row - 1, 3))
            
            For A = 1 To Ubound(tmpAr)
                If tmpAr(A, 1) = rngBereich.Value Then
                    If Not oArrLst.Contains(tmpAr(A, 2)) Then
                        oArrLst.Add tmpAr(A, 2)
                    End If
                End If
            Next A
    
            If oArrLst.Count > 0 Then
                oArrLst.Sort
                strAusgabe = Join(oArrLst.ToArray, ",")
            End If
            
            With rngBereich.Offset(0, 1).Validation
                .Delete
                If oArrLst.Count > 0 Then
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                    xlBetween, Formula1:=strAusgabe
                    .IgnoreBlank = True
                    .InCellDropdown = True
                    .ShowInput = False
                    .ShowError = False
                End If
            End With
            
            oArrLst.Clear
            strAusgabe = ""
    End If
    
Next rngBereich

End Sub
Gruß Tino
Anzeige
AW: geht auch nur mit Collections.ArrayList ...
10.08.2010 13:08:53
Rene
Hallo Tino,
ich verstehe von dem was du mir geschrieben hat garnix.
Ich Denke ich muss den Code über VBA in ein Modul packen!
So weit, so gut.
Jedoch komme ich dann immer noch nicht weiter weil in der Datei selber nichts passiert...
Wo ist mein Fehler?
AW: geht auch nur mit Collections.ArrayList ...
10.08.2010 14:00:58
Klaus
Hallo Rene,
du musst den Code nicht in ein Modul packen, sondern in den Code des betroffenen Tabellenblattes. Dazu den Reiter selbst (Tabelle 1) rechtsclicken, den Punkt "Code anzeigen" wählen und Tinos Code genau dahin kopieren, wo der Cursor jetzt ist.
Hallo Tino,
eine schöne Lösung! Viel eleganter als meine "8-Hilfsspalten" Version ...
Mal sehen ob ichs auch verstanden habe:
Du liest alle Sorten in ein Array ein, vergleichst und ergänzt dann ein zweites Array um sortenreinheit zu bekommen und setzt dann eben das zweite Array als Gültigkeitsliste ein?
Grüße,
Klaus M.vdT.
Anzeige
@Klaus ...
10.08.2010 22:45:19
Tino
Hallo,
liegst nicht falsch, siehe neuen Beitrag an Rene.
Dort habe ich den Code noch an die neue Aufgabe angepasst und mit Kommentaren versehen.
Gruß Tino
@Tino: Danke! o.w.T.
11.08.2010 07:38:44
Klaus
.
AW: Datenüberprüfung und Auswahlliste
10.08.2010 18:45:08
Rene
Hallo Tino, und an alle anderen welche mir hier gerade weiterhelfen.
Ich habe jetzt die Variante von Tino bevorzugt, klappt auch wunderbar.
Nur 2 Änderungen in dem Code wären noch notwendig für mich, ich weiß aber nicht wo ich ansetzten muss:
1. Anders als meine Beispieltabelle handelt es sich nicht um die Zelle B und C sondern um um C und D
und
2. ist die gleich Abfrage von der Reinfolge auch erst für B und C möglich und im nächsten Schritt für C und D
Folgendes Ziel soll erreicht werden:
Nach Eingabe des Geschäftes in B sollen die bereits erfassten Warengruppen in C erscheinen (tut es ja jetzt mit dem vorhandenem Code von Tino)
danach soll das gleich für C und D auch passieren.
Und eine letzte Frage an alle worin besteht der Unterschied in den beiden Codevorschlägen von Tino?
Danke an alle für eure Hilfe
Gruß René
Anzeige
die Anpassung ist in diesem Fall einfach
10.08.2010 22:42:44
Tino
Hallo,
sorry, dass ich mich jetzt erst melde, war die ganze Zeit nicht online.
So geht es auch mit den Spalte B und C; C und D
Habe den Code noch Kommentiert, vielleicht ist es so einfacher zu verstehen.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngBereich As Range
Dim oArrLst As Object
Dim tmpAr(), strAusgabe$
Dim nCount&, A&

'Prüfen ob Eingabe i Spalte B oder D 
Set rngBereich = Intersect(Range(Columns(2), Columns(4)), Target)
If rngBereich Is Nothing Then Exit Sub
'ist der Eingabebereich nicht nicht nur in Zeile 1 
If rngBereich.Rows(rngBereich.Rows.Count) = 1 Then Exit Sub
'Object collections.arraylist Initialisieren 
Set oArrLst = CreateObject("System.collections.arraylist")
'Schleife über eingabe in Spalte 
For Each rngBereich In rngBereich
    'ist Zelle nicht in Zeile 1 
    If rngBereich.Row > 1 Then
            'Rangebereich in einem Array aufnehmen 
            tmpAr = Range(Cells(1, rngBereich.Column), Cells(rngBereich.Row - 1, rngBereich.Column + 1))
            'Schleife über Array 
            For A = 1 To Ubound(tmpAr)
                'ist Array = Eingabe 
                If tmpAr(A, 1) = rngBereich.Value Then
                    'Ist eintrag nicht in der Collection? 
                    If Not oArrLst.Contains(tmpAr(A, 2)) Then
                        'nein, dann in Collection aufnehmen 
                        oArrLst.Add tmpAr(A, 2)
                    End If
                End If
            Next A
            'wurden Einträge in Collection aufgenommen? 
            If oArrLst.Count > 0 Then
                'Collection Sortieren 
                oArrLst.Sort
                'Collection als Array zu einen String mit Trennzeichen 
                strAusgabe = Join(oArrLst.ToArray, ",")
            End If

            'Gültigkeit Liste erstellen 
            With rngBereich.Offset(0, 1).Validation
                .Delete 'löschen vorhandene 
                If oArrLst.Count > 0 Then 'neu erstellen 
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                    xlBetween, Formula1:=strAusgabe
                    .IgnoreBlank = True
                    .InCellDropdown = True
                    .ShowInput = False
                    .ShowError = False
                End If
            End With
            'Collection leeren 
            oArrLst.Clear
            'String löschen 
            strAusgabe = ""
    End If

Next rngBereich

End Sub
Gruß Tino
Anzeige
habe auf B:C und D:E getestet.
10.08.2010 23:11:57
Tino
Hallo,
Du willst aber B:C und C:D haben.
Mach aus der Zeile
Set rngBereich = Intersect(Range(Columns(2), Columns(4)), Target)
diese
Set rngBereich = Intersect(Range(Columns(2), Columns(3)), Target)
Gruß Tino
AW: hier noch meine Testmappe ...
11.08.2010 13:41:10
Rene
Hallo Tino und natürlich auch an alle anderen,
nochmals vielen lieben Dank für die wirlich schnelle und unkomplizierte Hilfe.
Es funktioniert alles genauso wie ich es wollte, ausser wenn ich in Spalte D nichts zu stehen habe (dann reicht aber einfach auf Abbruch zu gehen).
Der einzige Wehrmutstropfen für mich ist, das du so einen tollen Code für mich gebaut hast und ich davon abselut nichts verstehe.
Mit der Beschreibung geht es zwar ein wenig aber VBA bleiben wohl Böhmische Dörfer für mich.
Gruß René
Anzeige
AW: wenn leer machen wir es so...
14.08.2010 15:26:39
Rene
So nun noch einmal einen letzten Dank an Tino für die wirklich schnelle und verständliche Hilfe.
Danke, Danke, Danke
funzt 100%
Super
Noch eine VBA-freie 95% - Lösung per XL4-Funktion
10.08.2010 16:47:54
NoNet
Hallo René,
ich habe hier noch eine 95%-Lösung auf Basis von Excel4-Funktion in definierten Namen :
https://www.herber.de/bbs/user/71007.xls
Nach Eingabe eines Produktes in Spalte B erscheint in Spalte C automatisch die Auswahl der bisherigen Sorten dieses Produkts. Der Lösungsweg ist in der Mappe dokumentiert !
Zwei kleine Knackpunkte enthält diese Lösung (daher auch keine 100%-Lösung sondern nur 95%) :
- Beim Öffnen der Mappe erscheint ein Warnhinweis bzgl. "Excel4-Makrofunktionen" (kein VBA !), den man bestätigen muss
- Klick man einen bereits vorhandenen Datensatz ohne Eingabe in Spalte B an, muss man die Auswahlliste evtl. per Taste F9 aktualisieren !
Ich hoffe, dass Dir (oder anderen) diese Lösung auch weiterhilft, auch wenn ich die Lösung von Klaus M.vdT praktikabler (wenn auch nicht einfacher) finde !
Gruß, NoNet
Anzeige
nochmal -5% AW: 95% - Lösung per XL4-Funktion
11.08.2010 07:38:21
Klaus
Hallo NoNet,
noch ein kleiner Schnitzer:
Wenn ich als nächsten Punkt "Käse - Aufschnitt sortiert" eintrage, verdoppelt sich der "Aufschnitt sortiert" Eintrag in der nächsten Auswahlliste für Käse. Dafür nochmal minus 5% :-)
In meiner Version ist das natürlich simpel abzufangen - per Hilfsspalte (sogar Hilfstabelle). In deiner variablen Bereichs-Matrixformel (finde ich übriges großartig!) ginge das imho nur sehr kompliziert über ellenlange indirekt/Zeile(A1:A999) Tricks, oder halt über eine weitere Hilfsspalte (und die Formellösung für den Spezialfilter von excelformeln.de).
Aber da Rene sich für die VBA Lösung entschieden hat ist das eh nur noch eine akademische Diskussion.
Grüße,
Klaus M.vdT.
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige