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

odic.keys in Zellen

odic.keys in Zellen
20.03.2018 12:31:15
Burak
Guten Morgen!
Ich habe für eine ComboBox einen Code der die Werte ohne doppelte Werte ermittelt und in die ComboBox reinschreibt.
Jetzt möchte ich die Werte in einem Tabellenblatt in Zellen nebeneinander schreiben.
Also Einträge dann 1. Eintrag in B1, 2. in C1 usw.
Der Code zuvor:
With Worksheets("Daten")
'Spalten sortieren
.Columns("A:A").Sort Key1:=.Range("A2"), Order1:=xlAscending, Header:=xlYes
'Einträge OHNE doppelte Werte
Set oDic = CreateObject("Scripting.Dictionary")
meAr = .Range("A2", "A1048576")
For A = 1 To UBound(meAr)
oDic(meAr(A, 1)) = 0
Next
'Werte in die ComboBox schreiben
bauformbox.List = oDic.keys
.Range("B1:Z1").Value = oDic.keys 'Hier sollen die Werte reingeschrieben werden
End With
Aber er schreibt für jede der Zellen immer nur den ersten Wert der keys rein.
Freundliche Grüße

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: odic.keys in Zellen
20.03.2018 12:52:04
Rudi
Hallo,
Range("B1").Resize(, oDic.Count) = Application.Transpose(Application.Transpose(oDic.keys))
Gruß
Rudi
Es geht! Danke! Du bist der beste :* o.w.T.
20.03.2018 12:57:27
Burak
Korrektur
20.03.2018 13:00:50
Rudi
Hallo,
es muss ja auch
   meAr = .Range("A2:A1048576")

heißen.
Ausgabe mit
.Range("B1").Resize(,oDic.Count) = oDic.keys 
Gruß
Rudi
noch ein paar Optimierungen
20.03.2018 13:32:48
Daniel
Hi
es ist doch unnötig, die Schleife über alle Excelzeilen zu jagen.
    meAr = .Usedrange.Columns(1)
For A = 2 To UBound(meAr)
da wird dann die letzte befüllte Zeile automatisch ermittelt.
das Überspringen der Überschrift machst du dann über den Startwert der FOR-Schleife.
Gruß Daniel
Anzeige
AW: noch ein paar Optimierungen
20.03.2018 14:14:37
Burak
Das funktioniert so leider nicht, da diese Tabelle keine leere Zeile enthält!
Über Cells.Rows. Count end.xlup oder wie der Befehl heißt kriege ich einen Rückgabewert von 1.
Also schreibe ich den Wert in eine Variable, und wenn der Wert 1 ist ersetze ich den Wert mit der Zeilenzahl der allerletzten Zeile (1.048.576)
und habe dann
meAr = .Range("A2:A" & Loletzte)
also nachm gleichen Prinzip aber erfordert eine Überprüfung zuvor.
AW: noch ein paar Optimierungen
20.03.2018 14:28:42
Daniel
Hi Burak
eine kleine Bitte.
Bevor du auf Beiträge antwortest, lies sie bitte durch.
ich habe nirgendwo ein .End(xlup) erwähnt, sondern eine etwas andere Methode vorgeschlagen, die kein Problem mit vollständig gefüllten Spalten hat, sondern diese auch verwendet, wenn sie denn vorkommen.
btw. ist es denn wirklich so, dass deine Tabellen bis zur letzten Zeile mit Werten gefüllt sind oder hat da nur jemand bei der Bearbeitung der Tabellen nicht aufgepasst?
Gruß Daniel
Anzeige
AW: noch ein paar Optimierungen
21.03.2018 10:40:26
Burak
Entschuldige, habe mich nicht klar genug ausgedrückt. Deinen Vorschlag hatte ich schon zuvor angewandt und habe auch da einen Rückgabewert von 1 oder 0 bekommen (für die letzte Zeile), da er keine freie findet.
Ab dem Satz mit .End(xlUp) habe ich dann erzählt wie ich dieses Problem umgangen habe.
Hätte mich besser ausdrücken sollen :(
Nein sie ist bis zum Ende befüllt. Eigentlich hat die importierte Quelldatei über 16 Million Zeilen, aber er importiert so viele Zeilen bis das Tabellenblatt befüllt ist und geht dann im Makro einfach weiter. Daher ist sie definitiv IMMER voll befüllt. (Eigentlich könnte man da auch statt Zeilen zählen immer fixe Endzeile von 1.048.576 angeben aber wollte halt flexibel bleiben)
Grüße
Burak
Anzeige
AW: noch ein paar Optimierungen
21.03.2018 11:10:43
Daniel
Hi
nochmal für dich: bei meinem vorschlag brauchst du die letzte befüllte Zeile nicht ermitteln, das macht Excel im UsedRange schon automatisch. das funktioniert auch, wenn die Tabelle bis zur letzten Zeile befüllt ist.
den Sprung mit End(xlUp) zur Ermittlung der letzten befüllten Zeile darf man generell nur machen, wenn die Absprungzelle leer ist.
daher muss man die Ermittlung der letzten befüllten Zeile eigentlich so programmieren:
LoLetzte = IIF(Worksheetfunction.countA(Cells(Rows.Count, 1)) = 0, Cells(Rows.count, 1).end(xlup).Row, Rows.count)
Das schreiben aber die wenigsten in dieser Ausführlichkeit so hin und verwenden nur die Kurzform, weil es eben sehr selten vorkommt, dass eine Exceldatei bis zur letzten Zeile befüllt ist. Du bist da die Ausnahme.
Gruß Daniel
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige