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

Scripting.Dictionary

Scripting.Dictionary
01.09.2022 13:31:05
Thorsten
Hallo liebe VBA-Profis,
ich arbeite mich langsam aber sich in die VBA-Welt ein und stoße nun das erste mal auf ein Problem, mit welchem ich in Videos, etc nicht weiter komme.
Ich habe eine Userform mit 2 Comboboxen.
Die Comboboxen stehen in Abhängigkeit zueinander und sollen jeweils nur die werte einmal wiedergeben.
Mit der ersten Combobox klappt das auch, nur wenn ich die zweite einfüge, "Bullshit".
Sorry für meine Wortwahl.:-)

Private Sub UserForm_Initialize()
cbmaterialtyp.List = Range("tbllieferant[Material type]").Value
cbmcbmaincommodity.List = Range("tbllieferant[Main Commodity]").Value
'Duplikate entfernen
'Variabeln dimensionieren
Dim oDic As Object
Set oDic = CreateObject("Scripting.Dictionary")
Dim cell As Range
Dim oDicN As Object
Set oDicN = CreateObject("Scripting.Dictionary")
Dim cellN As Range
'Schleife über kompletten Zellbereich
For Each cell In shoverview.Range("tbllieferant[Material type]")
For Each cellN In shoverview.Range("tbllieferant[Main Commodity]")
'Zellwert in das Dictionary einlesen falls noch nicht vorhanden
oDic(cell.Value) = 0
oDicN(cellN.Value) = 0
Next cell
NExt cellN
'Combobox mit Dictionary-Keys befüllen
cbmaterialtyp.List = oDic.keys
cbmaincommodity.List = oDicN.keys
End Sub

Private Sub cbmaterialtyp_Change()
'Abhängige Dropdown
'cbmaterialtyp zurücksetzen, bzw. Auswahl leeren
cbmaincommodity.Clear
'Die cdmaincommodity freischalten
cbmaincommodity.Enabled = True
'Die cbmaincommodity befüllen
Dim Zeile As Long
Dim tbl As ListObject
Set tbl = shoverview.ListObjects("tbllieferant")
'Schleife über alle Zeilen der Tabelle
For Zeile = 1 To tbl.DataBodyRange.Rows.Count
'Prüfen ob die Auswahl in der Cbmaterialtyp mit dem Wert in der Zeile übereinstimmt
If cbmaterialtyp.Value = tbl.DataBodyRange(Zeile, 1).Value Then
'Wert der cbmaincommodity zuweisen
cbmaincommodity.AddItem tbl.DataBodyRange(Zeile, 2).Value
End If
Next Zeile
End Sub

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Scripting.Dictionary
01.09.2022 13:54:58
onur
Du schreibst zwar: "'Zellwert in das Dictionary einlesen falls noch nicht vorhanden", aber dein Code, der daraufhin folgt, versucht, JEDEN Wert hinzuzufügen, egal ob voirhanden oder nicht.
Hier ist eine wunderbare Seite, wo dir alles genau erklärt wird:
https://excelmacromastery.com/vba-dictionary/
AW: Scripting.Dictionary
01.09.2022 14:04:30
Yal
Hallo Thorsten,
ohne die passende Datei/Anwendung wird es schwierig, ein Trouble-Shooting zu machen.
Im Prinzip ist dein Code ok.
Ich würde empfehlen, die Bibliothek "Microsoft Scripting Runtime" anzubinden: in VB-Editor unter "Extras", "Verweise...", "Microsoft Scripting Runtime" suchen und anhaken. Dann hast Du Intellisense und das Objektkatalog zur Verfügung.
Du kannst eine Objekt-Variable reinstanzieren und somit 'clean' wieder verwenden:

'Unter Anbindung (Extras, Verweise...) von Microsoft Scripting Runtime
Private Sub UserForm_Initialize()
'Variabeln dimensionieren (immer und alle an erste Stelle)
Dim oDic As Dictionary
Dim cell As Range
'Duplikate entfernen
Set oDic = New Dictionary
For Each cell In shOverview.Range("tblLieferant[Material type]")
oDic(cell.Value) = 0
Next
cbMaterialTyp.List = oDic.keys
Set oDic = New Dictionary
For Each cell In shOverview.Range("tblLieferant[Main Commodity]")
oDic(cell.Value) = 0
Next cell
cbMainCommodity.List = oDic.keys
Set oDic = Nothing
End Sub
Achte auf ein sauberes Einrücken. Viele Fehler lassen sich damit schnell erkennen.
Das verschachtelte For ergibt mMn keinen Sinn, aber wie gesagt, ohne Datei...
Ist die frühzeitige Befüllung von cbMainCommodity in UserForm_Initialize sinnvoll? Wird eh beim ersten Auswahl in cbMaterialTyp geworfen...

Private Sub cbmaterialtyp_Change()
Dim Z As ListRow
Dim oDic As New Dictionary
'Abhängige Dropdown
cbMainCommodity.Clear 'cbmaterialtyp zurücksetzen, bzw. Auswahl leeren
cbMainCommodity.Enabled = True 'Die cdmaincommodity freischalten
'Die cbMainCommodity befüllen:
For Each Z In shOverview.ListObjects("tblLieferant").ListRows
'Prüfen ob die Auswahl in der Cbmaterialtyp mit dem Wert in der Zeile übereinstimmt
If cbMaterialTyp.Value = Z.Cells(1).Value Then oDic(Z.Cells(2)) = 0
Next Zeile
cbMainCommodity.List = oDic.Keys
Set oDic = Nothing
End Sub
VG
Yal
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige