19.03.2023, 19:39 (Dieser Beitrag wurde zuletzt bearbeitet: 19.03.2023, 19:39 von Ego.)
zu
Zitat:Sauber laufen natürlich alle Vorschläge welche wir hier hinterlassen haben.
Nein bzw nur solange ein Name nicht auch gleich einem Teil eines längeren Namens ist.
Sauber läuft dann nur snb's Vorschlag aus #7. Wobei nicht gefordert war, dass bei falscher Schreibweise in der zweiten Liste beide Schreibweisen ausgegeben werden. Daher würde ich in den Schleifen die Listen vertauschen und in der zweiten Schleife den Else-Zweig entfernen.
helmut
Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität. Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen." Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.
ja das war zwar so nicht gefragt, aber mit direktem Vergleich vorhandene Werte (Namensvorgaben) löschen und anschließend nur übrig gebliebene Werte ins Ausgabearray schreiben ist dabei sogar etwas schneller wie die Suche im String. Der Weg wäre dann so:
Code:
Sub AbgleichFehlendeBbl() Dim arrListAuschluss(), arrTabVgl(), arrTabAus(), i&, j& With Tabelle1 arrTabVgl = Application.WorksheetFunction.Transpose(.Range("B3:B" & .Cells(Rows.Count, 2).End(xlUp).Row).Value) arrListAuschluss = Application.WorksheetFunction.Transpose(.Range("E3:E" & .Cells(Rows.Count, 5).End(xlUp).Row).Value) For i = 1 To UBound(arrListAuschluss) For j = 1 To UBound(arrTabVgl) If arrListAuschluss(i) = arrTabVgl(j) Then arrTabVgl(j) = "" End If Next j Next i j = 0 For i = 1 To UBound(arrTabVgl) If arrTabVgl(i) <> "" Then j = j + 1 ReDim Preserve arrTabAus(1 To j) arrTabAus(j) = arrTabVgl(i) End If Next i .Cells(3, 8).Resize(UBound(arrTabAus)) = Application.WorksheetFunction.Transpose(arrTabAus()) End With End Sub
20.03.2023, 15:31 (Dieser Beitrag wurde zuletzt bearbeitet: 20.03.2023, 15:34 von Ego.)
Hallo Egon, EasY,
A) zu
Zitat:... ist dabei sogar etwas schneller wie ...
wenn ihr in Zukunft auch für große Datenmengen programmieren wollt, solltet ihr euch mit der Idee hinter dem Datenobjekt Dictionary beschäftigen.
Bei der Lösung über geschachtelte Schleifen wächst die Rechenzeit exponentiell über die Länge der Listen, bei Dictionarys linear. Wenn sich die Länge der Namenslisten um den Faktor 100 ändert gilt für die Rechenzeit über geschachtelte Schleifen der Faktor 10.000 und über Dictionary der Faktor 100.
Ohne Dictionaries wär ein Internet wie wir es kennen nicht vorstellbar.
B) Ein weitere Vorteil von Dictionaries ist die häufig einfachere Struktur des Programms. SNB's Programm ist, sebst wenn die Variablennamen länger wären, sehr viel einfacher als Egon's letzte Version. Daher nutze ich das Dictionary auch bei kleinen Datenmengen.
C) Wenn ihr euch über die Nutzung von Dictionaries in VBA informieren wollt, gibt es hier eine interessante Seite :
Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität. Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen." Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.
Folgende(r) 1 Nutzer sagt Danke an Ego für diesen Beitrag:1 Nutzer sagt Danke an Ego für diesen Beitrag 28 • EasY
(20.03.2023, 15:31)Ego schrieb: wenn ihr in Zukunft auch für große Datenmengen programmieren wollt, solltet ihr euch mit der Idee hinter dem Datenobjekt Dictionary beschäftigen.
Dictionaries aus der Scripting-Bibliothek brechen allerdings in der Performance ein, sobald eine Grenze von ca. 125-150k Datensätzen überschritten wird. Da müssen dann irgendwann andere Lösungen ran, z. B. Dictionaries aus anderen Quellen.