Для построения диаграммы на основе динамических пользовательских диапазонов - PullRequest
0 голосов
/ 11 февраля 2019

Цель состоит в том, чтобы построить значения против column A (ось X).Пользователь выбирает имя столбца в ячейке G4, значения G4 могут быть B, C, C, D.На основе названия столбца должна быть построена диаграмма.

enter image description here

Мне удалось написать следующий код, который выбирает данные, но я не могу выбратьданные динамически.

Sub Chart()

Dim Lastrow As Long
Dim TimeAxis As Range
Dim Values As Range
Dim cht As Object

Lastrow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
TimeAxis = Range("A1:A" & Lastrow).Select '<----- X Axis (Static) 
Values = Range("B1:B" & Lastrow).Select  '<----- User selected as per cell G4 (Dynamic)     

'Plot TimeAxis Vs Values

Set cht = ActiveSheet.Shapes.AddChart2
cht.Chart.SetSourceData Source:=rng    '<------ User Range (Dynamic)
cht.Chart.ChartType = xlXYScatterLines

End Sub

1 Ответ

0 голосов
/ 11 февраля 2019

Обратите внимание, что переменные подсчета строк должны иметь тип Long, поскольку в Excel больше строк, чем может обработать Integer: Dim Lastrow As Long.Я рекомендую всегда использовать Long вместо Integer в VBA, поскольку в Integer вообще нет никакой выгоды.

Вы должны использовать Set TimeAxis (поскольку диапазоны являются объектами) и удалить .Select.Также см. Как избежать использования Select в Excel VBA .

Наконец Set ваш rng в противном случае он пуст и вы не можете использовать его в Source:=rng.

Таким образом, вы получите что-то вроде:

Option Explicit

Sub GenerateChart() 'dont use "chart" as procedure name it is a type in VBA and therefore a reserved word
    Dim LastRow As Long
    LastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row

    Dim TimeAxis As Range
    Set TimeAxis = Range("A2:A" & LastRow) 'X Axis values start at A2!!!

    Dim SelCol As String
    SelCol = ActiveSheet.Range("G4") 'read column name from G4

    Dim Values As Range
    Set Values = Range(SelCol & "1:" & SelCol & LastRow)  '<----- User selected as per cell G4 (Dynamic)

    'Plot TimeAxis Vs Values

    Dim cht As Object
    Set cht = ActiveSheet.Shapes.AddChart2
    cht.Chart.SetSourceData Source:=Values    '<------ User Range (Dynamic)
    cht.Chart.FullSeriesCollection(1).XValues = TimeAxis 'x axis values
    cht.Chart.ChartType = xlXYScatterLines
End Sub
...