Non sono sicuro che ciò sia possibile. È come segue, immagina il seguente foglio Excel:
STOCK|VALUE|TAGS
ABCDE|10000|Z,X
FGHIJ|20000|X,Y
KLMNO|30000|X,Y,Z
PQRST|10000|Z,Y
Total|70000|
Ora da qualche parte sul foglio o sulla cartella di lavoro, voglio generare percentuali di ciò che ogni tag è costituito rispetto al valore totale. Ad esempio, mi mostrerebbe (generato dinamicamente in base ai valori "TAGS" utilizzati):
X = 60,000 / 85.71%
Y = 60,000 / 85.71%
Z = 50,000 / 71.43%
Il primo (e unico) metodo che viene in mente è avere un'istruzione if per ogni possibile valore 'TAG'. Tuttavia, questo è lungo, ingombrante, sporco, inefficiente e non dinamico. Sicuramente c'è un modo migliore? Preferirei una soluzione rigorosamente Excel; ma se non fosse possibile - VBA dovrebbe essere suppongo ...
// Modifica> VBA non funzionante che ho in questa fase. Non faccio VBA; quindi scusa il codice scadente. Attualmente, questo tenta di generare un elenco nella 5a / 6a colonna dei campi tag univoci e di sommarli con un campo percentuale nella 7a colonna. Non funziona nello stato corrente perché prende l'intero campo tag come un singolo valore.
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