Pytanie w sprawie vba, charts, excel, range, arrays – Utwórz wykres z danych macierzy, a nie zakres

15

czy możliwe jest utworzenie wykresu (np. podwójnej linii osi Y) nie z zakresów, ale z danych macierzy? Jeśli tak to jak?

@brettdj Zgoda - Powinienem zostać oznaczony jako powiązany, a nie duplikowany. assylias
@ Jean-FrançoisCorbett Zgoda - Powinienem był oznaczyć jako powiązany, a nie duplikować. assylias
@assylias: To nie jest oczywisty duplikat ... Językiem jest C #, a nie VBA. Pojęcia są prawie takie same, ale wypracowany przykład nie będzie wyglądał tak samo. Jean-François Corbett
@assylias Plus nie widziałem innego pytania jako odpowiedzi brettdj

Twoja odpowiedź

2   odpowiedź
13

Tak. Możesz przypisać tablice doXValues iValues właściwości aSeries obiekt na wykresie. Przykład:

<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>
Niesamowite. Poprawiono mnie. ja72
@ ja72 odnosi się prawdopodobnie do programu Excel 2003 i wcześniejszych, w których istniało ograniczenie długości. Rozmiar siatki ogranicza również rozmiar macierzy 1d do 256 lub 16384 punktów w programie Excel 2003/2007. Aby przezwyciężyć ten problem, można zdefiniować dane jako pionową tablicę za pomocąapplication.transpose(mydata) (lub deklarowanie tablicy nx1 jak w innej odpowiedzi) lori_m
@ ja72: Zdefiniuj „mały”? ... Właśnie przetestowałem go z 16 000 punktów. Jean-François Corbett
@lori_m ustawiamList<double> whatever.toArray() dlaseries.Values i działa Excel 2007, ale wyświetla tylko 256 punktów. Czemu? Wystarczyłoby 16k (ze względów praktycznych), więc nie muszę zhakować nieograniczonej liczby przy użyciu tablic nx1 Mihai Bratulescu
Jest to ograniczenie rozmiaru danych, które możesz zrobić w ten sposób. Nie pamiętam, co to jest, ale jest małe. ja72
8

ale w poprzednich wersjach uważam, że długość każdej serii ma limit 255 znaków. Metoda, której użyłem do obejścia tego ograniczenia, jest pokazana w następującym losowym przykładzie:

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

Alternatywną metodą jest przypisanie nazw do tablic (podobnie jak w powyższym obejściu), a następnie ustawienie serii na nazwy przypisane. Działa to poprawnie we wszystkich wersjach, o ile zapisujesz w formacie xls, ale wydaje się, że istnieje ograniczenie długości nazwanych tablic o długości 8192 znaków podczas zapisywania do nowych formatów xlsx / xlsm / xlsb.

Nie powiedziałbym okropnie - może zawiłe :) Ale nie jestem pewien, czy jest inny sposób, wszystkie zasoby internetowe, które znalazłem, powiedziały, że nie było to możliwe w starszych wersjach. lori_m
Ok dzięki. +1 za ciekawe / okropne podejście! Jean-François Corbett
Z ciekawości robiExecuteExcel4Macro sztuczka nie działa w 2007 i później? Wypróbowano go w programie Excel 2007, a wykres nie zawiera danych. Jean-François Corbett
Żadne stare polecenia Excel 4 nie działają na wykresach w późniejszych wersjach, co jest denerwujące. lori_m

Powiązane pytania