Microsoft Excel

Herbers Excel/VBA-Archiv

Scripting.Dictionary

Betrifft: Scripting.Dictionary von: Helmut
Geschrieben am: 11.10.2020 11:48:48


Schönen Sonntag :-)

für meine Soll-Lösung habe ich eine VBA Lösung.

Meine Frage ist, ob und wie das Soll Ergebnis mit Scripting.Dictionary zu lösen ist.

Meine Versuche sind gescheitert, vielleicht kann mir jemand helfen :-)

Besten Dank und Gruß
Helmut

https://www.herber.de/bbs/user/140801.xlsx

Betrifft: benutze doch SummeWenn(...)
von: Matthias L
Geschrieben am: 11.10.2020 11:58:16

Hi

Tabelle1

 LM
1produktTotal 1
2a197
3b56
4c175
5d92
6e60

Formeln der Tabelle
ZelleFormel
M2=SUMMEWENN($A$2:$A$17;L2;$D$2:$D$17)
M3=SUMMEWENN($A$2:$A$17;L3;$D$2:$D$17)
M4=SUMMEWENN($A$2:$A$17;L4;$D$2:$D$17)
M5=SUMMEWENN($A$2:$A$17;L5;$D$2:$D$17)
M6=SUMMEWENN($A$2:$A$17;L6;$D$2:$D$17)


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4.8

Gruß ...

Betrifft: AW: Scripting.Dictionary
von: ralf_b
Geschrieben am: 11.10.2020 12:18:04

wozu das Rad neu erfinden? Wo ist deine VBA Lösung?

Warum mit Scripting Dictionary? Gibts dafür einen Grund? Vorteile"

Betrifft: AW: Scripting.Dictionary
von: Daniel
Geschrieben am: 11.10.2020 12:36:29

Sollte die Datenmengen größer und die Anzahl der gewünschten Ergebnisse zahlreicher werden, ist SummeWenn halt irgendwann zu langsam.
Wenn dann auch eine Pivottabelle nicht ins Konzept passt, ist das dictionary ein guter Weg, das ganze zu beschleunigen.

Gruß Daniel

Betrifft: AW: Scripting.Dictionary
von: Daniel
Geschrieben am: 11.10.2020 12:42:56

Hi

Wie sehen den dein aktuelles Soll-Makro aus?
Wie sehen deine bisherigen Versuche mit Dictionary aus?
Wo liegen deine Probleme?
Was genau sind die Vorgaben, bzw was ist Vorhanden und was ist gesucht? Dh, sind die Produkte in Spalte L vorgegeben oder müssen dies auch von dem Makro ermittelt werden?

Gruß Daniel

Betrifft: AW: Scripting.Dictionary
von: Helmut
Geschrieben am: 11.10.2020 12:54:24

Hallo,

aus den Spalten A bis I soll die Tabelle wie in Spalten L bis P generiert werden.

Mein Makro spielt dabei keine Rolle, dass es mehrere Wege gibt-auch PQ- ist mir klar.

Es ist einfach ein Lernprozess mit Scripting.Dictionary und ich habe es nur für eine
Summenspalte geschafft. Deshalb meine Bitte um Hilfe für mehrere Spaltensummen.

Gruß Helmut

Betrifft: AW: Scripting.Dictionary
von: Nepumuk
Geschrieben am: 11.10.2020 13:14:22

Hallo Helmut,

in Dictionary wird der Index der Daten im Array gespeichert:

Option Explicit

Public Sub Summe()
    Dim avntValues As Variant, avntSumm() As Variant
    Dim ialngIndex As Variant, ialngRow As Long, ialngTemp As Long
    Dim objDicitionary As Object
    Set objDicitionary = CreateObject(Class:="Scripting.Dictionary")
    With Worksheets("Tabelle1")
        avntValues = .Range(.Cells(2, 1), .Cells(.Rows.Count, 9).End(xlUp)).Value
    End With
    With objDicitionary
        For ialngRow = LBound(avntValues, 1) To UBound(avntValues, 1)
            If Not .Exists(Key:=avntValues(ialngRow, 1)) Then
                Call .Add(Key:=avntValues(ialngRow, 1), Item:=ialngIndex)
                Redim Preserve avntSumm(4, ialngIndex)
                avntSumm(0, ialngIndex) = avntValues(ialngRow, 1)
                avntSumm(1, ialngIndex) = avntSumm(1, ialngIndex) + avntValues(ialngRow, 4)
                avntSumm(2, ialngIndex) = avntSumm(2, ialngIndex) + avntValues(ialngRow, 6)
                avntSumm(3, ialngIndex) = avntSumm(3, ialngIndex) + avntValues(ialngRow, 8)
                avntSumm(4, ialngIndex) = avntSumm(4, ialngIndex) + avntValues(ialngRow, 9)
                ialngIndex = ialngIndex + 1
            Else
                ialngTemp = .Item(Key:=avntValues(ialngRow, 1))
                avntSumm(1, ialngTemp) = avntSumm(1, ialngTemp) + avntValues(ialngRow, 4)
                avntSumm(2, ialngTemp) = avntSumm(2, ialngTemp) + avntValues(ialngRow, 6)
                avntSumm(3, ialngTemp) = avntSumm(3, ialngTemp) + avntValues(ialngRow, 8)
                avntSumm(4, ialngTemp) = avntSumm(4, ialngTemp) + avntValues(ialngRow, 9)
            End If
        Next
    End With
    Set objDicitionary = Nothing
    With Worksheets("Tabelle1")
        .Cells(2, 12).Resize(ialngIndex, 5) = Application.Transpose(avntSumm)
    End With
End Sub

Gruß
Nepumuk

Betrifft: Danke Nepumuk, funktioniert ...
von: Helmut
Geschrieben am: 11.10.2020 13:25:08

.. werde es mir in Ruhe anschauen und hoffentlich auch verstehen :-)

Danke auch an Matthias L, ralf_b und Daniel !

Gruß
Helmut

Betrifft: AW: Scripting.Dictionary
von: Daniel
Geschrieben am: 11.10.2020 13:26:59

Hi

Wo ist da das Problem?

Variante a)
Für jede Spalte ein eigenes Dictionary, welche du natürlich im dem selben Key befüllst.

Variante b)
Jedes Item eines Dictionarys kann nicht nur ein Einzelwertung sein, sondern auch ein Array um mehrere Werte aufzunehmen.

Hier wird es allerdings etwas komplizierter.
Wenn der Key das erste mal verwendet wird, muss man das Array neu anlegen.
Bei späteren Verwendungen muss man das Array aus dem Dictionary herausholen, befüllen und wieder zurückschreiben, also in etwa so.
if dic.exists(Product) then
    arr = dic(Product)
Else 
    Dim arr(1 to 3)
End if
arr(1) = arr(1) + esterSplatenwert
...
arr(3) = arr(3) + dritterSpaltenwert
dic(Product) = arr
Beim erstellen des Ergebnisarrays für die Ausgabe muss man das natürlich berücksichtigen.

Gruß Daniel

Betrifft: Wo ist da das Problem?
von: Helmut
Geschrieben am: 11.10.2020 13:49:27

..vor dem Bildschirm :-)

Siehe meine Antwort an Nepumuk,Thema somit erledigt-Danke

Gruß
Helmut