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

VBA Zählenwenn Array Dict

VBA Zählenwenn Array Dict
13.02.2020 22:51:16
Max
Hallo VBA-Experten,
ich habe ein kleines Problem, was ihr sicherlich mit Leichtigkeit lösen könnt.
in Worksheets(1) Spalte A ist der zu durchsuchende Bereich. In Worksheets(2) Zeile A1:A4 sind die Zahlen, die im Suchbereich gezählt werden sollen. Das ist nur eine kleine Ausführung von dem, was tatsächlich abgefragt werden soll. Hier kommt es zu mehr als 200.000 Datensätzen.
Hier der Beispielcode, den ich aus dem Internet habe und versucht habe auf meine Bedürfnisse anzuzpassen, leider vergeblich.
"

Sub Zählenwenn()
Dim Cl As Range
Dim Itm As Variant
Dim tmp As Variant
With CreateObject("scripting.dictionary")
For Each Cl In Worksheets(1).Range("A1", Worksheets(1).Range("A" & Rows.Count).End(xlUp))
If Not .Exists(Cl.Value) Then
.Add Cl.Value, Array(Cl, 1)
Else
tmp = .Item(Cl.Value)
tmp(1) = tmp(1) + 1
.Item(Cl.Value) = tmp
End If
Next Cl
For Each Itm In Worksheets(2).Range("A1", Worksheets(2).Range("A" & Rows.Count).End(xlUp)) _
If .Exists(Itm) Then Itm.Offset(, 1).Value = Itm(1).Count
Next Itm
End With
End Sub
"
Hier:
"For Each Itm In Worksheets(2).Range("A1", Worksheets(2).Range("A" & Rows.Count).End(xlUp))
If .Exists(Itm) Then Itm.Offset(, 1).Value = Itm(1)
Next Itm"
schaffe ich es nicht die Suchzahl aus Worksheets(2) im Dictionary auszulesen und die Anzahl aus Worksheets(1) in Worksheets(2) Spalte B (neben der Suchzahl) einzutragen.
Könnt ihr mir helfen?
Besten Dank im Voraus
Max

28
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Zählenwenn Array Dict
13.02.2020 23:17:25
onur
Codeschnipselchen bringen nix ohne die Datei, zumal der Code aus dem Internet gesaugt und etwas verändert wurde und sowieso nicht läuft.
Beschtreibe doch mal, was GENAU du womit erreichern willst und poste eine Beispielsdatei dazu.
AW: VBA Zählenwenn Array Dict
13.02.2020 23:29:02
Max
https://www.herber.de/bbs/user/135185.xlsx
Hier die Beispiel Datei.
Das ist ein kleines Beispiel. In Tabelle1 stehen sonst mehr als 300.000 Datensätze, die in Tabelle2 gezählt werden sollen.
Mit Scripting.Dictionary erstellen, befüllen und auslesen klappt es, dauert allerdings mehrere Minuten.
Mit Array und Scripting.Dictionary habe ich die Erfahrung gemacht, dass es wesentlich schneller geht. Durch die unterschiedlichen Arbeitsblätter habe ich ein Problem den im 1. Post angegebenen Code anzupassen.
Wenn ich in Tabelle1 Spalte A auslese und das Ergebnis in Tabelle1 Spalte B schreibe, ist das kein Problem, jedoch nicht mit einem separaten Arbeitsblatt :-/
Anzeige
AW: VBA Zählenwenn Array Dict
13.02.2020 23:30:23
onur
Noch ein mal: Beschreibe doch mal, was GENAU du womit erreichern willst und poste eine Beispielsdatei dazu
AW: VBA Zählenwenn Array Dict
13.02.2020 23:35:32
onur
Willst du wirklich nur zählen, wie oft die Zahl in Tabelle1 vorkommt?
Ist ZählenWenn zu langsam oder warum VBA?
AW: VBA Zählenwenn Array Dict
13.02.2020 23:48:46
Max
https://www.herber.de/bbs/user/135186.xlsm
Ich hoffe das ist ausreichend.
In Tabelle1 der Suchbereich (normalerweise mehr als 300.000 Datensätze)
In Tabelle2 die Suchkriterien, die in Tabelle1 gezählt werden sollen.
Ja, nur einfaches Zählen. Wenn ich das normale Scripting.Dictionary verwende dauert es bei mehr als 300.000 Datensätzten in Tabelle1 mehrere Minuten.
Anzeige
AW: VBA Zählenwenn Array Dict
13.02.2020 23:49:27
Max
https://www.herber.de/bbs/user/135186.xlsm
Ich hoffe das ist ausreichend.
In Tabelle1 der Suchbereich (normalerweise mehr als 300.000 Datensätze)
In Tabelle2 die Suchkriterien, die in Tabelle1 gezählt werden sollen.
Ja, nur einfaches Zählen. Wenn ich das normale Scripting.Dictionary verwende dauert es bei mehr als 300.000 Datensätzten in Tabelle1 mehrere Minuten.
AW: VBA Zählenwenn Array Dict
13.02.2020 23:50:55
onur
Liest du eigentlich, was ich dir schreibe ?
NOCHMAL: Ist ZählenWenn zu langsam oder warum VBA?
AW: VBA Zählenwenn Array Dict
13.02.2020 23:52:16
Max
Zählenwenn ist eindeutig zu langsam, sonst würde ich doch nicht nach Alternativen suchen. Zumal die Daten in Tabelle1 immer mehr werden.
Anzeige
AW: VBA Zählenwenn Array Dict
13.02.2020 23:54:17
onur
Hast du die Datei mit der Original-Datenmenge? Sonst kann ich schlecht testen.
Du kannst sie ja anonymisieren, wenn du willst.
AW: VBA Zählenwenn Array Dict
14.02.2020 00:09:54
Max
Eine anonymisierte Datei habe ich nicht zu Hause.
Eine Beispieldatei kann ich nicht erstellen, da das Limit hier beo 300 kb liegt, da passt ja nichts rein an Daten.
AW: VBA Zählenwenn Array Dict
14.02.2020 00:34:35
Max
Ich teste das mal mit den realen zahlen am Montag. Danke dir Trotzdem schonmal :-)
Zählenwenn ist eindeutig zu langsam
14.02.2020 12:45:00
Rudi
Hallo,
das liegt aber nicht an Zählenwenn(), sondern an anderen Berechnungen.
Eine VBA-Prozedur ist auf jeden Fall langsamer.
Gruß
Rudi
Anzeige
AW: Zählenwenn ist eindeutig zu langsam
14.02.2020 13:49:40
onur
Da kennst du aber VBA schlecht.
AW: Zählenwenn ist eindeutig zu langsam
14.02.2020 15:41:39
Daniel
naja, eine VBA-Prozedur, die die Excelfunktion 1:1 nachbaut, ist in der Regel langsamer, als die Excelfunktion.
Der Vorteil von VBA entsteht dann, wenn man innerhalb von VBA die Arbeit etwas "geschickter" organisieren kann als über die die Excelformel.
Excelformeln sind "autark". dh wenn du beispielsweise in der selben Tabelle zwei verschiedene Werte suchen willst, brauchst du zwei ZählenWenn, welche jeweils eigenständig die Tabelle einlesen und in einer Schleife durchlaufen, du hast 2x einlesen und 2x die Schleife über alle Werte.
in VBA kannst du das optimieren, in dem du die Liste nur 1x einliest und beide Werte in der selben Schleife zählst, dh du sparst einmal einlesen und einmal die Schleife.
Gruß Daniel
Anzeige
Das sagst du mir?
14.02.2020 20:49:22
Rudi
Hallo Onur,
nix für ungut, aber mir fallen adhoc nur wenige Forumler ein, die VBA besser kennen als ich.
I.d.R. sind eingebaute Funktionen schneller als jedes Prog. Der einzige Fall ist, wie von Daniel geschrieben, die Reduzierung auf einen Durchlauf. Siehe mein Prog weiter unten.
Nachteil: Es muss manuell oder per Event-Handler aktualisiert werden.
Gruß
Rudi
AW: Das sagst du mir?
14.02.2020 20:56:20
onur
Sorry Rudi, wenn du dich auf den Schlips getreten fühlst und ich habe auch nicht auf den Namen des Antworters geachtet.
Deine Bescheidenheit in allen Ehren - aber eine pauschale und algemeingültige Bemerkung "Eine VBA-Prozedur ist auf jeden Fall langsamer" behauptet, hat nun mal dies Bemerkung verdient - oder ? ;)
Anzeige
AW: VBA Zählenwenn Array Dict
14.02.2020 13:13:33
Rudi
Hallo,
bei mir 0,4 Sek. für 20 Zahlen, die in 500k Zeilen gezählt werden.
Sub zaehlen()
Dim objCount As Object, i As Long, vntTmp, vntKEY
Set objCount = CreateObject("scripting.dictionary")
'Suchbegriffe
vntTmp = Sheets("tabelle2").Cells(1, 1).CurrentRegion
For i = 1 To UBound(vntTmp)
objCount(vntTmp(i, 1)) = 0
Next
'Suchmatrix
vntTmp = Sheets("Tabelle1").Cells(1, 1).CurrentRegion.Resize(, 1)
For i = 1 To UBound(vntTmp)
vntKEY = vntTmp(i, 1)
If objCount.exists(vntKEY) Then _
objCount(vntKEY) = objCount(vntKEY) + 1
Next i
'Werte ausgeben
Sheets("Tabelle2").Cells(1, 2).Resize(objCount.Count) = _
Application.Transpose(objCount.items)
End Sub

Gruß
Rudi
Anzeige
AW: VBA Zählenwenn Array Dict
14.02.2020 21:39:44
Max
Genau danach habe ich gesucht, Rudi.
Ich habe die Variante von Onur getestet und da dauert es aufgrund der For i Zeilenabfrage sehr lange. Mit deiner Variante ist das Ergebnis in wenigen Sekunden da.
Ich danke euch vielmals für eure Unterstützung :-D
AW: VBA Zählenwenn Array Dict
14.02.2020 22:10:01
Max
Hey Rudi,
geht das gleiche auch mit Zählenwenns? Ich habe aktuell kein Beispiel, deswegen ist es auch eine grundsätzliche Frage.
Lg Max
Ja sicher. owT
15.02.2020 15:51:26
Rudi
AW: Ja sicher. owT
Max
@Rudi: Wie wäre der Code, wenn
in Tabelle2 SpalteA = Suchbegriffe1
in Tabelle1 SpalteA = Suchmatrix1
in Tabelle2 SpalteB = Suchbegriffe2
in Tabelle1 SpalteB = Suchmatrix2
und das Ergebnis in Tabelle2 SpalteC
ist?
Besten Dank im Voraus.
Max
Anzeige
AW: Ja sicher. owT
Max
@Rudi: Wie wäre der Code, wenn
in Tabelle2 SpalteA = Suchbegriffe1
in Tabelle1 SpalteA = Suchmatrix1
in Tabelle2 SpalteB = Suchbegriffe2
in Tabelle1 SpalteB = Suchmatrix2
und das Ergebnis in Tabelle2 SpalteC
ist?
Besten Dank im Voraus.
Max
AW: Ja sicher. owT
Max
@Rudi: Wie wäre der Code, wenn
in Tabelle2 SpalteA = Suchbegriffe1
in Tabelle1 SpalteA = Suchmatrix1
in Tabelle2 SpalteB = Suchbegriffe2
in Tabelle1 SpalteB = Suchmatrix2
und das Ergebnis in Tabelle2 SpalteC
ist?
Besten Dank im Voraus.
Max
AW: VBA Zählenwenn Array Dict
16.02.2020 13:55:18
Max
@Rudi: Wie wäre der Code, wenn
in Tabelle2 SpalteA = Suchbegriffe1
in Tabelle1 SpalteA = Suchmatrix1
in Tabelle2 SpalteB = Suchbegriffe2
in Tabelle1 SpalteB = Suchmatrix2
und das Ergebnis in Tabelle2 SpalteC
ist?
Besten Dank im Voraus.
Max
Anzeige
AW: VBA Zählenwenn Array Dict
16.02.2020 22:28:40
Rudi
Hallo,
so?
Sub zaehlen()
Dim objOUT As Object, objSUCH As Object, i As Long, vntTmp, vntKEY
Set objSUCH = CreateObject("scripting.dictionary")
Set objOUT = CreateObject("scripting.dictionary")
'Suchbegriffe A/B
With Sheets("Tabelle2")
vntTmp = .Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp)).Resize(, 2)
End With
For i = 1 To UBound(vntTmp)
objSUCH(vntTmp(i, 1) & "_" & vntTmp(i, 2)) = 0
Next
'Suchmatrix
vntTmp = Sheets("Tabelle1").Cells(1, 1).CurrentRegion.Resize(, 2)
For i = 1 To UBound(vntTmp)
vntKEY = vntTmp(i, 1) & "_" & vntTmp(i, 2)
If objSUCH.exists(vntKEY) Then _
objOUT(vntKEY) = objOUT(vntKEY) + 1
Next i
'Werte ausgeben
Sheets("Tabelle2").Cells(1, 2).Resize(objOUT.Count) = _
Application.Transpose(objOUT.items)
End Sub

Gruß
Rudi
AW: VBA Zählenwenn Array Dict
17.02.2020 09:37:43
Max
Hi Rudi,
das ist auch sehr hilfreich. Ich hatte mich aber falsch ausgedrückt, sorry.
Ich brauche Zählenwenns
In Tabelle2 SpalteA = Suchbegriffe1, die in Tabelle1 SpalteA = Suchmatrix1 gesucht werden sollen.
Suchbegriffe2 = (Zahl) 1, die in Tabelle1 SpalteB = Suchmatrix2 gesucht werden soll.
Das Ergebnis soll in Tabelle2 SpalteC.
Besten Dank.
AW: VBA Zählenwenn Array Dict
17.02.2020 10:47:54
Max
Hi Rudi, gibt es hier ein Zahlenlimit?
Ich teste gerade mit den tatsächlichen Zahlen.
In Tabelle1 sind mehr als 300.000 Datensätze und in Tabelle2 mehr als 278.000 Datensätze.
Ab ca. 14.000 wird mir als Ergebnis in Tabelle2 Spalte2 nur noch #NV angezeigt.

303 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige