2012-05-13 22 views
15

¿es posible crear un gráfico (por ejemplo, gráfico de línea de eje Y doble) no desde rangos, sino desde datos de matriz? ¿Si es así, cómo?Crear gráfico a partir de datos de matriz y no en el rango

+0

posible duplicado de [Para establecer los datos dinámicos del gráfico de Excel en el tiempo de ejecución y no Excel.Range] (http://stackoverflow.com/questions/7380266/to-set-dynamic-data-of-excel-chart-at -runtime-and-not-excel-range) – assylias

+1

@assylias: Ese no es un duplicado obvio ... El lenguaje es C#, no VBA. Los conceptos son prácticamente los mismos, pero un ejemplo resuelto no se verá del todo igual. –

+0

@assylias Además, no vi la otra pregunta como realmente respondida – brettdj

Respuesta

13

Sí. Puede asignar matrices a las propiedades XValues y Values de un objeto Series en un gráfico. Ejemplo:

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

Este es un límite en el tamaño de los datos que puede hacer de esta manera. No recuerdo qué es, pero es pequeño. – ja72

+4

@ ja72: ¿Definir "pequeño"? ... Acabo de probarlo con 16,000 puntos. –

+0

Impresionante. Estoy corregido. – ja72

8

Puede asignar matrices para trazar la serie en Excel 2007 en adelante, pero en versiones anteriores Creo que hay un límite de 255 caracteres para la longitud de cada serie. Un método que he utilizado para evitar esta restricción se muestra en el siguiente ejemplo de paseo aleatorio:

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 

Un método alternativo es asignar nombres a las matrices (similares a solución anterior) y luego configurar la serie para referirse 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 las matrices con nombre de 8192 caracteres al guardar en los nuevos formatos xlsx/xlsm/xlsb.

+0

Por curiosidad, ¿el truco 'ExecuteExcel4Macro' no funciona en 2007 y más tarde? Lo probó en Excel 2007 y el cuadro no contiene datos. –

+0

No parece que los antiguos comandos de Excel 4 funcionen en los gráficos en versiones posteriores, lo cual es molesto. –

+0

Ok, gracias. +1 para el enfoque interesante/horrible! –

Cuestiones relacionadas