O Excel pode gerar um gráfico de porcentagem de uma coluna com valores de CSV? Como?

2

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
    
por SupaMonkey 28.08.2018 / 20:39

2 respostas

3

Você pode usar SUMIFS com curingas:

=SUMIFS(B:B,C:C,"*" & E1 & "*")/$B$5

    
por 28.08.2018 / 20:46
0

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
    
por 29.08.2018 / 17:52