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

Userforum mit Listbox und Combobox erstellen

Userforum mit Listbox und Combobox erstellen
30.01.2019 10:20:09
Helmut
Guten Morgen Mitglieder des Forums
Ein 3. Versuch. In einem vergangenen Thread habe ich die Originaldatei, die von Herbert bzw. auch von Piet erstellt wurde und meine Datei die 1:1 identisch ist mit der Originaldatei hochgeladen, da ich die Userform nicht aufrufen konnte. Es machten sich onur, Dieter(Drummer)& Torsten hier aus dem Forum die Mühe um den Fehler zu finden. Zwar wurde der Fehler gefunden, doch der Code lief immer noch fehlerhaft bzw. gar nicht. Dadurch dass der Thread nun seit fast 48 Stunden unbeantwortet bleibt, möchte ich wie gesagt einen 3. Versuch starten um den Code neu zu gestalten.
In der Beispiel Datei die ich hochgeladen habe, sind im TB Datenbank einige Zellen gelb markiert. Diese enthalten Daten, die jeweils in einer Userform ersichtlich sein sollen. (Ich habe hierzu ein Foto der Userform im TB Datenbank eingestellt; aus der Datei von Herbert und Piet).
Es geht darum, in der User Forum das Gebäude auszuwählen, dann werden in der Listbox Rechts daneben alle verfügbaren Leitern, der Werkstoff, die Art und der Lagerraum der Leiter im Haus angezeigt. Mit der Combobox unterhalb kann man noch die Länge auswählen, dabei wird die Listbox mit den verfügbaren Leitern dementsprechend gefiltert.
Ich hoffe, dass ich mich damit einigermaßen verständlich ausgedrückt habe und ihr mich bei meinem ewigen Projekt unterstützen könnt.
Lg Helmut
https://www.herber.de/bbs/user/127279.xlsm

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Userforum mit Listbox und Combobox erstellen
30.01.2019 12:51:33
EtoPHG
Hallo Helmut,
Da ich mit Sicherheit weiss, dass ich ich nicht ewig leben werde, muss ich es leider ablehnen, bei deinem ewigen Probjekt mitzumachen.¨
Ich kann Dir aber einen Tipp geben:
Für Helfer ist die eingestellte XL-Datei völlig nutzlos und sinnfrei.
Was bitte sollen sie mit einem Bild in eine Datei anfangen, in der
a) Die eigentliche Userform und der gesamte VBA Code fehlt?
b) Die Anforderungen, Abläufe und erwarteten Resultat nicht mal im Ansatz formuliert oder dargestellt sind.
c) Mit Verweisen auf ältere Threads Helfer angesprochen werden, aber die Threads nicht verlinkt sind?
Gruess Hansueli
Anzeige
AW: Userforum mit Listbox und Combobox erstellen
30.01.2019 13:54:03
Helmut
Servus Hansueli
Es ist zum verzweifeln, ich habe jetzt aus der Originaldatei Modul 1 und UserForum 1 exportiert und in die hier hochgeladene Datei importiert. Komischerweise funktioniert hier der Aufruf der User Forum und die Listboxen werden auch gefüllt. Jedoch nach hinzufügen der Spalte (S) im TB Datenbank wo der Werkstoff hinterlegt ist passen die Bereiche im Code nicht mehr. (Könntest du mir dies eventuell anpassen?)
Was nämlich auch äußerst seltsam ist, sobald ich den Code in die meine Originaldatei einfüge, _ habe ich ein Problem mit der Zeile

.List(n, 1) = Matrix.Cells(WKS + 4, 8)   
die Zelle wird gelb hinterlegt. Die TB heißen alle gleich! Dadurch habe ich jetzt den „Werkstoff“ auch in das TB Datenbank mit einbezogen.
Vielleicht sieht doch noch ein erfolgreiches Ende meiner so endlosen Bemühungen raus.
Besten Dank im Voraus, lg Helmut
https://www.herber.de/bbs/user/127289.xlsm
Anzeige
Originaldatei als Beispiel
30.01.2019 14:33:38
Helmut
Servus Nepumuk
Ich fahre gleich aus der Haut! In den Dateien die ihr postet funktioniert alles bestens. Mein nä _ chster Schritt ist UserForm 1 exportieren, nächster Schritt in meiner Datei UserForm importieren. Die Dateien sind baugleich sprich: die ich hier online gestellt habe ist genau gleich aufgebaut wie die ich hier habe, bloß das noch 2 Tabellenblätter zusätzlich vorhanden sind. Wenn ich jedoch die User Forum importiere und anschließend aufrufe, bekomme ich eine Fehlermeldung und die Zeile im VBA Code wird gelb unterlegt

Loop Until objCell.Address = strFirstAddress

ich weiß echt nicht mehr was ich tun soll ich arbeite mittlerweile seit 3 Wochen an diesen einem Projekt. Der Fehler muss dann doch irgendwo in meiner Datei liegen.
Ich lade hier jetzt die Original Datei hoch , vielleicht kannst du diese dann so weit anpassen dass sie funktioniert.
Ich bin ja gerade dabei VBA zu lernen, dass laufen lernen eines kleinen Kindes ist jedoch einfacher denke ich. Vielleicht kannst du mir den VBA Code ein wenig aus kommentieren, damit ich auch aus diesen Teil lernen kann.
LG Helmut
https://www.herber.de/bbs/user/127291.xlsm
Anzeige
AW: Originaldatei als Beispiel
30.01.2019 14:57:04
Nepumuk
Hallo Helmut,
Die Dateien sind baugleich
Das stimmt doch nicht. Die Spalte 14 ist ganz anders aufgebaut wie in deiner ersten Mappe. Um da die Leitern auszulesen brauchts eine ganz andere Routine. Mal sehen ob ich dazu heute noch Lust habe.
Mach das bitte nie wieder, ich arbeite nur ungern für den Papierkorb solange ich nicht dafür bezahlt werde.
Gruß
Nepumuk
AW: Originaldatei als Beispiel
30.01.2019 15:24:31
Helmut
Servus Nepumuk
Danke vorerst für deine Hilfe. Ich glaube ich brauche dringend Urlaub. Es war mir nicht bewusst, das ein Unterschied besteht. Entschuldige bitte.
Was das gratis arbeiten angeht, gerne zeige ich mich erkenntlich.
Danke erstmals, Lg Helmut
Anzeige
AW: Originaldatei als Beispiel
30.01.2019 16:50:34
Nepumuk
Hallo Helmut,
teste mal: https://www.herber.de/bbs/user/127300.xlsm
Ich musste bei der ersten Liegenschaft eine Zeile einfügen, sonst wurde sie nicht gefunden.
Gruß
Nepumuk
Soweit alles Bestens
30.01.2019 18:10:52
Helmut
Guten Abend Nepumuk
Habe die Datei jetzt getestet, sie läuft soweit sehr gut und fehlerfrei! Herzlichen Dank! Wäre es dir noch möglich irgendwann einmal den Code auszukommentieren damit ich ihn auch etwas besser verstehe bzw. sollte einmal ein Problem auftauchen oder Erweiterungen stattfinden, dass ich mich orientieren kann. Wie gesagt, ich zeige mich gerne erkenntlich könne.
Besten Dank im Voraus, LG Helmut
Anzeige
AW: Soweit alles Bestens
30.01.2019 18:20:19
Nepumuk
Hallo Helmut,
wenn du mindestens 25€ hierhin spendest: https://www.sos-kinderdorf.at/
Dann raff ich mich dazu auf. Aber erst morgen.
Gruß
Nepumuk
Gespendet
30.01.2019 19:30:27
Helmut
Nochmals guten Abend Nepumuk
Ich hoffe das mit dem Screenshot hat hier funktioniert! Ich habe per Sofortüberweisung gespendet! Das war eine sehr gute Idee von dir!!!!! Dankeschön. Habe selbst 2 gesunde Kinder auf die ich sehr stolz bin. Also dann, bis morgen.
LG Helmut
Userbild
AW: Gespendet
30.01.2019 20:14:44
Nepumuk
Hallo Helmut,
vielen Dank für die Spende. Kinder sind mir eine Herzensangelegenheit.
Und weil du so schnell warst habe ich auch Gas gegeben:
Option Explicit

Private Sub ComboBox1_Change()
    Dim objFindCell As Range, objCell As Range
    Dim strFirstAddress As String
    'Listbox2 loeschen da sich der Wert der Combobox geaendert hat
    Call ListBox2.Clear
    'Pruefen ob eine Leiterlaenge ausgewaehlt wurde denn das Ereignis
    'wird auch durch das Loeschen der Combobox ausgeloest
    If ComboBox1.ListIndex >= 0 Then
        'Verweis auf die Spalte 14 in der Tabelle 'Datenbank1' oeffnen
        With WksDB1.Columns(14)
            'Suche nach dem Ausgewaehlten Wert von Listbox1
            Set objFindCell = .Find(What:=ListBox1.Text, After:=.Cells(1, 1), _
                LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)
            'Wenn der Wert gefunden wurde
            If Not objFindCell Is Nothing Then
                'Adresse der Fundstelle merken
                strFirstAddress = objFindCell.Address
                'Schleife beginnen
                Do
                    'Schleife ueber alle Einzelzellen des verbundenen Bereiches
                    For Each objCell In objFindCell.MergeArea
                        'Wenn der Wert in der Zelle dem ausgewaehlten Wert in der Combobox entspricht
                        If objCell.Offset(0, 3).Value = Clng(ComboBox1.Value) Then
                            'Verweis auf die Listbox oeffnen
                            With ListBox2
                                'Leere Zeile hinzufuegen
                                Call .AddItem
                                'Die gewuenschten Werte dieser Zeile uebergeben
                                .List(.ListCount - 1, 0) = objCell.Offset(0, 3).Value
                                .List(.ListCount - 1, 1) = objCell.Offset(0, 5).Value
                                .List(.ListCount - 1, 2) = objCell.Offset(0, 7).Value
                                .List(.ListCount - 1, 3) = objCell.Offset(0, -7).Value
                            End With
                        End If
                    Next
                    'Naechsten Eintrag suchen
                    Set objFindCell = .FindNext(After:=objFindCell)
                    'Wenn kein Wert gefunden wurde Schleife verlassen
                    If objFindCell Is Nothing Then Exit Do
                    'Wenn die erste Fundstelle wieder gefunden wurde Schleife verlassen
                Loop Until objFindCell.Address = strFirstAddress
                'Objektvariable resetten
                Set objFindCell = Nothing
                'In das Label2 die Anzahl der gefundenen Leitern eintragen
                Label2.Caption = CStr(ListBox2.ListCount) & " Leitern vorhanden"
            End If
        End With
    End If
End Sub

Private Sub CommandButton1_Click()
    'Userform schliessen
    Call Unload(Object:=Me)
End Sub

Private Sub ListBox1_Change()
    Dim objFindCell As Range, objCell As Range
    Dim objDictionary As Object
    Dim strFirstAddress As String
    'Listbox2 loeschen
    Call ListBox2.Clear
    'Combobox1 loeschen
    Call ComboBox1.Clear
    'Label2 loeschen
    Label2.Caption = vbNullString
    'Verweis auf die Spalte 14 in der Tabelle 'Datenbank1' oeffnen
    With WksDB1.Columns(14)
        'Suche nach dem Ausgewaehlten Wert von Listbox1
        Set objFindCell = .Find(What:=ListBox1.Value, After:=.Cells(1, 1), _
            LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)
        'Wenn der Wert gefunden wurde
        If Not objFindCell Is Nothing Then
            'Adresse der Fundstelle merken
            strFirstAddress = objFindCell.Address
            'Dictionary initialisieren ein Dictionary ist ein Array mit einem Wert und einem eindeutigen Schluessel
            Set objDictionary = CreateObject(Class:="Scripting.Dictionary")
            'Schleife beginnen
            Do
                'Schleife ueber alle Einzelzellen des verbundenen Bereiches
                For Each objCell In objFindCell.MergeArea
                    'Verweis auf die Zelle drei Spalten nach rechts oeffnen
                    With objCell.Offset(0, 3)
                        'Wenn die Zelle nicht leer ist dann dem Dictionary mit dem
                        'Zellwert als Schluessel einen leeren String zuweisen
                        'Wenn der Schluessel noch nicht existiert wird er angelegt,
                        'wenn er schon existiert passiert nichts
                        If .Value <> vbNullString Then objDictionary(.Value) = vbNullString
                    End With
                Next
                'Naechsten Eintrag suchen
                Set objFindCell = .FindNext(After:=objFindCell)
                'Wenn kein Wert gefunden wurde Schleife verlassen
                If objFindCell Is Nothing Then Exit Do
                'Wenn die erste Fundstelle wieder gefunden wurde Schleife verlassen
            Loop Until objFindCell.Address = strFirstAddress
            'Der Combobox die Schlssel des Dictionary uebergeben
            ComboBox1.List = objDictionary.Keys
            'Eintraege der Combobox sortieren
            Call QuickSort(0, ComboBox1.ListCount - 1, ComboBox1)
            'Objektvariablen resetten
            Set objDictionary = Nothing
            Set objFindCell = Nothing
        End If
    End With
End Sub

Private Sub UserForm_Activate()
    Dim avntValues As Variant, vntItem As Variant
    Dim objDictionary As Object
    'Verweis auf die Tabelle 'Datenbank1' oeffnen
    With WksDB1
        'Alle Werte ab Zeile 3 bis zur letzten benutzten Zeile der Spalte 14 in ein Aray einlesen
        avntValues = .Range(.Cells(3, 14), .Cells(.Rows.Count, 14).End(xlUp)).Value
    End With
    'Dictionary initialisieren ein Dictionary ist ein Array mit einem Wert und einem eindeutigen Schluessel
    Set objDictionary = CreateObject(Class:="Scripting.Dictionary")
    'Schleife ueber alle Werte im Array
    For Each vntItem In avntValues
        'Wenn der Eintrag nicht leer ist dann dem Dictionary mit
        'dem Arraywert als Schluessel einen leeren String zuweisen
        'Wenn der Schluessel noch nicht existiert wird er angelegt,
        'wenn er schon existiert passiert nichts
        If Not IsEmpty(vntItem) Then objDictionary(vntItem) = vbNullString
    Next
    'Der Listbox1 die Schluessel des Dictionarys uebergeben
    ListBox1.List = objDictionary.Keys
    'Objektvariable resetten
    Set objDictionary = Nothing
End Sub

Private Sub QuickSort(ByVal pvlngLBound As Long, ByVal pvlngUBound As Long, ByRef probjComboBox As MSForms.ComboBox)
    'Eine Erklaerung des QuickSorts findest du hier: https://de.wikipedia.org/wiki/Quicksort
    Dim lngIndex1 As Long, lngIndex2 As Long, vntBuffer As Variant, lngTemp As Long
    lngIndex1 = pvlngLBound
    lngIndex2 = pvlngUBound
    With probjComboBox
        lngTemp = Clng(.List((pvlngLBound + pvlngUBound) \ 2, 0))
        Do
            Do While Clng(.List(lngIndex1, 0)) < lngTemp
                lngIndex1 = lngIndex1 + 1
            Loop
            Do While lngTemp < Clng(.List(lngIndex2, 0))
                lngIndex2 = lngIndex2 - 1
            Loop
            If lngIndex1 <= lngIndex2 Then
                vntBuffer = .List(lngIndex1, 0)
                .List(lngIndex1, 0) = .List(lngIndex2, 0)
                .List(lngIndex2, 0) = vntBuffer
                lngIndex1 = lngIndex1 + 1
                lngIndex2 = lngIndex2 - 1
            End If
        Loop Until lngIndex1 > lngIndex2
    End With
    If pvlngLBound < lngIndex2 Then Call QuickSort(pvlngLBound, lngIndex2, probjComboBox)
    If lngIndex1 < pvlngUBound Then Call QuickSort(lngIndex1, pvlngUBound, probjComboBox)
End Sub


Gruß
Nepumuk
Anzeige
Danke Danke Danke
30.01.2019 20:20:44
Helmut
Servus Nepumuk
Auch nochmals Recht Herzlichen Dank für alles.
Schönen Abend, Helmut
Noch eine Frage aufgetaucht
01.02.2019 07:39:31
Helmut
Guten Morgen Nepumuk
Jetzt ist doch noch eine Frage aufgetaucht. Wenn ich in ListBox 2 noch einem Wert hinzufügen mö _ chte, dann hätte ich folgende Codezeile unter die vorhandenen gleichen Zeilen hinzugefügt:

.List(.ListCount - 1, 4) = objCell.Offset(0, 9).Value

leider wird dieser Wert nicht in der Listbox 2 angeführt, auch nicht, wenn ich sie in die „Länge ziehe“.
Was mache ich da falsch?
Besten Dank im Voraus, lg Helmut
AW: Noch eine Frage aufgetaucht
01.02.2019 07:42:55
Nepumuk
Hallo Helmut,
du musst in den Eigenschaften der ListBox den Wert in ColumnCount entsprechend anpassen.
Gruß
Nepumuk
Anzeige
Dankeschön
01.02.2019 08:09:04
Helmut
Dankeschön Nepumuk
langsam aber sicher lerne ich bei VBA immer etwas dazu. Vielen Dank nochmals für deine Hilfe.
Lg Helmut

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige