Pregunta sobre arrays, excel, vba, range, charts – Crear gráfico a partir de datos de matriz y no rango

15

¿Es posible crear un gráfico (por ejemplo, un gráfico de líneas de doble eje Y) no a partir de rangos, sino a partir de datos de matriz? ¿Si es así, cómo?

@assylias Plus no vi la otra pregunta como si realmente hubiera sido respondida brettdj
@assylias: Eso no es un duplicado obvio ... El lenguaje es C #, no VBA. Los conceptos son prácticamente iguales, pero un ejemplo resuelto no se verá igual en absoluto. Jean-François Corbett
@ Jean-FrançoisCorbett De acuerdo: debería haber marcado como relacionado, no duplicado. assylias
@brettdj De acuerdo: debería haber marcado como relacionado, no duplicado. assylias

Tu respuesta

2   la respuesta
8

pero en versiones anteriores creo que hay un límite de 255 caracteres para la longitud de cada serie. Un método que he usado para solucionar esta restricción se muestra en el siguiente ejemplo de caminata aleatoria:

<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>

Un método alternativo es asignar nombres a las matrices (similar a la solución anterior) y luego configurar la serie para que haga referencia a los nombres asignados. Esto funciona bien en todas las versiones siempre que guarde en formato xls, pero parece haber una limitación de longitud para matrices con nombre de 8192 caracteres al guardar en los nuevos formatos xlsx / xlsm / xlsb.

No, los viejos comandos de Excel 4 no parecen funcionar en gráficos en versiones posteriores, lo cual es molesto. lori_m
No diría que es horrible, quizás enrevesado :) Pero no estoy seguro de que exista otra forma, todos los recursos web que pude encontrar dijeron que esto no era posible en versiones anteriores. lori_m
Por curiosidad, hace elExecuteExcel4Macro ¿El truco no funciona en 2007 y después? Lo probó en Excel 2007 y el gráfico no contiene datos. Jean-François Corbett
Vale gracias. +1 por el enfoque interesante / horrible! Jean-François Corbett
13

Sí. Puedes asignar matrices a laXValues yValues propiedades de unSeries Objeto en un gráfico. Ejemplo:

<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>
Increíble. Me quedo corregido. ja72
@lori_m estoy configurando unList<double> whatever.toArray() paraseries.Values y ejecutando Excel 2007 pero solo muestra 256 puntos. ¿Por qué? 16k sería suficiente (razones prácticas), por lo que no necesito hackear un número ilimitado usando matrices nx1 Mihai Bratulescu
@ ja72: ¿Definir "pequeño"? ... Lo probé con 16,000 puntos. Jean-François Corbett
Esto es un límite en el tamaño de los datos que puede hacer de esta manera. No puedo recordar lo que es, pero es pequeño. ja72
Es probable que @ ja72 se refiera a Excel 2003 y antes donde había una restricción de longitud. El tamaño de la cuadrícula también limita el tamaño de las matrices 1d a 256 o 16384 puntos en Excel 2003/2007 respectivamente. Para superar esto, puede definir los datos como una matriz vertical utilizandoapplication.transpose(mydata) (o declarando una matriz nx1 como en otra respuesta) lori_m

Preguntas relacionadas