Прежде всего, я считаю, что в долгосрочной перспективе вам повезет больше, если вы будете хранить свои данные в более горизонтальной форме, например
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
Гораздо проще выполнять поиск по одному столбцу, чем по парам столбцов.
(В зависимости от размера и масштаба база данных Access с отдельными таблицами Store, Product и Sales может быть даже лучше)
Тем не менее, если вы застряли с тем, что у вас есть, и вы можете использовать макрос VBA на своем листе, вы можете попробовать следующее:
Добавьте модуль класса в ваш проект VBA под названием Tuple
, содержащий:
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
в ваш проект, содержащий:
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
Затем в листе вы можете ввести формулу, например:
="Product " & $A2 & " has " & Summarize($B2:$I2)
Убедитесь, что вы заменили диапазон $ B2: $ I2 на тот, который достаточно широк, чтобы охватить все возможные количества магазинов. Также убедитесь, что вы используете диапазон четного размера (поскольку значения Sale/Qty указаны в парах), иначе вы получите ошибку #VALUE
.