Pergunta sobre charts, vba, range, excel, arrays – Criar gráfico de dados de matriz e não intervalo

15

é possível criar um gráfico (por exemplo, um gráfico de linhas do eixo Y duplo) não de intervalos, mas de dados de matriz? Se sim, como?

@brettdj Concordo - eu deveria ter sinalizado como relacionado, não duplicado. assylias
@assylias Além disso, eu não vi a outra pergunta como realmente sendo respondida brettdj
@ Jean-FrançoisCorbett Concordou - Eu deveria ter sinalizado como relacionado, não duplicado. assylias
@assylias: Isso não é uma duplicata óbvia ... A linguagem é C #, não VBA. Os conceitos são praticamente os mesmos, mas um exemplo elaborado não parecerá o mesmo. Jean-François Corbett

Sua resposta

2   a resposta
13

Sim. Você pode atribuir matrizes aoXValues eValues propriedades de umSeries objeto em um gráfico. Exemplo:

<code>Dim c As Chart
Dim s As Series
Dim myData As Variant

Set c = ActiveChart ' Assumes a chart is currently active in Excel...
Set s = c.SeriesCollection(1)

myData = Array(9, 6, 7, 1) ' or whatever
s.Values = myData
</code>
@ ja72: Defina "pequeno"? ... Acabei de testá-lo com 16.000 pontos. Jean-François Corbett
Impressionante. Eu estou corrigido. ja72
@ ja72 provavelmente está se referindo ao Excel 2003 e antes, onde havia uma restrição de tamanho. O tamanho da grade também limita o tamanho de matrizes de 1d para 256 ou 16384 pontos no Excel 2003/2007, respectivamente. Para superar isso, você pode definir dados como um array vertical usandoapplication.transpose(mydata) (ou declarando um array nx1 como em outra resposta) lori_m
Este é um limite no tamanho dos dados que você pode fazer assim. Não consigo lembrar o que é, mas é pequeno. ja72
@lori_m Estou definindo umList<double> whatever.toArray() paraseries.Values e executando o Excel 2007, mas exibe apenas 256 pontos. Por quê? 16k seria suficiente (razões práticas), então eu não preciso hackear um número ilimitado usando arrays nx1 Mihai Bratulescu
8

Você pode atribuir matrizes à série de gráficos no Excel 2007 em diante, mas nas versões anteriores, acredito que haja um limite de 255 caracteres para a duração de cada série. Um método que usei para contornar essa restrição é mostrado no seguinte exemplo de passeio aleatório:

<code>Sub ChartArray()

Dim x(0 To 1000, 0 To 0) As Double
Dim y(0 To 1000, 0 To 0) As Double
x(0, 0) = 0
y(0, 0) = 0
For i = 1 To 1000
    x(i, 0) = i
    y(i, 0) = y(i - 1, 0) + WorksheetFunction.NormSInv(Rnd())
Next i

Charts.Add
ActiveChart.ChartType = xlXYScatterLinesNoMarkers
With ActiveChart.SeriesCollection
    If .Count = 0 Then .NewSeries
    If Val(Application.Version) >= 12 Then
        .Item(1).Values = y
        .Item(1).XValues = x
    Else
        .Item(1).Select
        Names.Add "_", x
        ExecuteExcel4Macro "series.x(!_)"
        Names.Add "_", y
        ExecuteExcel4Macro "series.y(,!_)"
        Names("_").Delete
    End If
End With
ActiveChart.ChartArea.Select

End Sub
</code>

Um método alternativo é atribuir nomes às matrizes (semelhante à solução alternativa acima) e, em seguida, definir a série para se referir aos nomes atribuídos. Isso funciona bem em todas as versões, desde que você salve no formato xls, mas parece haver uma limitação de comprimento para matrizes nomeadas de 8192 caracteres ao salvar nos novos formatos xlsx / xlsm / xlsb.

Não, os antigos comandos do Excel 4 não parecem funcionar em gráficos em versões posteriores, o que é irritante. lori_m
Por curiosidade, oExecuteExcel4Macro truque não funciona em 2007 e depois? Ele foi testado no Excel 2007 e o gráfico não contém dados. Jean-François Corbett
Ok, obrigado. +1 para a abordagem interessante / horrível! Jean-François Corbett
Eu não diria horrível - complicado talvez :) Mas eu não tenho certeza se há outra maneira, todos os recursos da web que eu encontrei disseram que isso não era possível em versões mais antigas. lori_m

Perguntas relacionadas