Ich habe eine Tabelle mit folgendem: -
Prod No Store 1 $ Store 1 Qty Store 2 Sale Store 2 Qty etc
A 4.00 1 7.50 2
B 0 0 15.00 1
C 4.00 2 -8 -1
D 5.00 1 5.00 1
Ich muss alle Einzelpreise für jede Teilenummer ermitteln und dann die Menge für jeden Preis addieren, z. B.
Prod No A has 4.00 1 unit and 7.50 2 units
Prod No B has 0.00 0 units and 15.00 1 unit
Prod No C has 4.00 2 units and -8 -1 unit
Prod No D has 5.00 2 units
Ich brauche außerdem eine Liste nur der Einzelpreise und der Gesamtmengen für jeden Preis
z.B,
4.00 3 units
7.50 2 units
0.00 0 units
-8 -1 unit
15.00 1 unit
5.00 2 units
Antwort1
Zunächst einmal glaube ich, dass Sie auf lange Sicht mehr Erfolg hätten, wenn Sie Ihre Daten in einer horizontaleren Form speichern würden, z. B.
Store Product Qty Sales
Store 1 A 1 4.00
Store 1 B 0 0.00
Store 1 C 2 4.00
Store 1 D 0 0.00
Es ist viel einfacher, Nachschlagevorgänge in einer einzelnen Spalte durchzuführen als in Spaltenpaaren.
(Je nach Größe und Umfang ist eine Access-Datenbank mit separaten Tabellen für Geschäfte, Produkte und Verkäufe möglicherweise sogar noch besser.)
Wenn Sie jedoch mit dem, was Sie haben, nicht weiterkommen und ein VBA-Makro in Ihrem Arbeitsblatt vertragen, können Sie Folgendes versuchen:
Fügen Sie Ihrem VBA-Projekt ein Klassenmodul mit dem Namen hinzu, das Folgendes
Tuple
enthält:Private szKey As String Private nValue As Double Public Property Get Key() As String Key = szKey End Property Public Property Let Key(newKey As String) szKey = newKey End Property Public Property Get Value() As Double Value = nValue End Property Public Property Let Value(newValue As Double) nValue = newValue End Property
Module 1
Fügen Sie Ihrem Projekt beispielsweise ein normales Modul hinzu, das Folgendes enthält:Public Function Summarize(ByRef rng As Range) As String If rng.Cells.Count Mod 2 = 1 Then Err.Raise 100, "", "Expected range of even cells" Dim coll As New Collection On Error Resume Next Dim flag As Boolean: flag = False Dim prevCel As Range, cel As Range: For Each cel In rng.Cells If flag Then Dim Key As String: Key = "" & prevCel.Value2 coll(Key).Value = coll(Key).Value + cel.Value2 If Err.Number <> 0 Then Err.Clear Dim t1 As New Tuple t1.Key = "" & prevCel.Value2 t1.Value = cel.Value2 coll.Add t1, Key Set t1 = Nothing End If End If Set prevCel = cel flag = Not flag Next cel On Error GoTo 0 Dim t2 As Variant: For Each t2 In coll If Len(Summarize) Then Summarize = Summarize & ", " Summarize = Summarize & Format(t2.Key, "#0.00") & " @ " & t2.Value Next t2 End Function
Anschließend können Sie in das Arbeitsblatt eine Formel eingeben, beispielsweise:
="Product " & $A2 & " has " & Summarize($B2:$I2)
Stellen Sie sicher, dass Sie den Bereich $B2:$I2 durch einen Bereich ersetzen, der groß genug ist, um alle möglichen Anzahlen von Geschäften abzudecken. Stellen Sie außerdem sicher, dass Sie einen Bereich mit gleichmäßiger Größe verwenden (da die Werte für Verkauf/Menge paarweise vorliegen), da Sie sonst eine
#VALUE
Fehlermeldung erhalten.