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

Dictionary an UserForm übergeben

Dictionary an UserForm übergeben
28.07.2022 13:45:44
Tim
Hallo zusammen,
leider stoße ich gerade an eine (für mich) sehr zeitfressende Grenze.
In meinem Projekt wird auf Tabelle 2 ("Übersicht") ein Dictionary (projectlist) erstellt und gefüllt.
Den Inhalt des Dictionary's (Keys & Values) möchte ich in einer Listbox auf einem UserForm anzeigen lassen.
Da das UserForm aber in der Ordnerstruktur im Ordner Formulare liegt brauche ich eine Möglichkeit die Daten oder das gesamte Dictionary zu übergeben.
Wäre super, wenn mir jemand weiterhelfen kann :)

25
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Bahnhof.
28.07.2022 13:49:50
Rudi
zeig mal was du hast.
Wie kann ein Userform in einem Ordner liegen?
AW: Bahnhof.
28.07.2022 14:01:44
Tim
Hallo Rudi Maintaire,
ich meinte, dass der Code zur Initialisierung des UserForms in der Ordnerstruktur unter "Formulare" liegt und eben nicht bei den Tabellenblättern.
Userbild
Bisher habe ich:

Private Sub UserForm_Initialize()
Dim key As Variant
For Each key In projectlist.Keys
'ListBox befüllen
ListBox1.AddItem (projectlist(key))
Next key
End Sub
und eben das erstellte Dictionary projectlist auf Tabellenblatt 2.
Anzeige
AW: Bahnhof.
28.07.2022 14:10:10
Daniel
Hi
und wo liegt der Code, mit dem projectlist befüllt wird?
der muss zuerst laufen, damit projectlist überhaupt daten hat und projectlist muss - so wie ich es in meiner anderen Antwort beschrieben habe - als projektweit gültige Variable deklariert sein (allgemeines Modul mit Public oberhalb der Variablen).
alternativ, wenn du kein allgemeines Modul anlegen willst, kannst du das gleiche auch in dem Tabellenblattmodul machen, in dem das Makro zu projectlist liegt, dh projectlist im Tabellenblattmodul oberhalb der Makros mit Public deklarieren, dann allerdings muss der Aufruf mit dem Tabelenblattnamen erfolgen: Tabelle1.projectlist
Gruß Daniel
Anzeige
AW: Bahnhof.
28.07.2022 14:18:13
Tim
Hallo Daniel,
der Code liegt inzwischen, wie du beschrieben hast auf einem Modul. Davor lag er auf Tabelle2.
Gibt es einen Unterschied zwischen allgemeinen Modulen und solchen, die ich per Rechtklick auf Module - Einfügen - Module erstelle?
Viele Grüße, Tim
AW: Bahnhof.
28.07.2022 14:29:48
Daniel
naja, die Module der Tabellenblätter sind eben diesen zugeordnet.
funktional die wichtigsten unterschiede zu allgemeinen Modulen sind:
- wird kein Tabellenblatt angegeben (Range("A1")) so wird im Tabellenblattmodul das Tabellenblatt des Moduls angewendet, in einem allgemeinen Modul immer das aktive Tabellenblatt
- will man aus anderen Modulen heraus die public-Makros oder Public-Variablen verwenden, so reicht der Marko- oder Variablenname allein aus, wenn das Makro oder die Variable in einem allgemeinen Modul erstellt bzw deklariert wurde. Steht das Makro jedoch in einem Tabellenblattmodul, so muss man immer den Modulnamen , bzw den Codenamen des Tabellenblatts voranstellen:
allgemeines Modul: Call Makro1
Tabellenblattmodul: Call Tabelle1.Makro1
der Grund ist, dass über alle allgemeinen Module hinweg ein Makro- oder Variabelnname nur einmal verwendet werden darf.
in den Tabellenblattmodulen jedoch dürfen sich diese Namen wiederholen (dh in jedem Modul einmal vorkommen) , sonst würde das Prinzip mit den Eventmakros, die es ja für jedes Blatt geben muss, nicht funktionieren.
Daher muss man dann immer den Modulnamen voranstellen, damit VBA weiß, in welchem Modul es das Makro suchen muss.
Allgemeine Module werden hingegen wie einziges großes Modul behandlelt.
Gruß Daniel
Anzeige
AW: Bahnhof.
28.07.2022 14:18:51
Rudi
unter der Voraussetzung, dass ProjectList eine globale Variable und gefüllt ist:

Private Sub UserForm_Initialize()
Dim key As Variant, arrLbx(), n
ReDim arrLbx(1 To ProjectList.Count, 1 To 2)
For Each key In ProjectList.Keys
n = n + 1
arrLbx(n, 1) = key
arrLbx(n, 2) = ProjectList(key)
Next key
With ListBox1
.ColumnCount = 2
.List = arrLbx
End With
End Sub

AW: Bahnhof.
28.07.2022 14:24:24
Tim
Bekomme leider auch hier in Zeile 3 denselben Fehler.
Muss also an der Deklarierung der projectlist liegen.
So habe ich sie in dem Modul festgelegt:

Option Explicit
Public projectlist As Object
Auf UserForm1 taucht sie erst in UserForm_Initialize () auf. Muss ich sie hier noch irgendwie abrufen?
Anzeige
AW: Bahnhof.
28.07.2022 14:29:39
Zwenn
Hallo,
folgendes Makro in ein allgemeines Modul kopieren. Dieses Makro startest Du und dann wird die Listbox mit Deinem Code entsprechend befüllt. Das geht, ich habe es ausprobiert.

Public projectlist As Object
Sub DictInUF()
Dim i As Long
Set projectlist = CreateObject("scripting.Dictionary")
For i = 1 To 5
projectlist("Key" & i) = i * 10
Next i
UserForm1.Show
End Sub
Viele Grüße,
Zwenn
AW: Bahnhof.
28.07.2022 14:56:10
Tim
Hallo Zwenn,
danke schonmal :) Der Fehler ist weg. Leider ist die angezeigte Listbox leer.

Set projectlist = CreateObject("scripting.Dictionary")
mache ich an einer anderen Stelle schon, weshalb ich das auskommentiert habe. Das Dict hat auf jedenfall einen Inhalt. Den habe ich mir printen lassen.
Das UF wird geöffnet, ist allerdings leer.
Viele Grüße,
Tim
Anzeige
AW: Bahnhof.
28.07.2022 15:42:25
Zwenn
Sorry,
warum bei Dir keine Werte in der Listbox ausgegeben werden kann ich Dir nicht sagen. Ich habe Deinen geposteten Code in eine UF kopiert, auf der ich zusätzlich lediglich eine Listbox platziert habe. Schau in die hochgeladene Datei und probiere das kleine Beispiel aus. Dann siehst Du, wie es funktioniert.
https://www.herber.de/bbs/user/154408.xlsm
Viele Grüße,
Zwenn
PS: Ich habe mir die anderen Antworten aktuell nicht im Detail durchgelesen.
AW: Bahnhof.
29.07.2022 07:05:53
Tim
Hallo Zwenn,
danke für die Beispieldatei & die Mühe :)
Setze mich heute noch einmal an das Thema. Dein Code wird bei mir auch komplett durchlaufen. Melde mich noch einmal ob ich es hinbekommen habe.
Viele Grüße, Tim
Anzeige
Crossposting
29.07.2022 08:11:40
SF
Im CEF Forum würde man sich bestimmt auch über Feedback freuen....
AW: Crossposting
29.07.2022 08:27:13
Tim
Sodele :) Habe eine Lösung für das Problem.
Nochmal danke @Zwenn.
Nach Initialisierung und Füllen des Dictionary wird folgender Code in einem allgemeinen Modul ausgeführt:

Sub DictToUserForm()
UserForm1.Show
End Sub
Das Dictionary ist hier public.
UserForm 1 wird wie folgt initialisiert:

Private Sub UserForm_Initialize()
Dim key As Variant
For Each key In projectlist.Keys
ListBox1.AddItem key
Next
End Sub
(Man befindet sich nun in der Ordnerstruktur bei "Formulare" auf dem UserForm und nicht mehr auf dem Modul)
Hierbei wird jeder Key aus dem Dictionary der ListBox1 hinzugefügt. :)
Also mein Fehler zur Verwendung deines Codes @Zwenn lag daran, dass ich die ListBox an das UserForm gebunden hatte und diese also auch hier befüllen muss.
@SF Feedback darf natürlich gerne geteilt werden :)
Viele Grüße, Tim
Anzeige
AW: Crossposting
29.07.2022 14:18:32
SF
Schade dass du den Helfern im anderen Forum keine Beachtung schenkst.
AW: Dictionary an UserForm übergeben
28.07.2022 13:54:29
Daniel
Hi
am einfachsten:
lege die Variable für das Dictionary in einem allgemeinen Modul oberhalb der Makros als Public myDictionary as Object an.
auf diese Weise deklarierte Variablen sind projektweit gültig und können von allen Makros innerhalb der ganzen Mappe verwendet werden.
Sie behalten daher auch nach Ende eines Makros ihre Werte.
Achte darauf, dass du diese Variable nicht noch einmal innerhalb eines Markos deklarierst, denn sonst hast du trotz gleichen Namens zwei unterschiedliche Variablen, die nichts miteinander zu tun haben, eine für das Makro in dem die Variabel nochmal deklariert wurde und eine für alle anderen Makros.
du musst dann nur schauen, dass das Makro dass das Dictionary mit Inhalt füllt zuerst ausgeführt wird, und die Makros, das Dictionary dann auslesen, danach.
Gruß Daniel
Anzeige
AW: Dictionary an UserForm übergeben
28.07.2022 14:13:08
Tim
Hallo Daniel,
das Dictionary ist in Modul 1 schon als Public (...) as Object deklariert.
Leider bekomme ich auf UserForm1 immer noch eine Fehler '91 Objektvariable oder With-Blockvariable nicht festgelegt.
Hier der Code des UserForms:

Private Sub UserForm_Initialize()
Dim key As Variant
For Each key In projectlist.Keys
'ListBox befüllen
ListBox1.AddItem (projectlist(key))
Next key
End Sub
Deklariert wird das Dictionary einmalig bei Start der Mappe. Eine Dopplung wird hier also kein Problem.
AW: Dictionary an UserForm übergeben
28.07.2022 14:21:30
Daniel
Hi
mit so einem Teilcode schwer zu sagen.
Beispieldatei ist immer hilfreich.
du solltest beim Variablennamem immer einen Großbuchstaben verwenden.
beim Schreiben des Codes schreibst du immer alles klein (Groß/Kleinschreibung spielt keine Rolle)
Wenn der Edtior jetzt die Variable erkennt, wird er Schreibweise anpassen und den Großbuchstaben groß machen.
Bleibt alles klein, ist das für dich ein Hinweis, dass hier was nicht stimmt, entweder hast du die Variable falsch geschrieben oder sie wird aus einem anderen Grund nicht erkannt.
was genau möchtest du jetzt in der Listbox stehen haben?
die Keys oder die Items?
normalerweise braucht man da keine Schleife für, sondern kann direkt zuweisen: Listbox1.List = projectlist.Keys
Gruß Daniel
Anzeige
AW: Dictionary an UserForm übergeben
28.07.2022 14:22:07
Rudi
hast du das Object denn auch in irgendeinem Code initialisiert?
Set ProjectList=CreateObject("scripting.dictionary")
Und dann musst du das ja auch noch mit Werten füllen.
Gruß
Rudi
AW: Dictionary an UserForm übergeben
28.07.2022 14:40:39
Tim
Habe jetzt einmal alles entfernt, was nichts mit dem Dictionary zu tun hat.
Alle Variablen, die verwendet werden sind auch definiert und funktionieren. Hier der Code aus Modul 1:

Option Explicit
Public projectlist As Object
Sub ImportProjektdaten2()
Dim projectName As Variant
Dim projectRange As Variant
Dim projectRangeStart As Variant
Dim projectRangeEnd As Variant
'Projektfläche definieren (3 Spalten mit Überschrift)
Set projectRangeStart = Cells(lastRow, lastColumn)
Set projectRangeEnd = Cells(201, lastColumn + 2)
projectRange = Range(projectRangeStart, projectRangeEnd).Address
'Projekt zu projectlist hinzufügen
projectlist.Add projectName, projectRange
End Sub
Sub DeleteProject()
projectlist.Remove (projectName)
End Sub
Sub AddProjectlist()
Set projectlist = New Scripting.Dictionary
End Sub
Und hier der Code, der sich auf UserForm1 findet:

Option Explicit
Private Sub UserForm_Initialize() 'Daniels Code
Dim key As Variant, arrLbx(), n
ReDim arrLbx(1 To projectlist.Count, 1 To 2)
For Each key In projectlist.Keys
n = n + 1
arrLbx(n, 1) = key
arrLbx(n, 2) = projectlist(key)
Next key
With ListBox1
.ColumnCount = 2
.List = arrLbx
End With
End Sub
Ausgegeben werden sollen nur die Keys
AW: Dictionary an UserForm übergeben
28.07.2022 14:50:57
Rudi
weißt du überhaupt, was du machst?
projectlist.Add projectName, projectRange
hier fügst du den Schlüssel 'Inhalte der Variable projectName' (wie auch immer die gefüllt ist) ein und weist ihm die Adresse des Bereichs zu.
AW: Dictionary an UserForm übergeben
28.07.2022 14:58:18
Tim
Ja, das ist tatsächlich Ziel der Aktion.
Gibt bestimmt für die Anwendung schönere Lösungen.
AW: Dictionary an UserForm übergeben
28.07.2022 15:20:48
Daniel
Hi
1. da fehlen noch ein paar Dinge. Bevor du die Userform initialisierst, müssten die Makros AddProjectlist() und ImportProjektdaten2 nacheinander in dieser Reihenfolge ausgeführt werden, damit das Dictionary projectlist angelegt und befüllt ist. Sowas passiert nicht automatisch. Wo ist der Code, der diese beiden Makros ausführt?
2. das Initialisieren des Dictionarys kenne ich als Code etwas anders (Set prist = CreateObject("Scripting.Dictionary")), könnte aber mit Early- statt Latebinding zusammenhängen, bei mir zumindest funktioniert es nur so wie von mir beschrieben
3. dein Dictionary enthält immer nur einen einzigen Wert. Das ganze ist großer unsinn.
Gruß Daniel
AW: Dictionary an UserForm übergeben
28.07.2022 15:28:27
Tim
Hi Daniel
1. AddProjectlist() wird bei Start der Mappe ausgeführt. ImportProjektdaten2 immer vom Bediener per Schaltfläche, wenn er ein neues Projekt anlegt.
2. Hier funktionieren meines Wissens beide Varianten.
3. Dadurch, dass ImportProjektdaten2 mehrmals ausgeführt wird füllt sich das Dictionary nach und nach. Der Unsinn wird so ab dem 2. Durchlauf hilfreich.
Viele Grüße Tim
AW: Dictionary an UserForm übergeben
28.07.2022 15:47:06
Daniel
Hi
in dem gezeigten Code nein.
du verwendest als Key die Variable projectName und der wird nie ein Wert zugewiesen.
du hast also immer den Key leer und da du immer den selben Key hast, wird im Dictionary immer diese Position überschrieben und keine neue angelegt, dh da füllt sich nichts.
Wenn du projectName ebenfalls in einem anderen Makro - welches du uns nicht zeigst - befüllst, dann nützt dir das nichts, weil du die Variable in diesem Makro deklarierst und sie damit für dieses Makro neu angelegt wird, dh sie muss auch in diesem Makro einen Wert erhalten.
Gruß Daniel
AW: Dictionary an UserForm übergeben
29.07.2022 07:01:07
Tim
Hallo Daniel,
Variable wird im selben Makro jedes mal bei Ausführung deklariert. Hatte geschrieben, dass ich einen Großteil des Codes auslasse, da dieser nichts mit der Lösung meines Problems zu tun hat.
Ob sich das Dictionary füllt habe ich schon getestet. Tut es.
Danke dir für die Gedankengänge :) Der bisherige Code tut was er soll.
Viele Grüße, Tim

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige