Você pode usar SUMIFS com curingas:
=SUMIFS(B:B,C:C,"*" & E1 & "*")/$B$5
Não tenho certeza se isso é possível. É o seguinte, imagine a seguinte planilha do excel:
STOCK|VALUE|TAGS
ABCDE|10000|Z,X
FGHIJ|20000|X,Y
KLMNO|30000|X,Y,Z
PQRST|10000|Z,Y
Total|70000|
Agora, em algum lugar da planilha ou pasta de trabalho, quero gerar porcentagens do que cada tag consiste em relação ao valor total. Então, por exemplo, ele me mostraria (gerado dinamicamente com base nos valores de 'TAGS' usados):
X = 60,000 / 85.71%
Y = 60,000 / 85.71%
Z = 50,000 / 71.43%
O primeiro (e único) método que vem à mente é ter uma declaração if para cada valor de 'TAG' possível. No entanto, isso é longo, pesado, sujo, ineficiente e não dinâmico. Certamente há uma maneira melhor? Preferiria uma solução estritamente Excel; mas se não for possível - VBA teria que ser, suponho ...
// Editar > VBA não funcional que tenho neste estágio. Eu não faço VBA; então desculpe o código pobre. Atualmente, isso tenta gerar uma lista na 5ª / 6ª coluna dos campos de tag exclusivos e somar um campo de porcentagem na 7ª coluna. Não está funcionando no estado atual porque está tomando todo o campo de tags como um único valor.
Sub ProcessData1()
Dim dict As Dictionary
Dim i As Integer
Dim targetRow As Integer
Dim stock As String
Dim value As Double
Dim more As Boolean
Set dict = New Dictionary
more = True
'Row Start
i = 2
targetRow = 1
While more
tags = Worksheets("holdings").Cells(i, 3).value
If dict.Exists(tags) Then
value = Worksheets("holdings").Cells(dict.Item(tags), 6) + Worksheets("holdings").Cells(i, 2).value
Worksheets("holdings").Cells(dict.Item(tags), 6) = value
'Assumes Total value on Row 21
Worksheets("holdings").Cells(dict.Item(tags), 7) = value * 100 / Worksheets("holdings").Cells(21, 2)
Else
targetRow = targetRow + 1
Worksheets("holdings").Cells(targetRow, 5) = Worksheets("holdings").Cells(i, 3).value
Worksheets("holdings").Cells(targetRow, 6) = Worksheets("holdings").Cells(i, 2).value
Worksheets("holdings").Cells(targetRow, 7) = Worksheets("holdings").Cells(i, 2).value * 100 / Worksheets("holdings").Cells(21, 2)
dict.Item(tags) = targetRow
End If
i = i + 1
If Len(Worksheets("holdings").Cells(i, 1)) = 0 Then more = False
Wend
End Sub
Ok, então eu tenho minha própria resposta. Seu VBA e eu não fazemos VBA como eu disse acima, então o código abaixo eu tenho certeza que está longe de ser uma solução perfeita, mas funciona.
Sub ProcessData1()
Dim dict As Dictionary
Dim i As Integer
Dim j As Integer
Dim targetRow As Integer
Dim stock As String
Dim value As Double
Dim more As Boolean
Dim tags() As String
Dim tag As String
Set dict = New Dictionary
more = True
'Row Start
i = 2
targetRow = 1
While more
tags() = Split(Worksheets("holdings").Cells(i, 3).value, ",")
For j = LBound(tags) To UBound(tags)
tag = tags(j)
'MsgBox tag
If dict.Exists(tag) Then
value = Worksheets("holdings").Cells(dict.Item(tag), 6) + Worksheets("holdings").Cells(i, 2).value
Worksheets("holdings").Cells(dict.Item(tag), 6) = value
'Assumes Total value on Row 21
Worksheets("holdings").Cells(dict.Item(tag), 7) = value * 100 / Worksheets("holdings").Cells(21, 2)
Else
targetRow = targetRow + 1
Worksheets("holdings").Cells(targetRow, 5) = tag
Worksheets("holdings").Cells(targetRow, 6) = Worksheets("holdings").Cells(i, 2).value
Worksheets("holdings").Cells(targetRow, 7) = Worksheets("holdings").Cells(i, 2).value * 100 / Worksheets("holdings").Cells(21, 2)
dict.Item(tag) = targetRow
End If
Next j
i = i + 1
If Len(Worksheets("holdings").Cells(i, 1)) = 0 Then more = False
Wend
End Sub