Excel 2010 Макрос графиков построения VBA - PullRequest
2 голосов
/ 12 декабря 2011

Мне нужно построить линейный график набора данных. Я знаю столбец, содержащий временной ряд (C26 внизу), и я буду знать столбец данных от кнопки, вызывающей его, и строку, в которой начинаются данные (26). Метки будут в строке 26. Кнопка будет в строке 24. Данные не содержат пробелов.

На графике должна быть метка данных. Вот как далеко я продвинулся, любые предложения, пожалуйста, дайте мне знать! На данный момент он показывает только 1 относительно оси времени.

Sub GraphTest()
Dim xaxis As Range
Dim yaxis As Range
Dim fullRange As Range
Dim topcell As Range
Set xaxis = Range("$B$26", Range("$B$26").End(xlDown))
Set yaxis = ActiveSheet.Buttons(Application.Caller).TopLeftCell
Set yaxis = Range(Cells(yaxis.Row, yaxis.Column).Offset(2, 0), Cells(yaxis.Row, yaxis.Column).Offset(2, 0).End(xlDown))
Set topcell = ActiveSheet.Buttons(Application.Caller).TopLeftCell

Set fullRange = Union(xaxis, yaxis)
fullRange.Select
topcell.Activate
ActiveSheet.Shapes.AddChart.Select
ActiveChart.ChartType = xlLine
ActiveChart.SetSourceData Source:=fullRange
End Sub()

Ответы [ 2 ]

4 голосов
/ 13 декабря 2011

Все становится намного проще, если вы создаете и управляете своей серией индивидуально, а не добавляете сразу весь набор данных с помощью SetSourceData.Пример:

Dim xaxis As Range
Dim yaxis As Range
Set xaxis = Range("$B$26", Range("$B$26").End(xlDown))
Set yaxis = Range("$C$26", Range("$C$26").End(xlDown))

Dim c As Chart
Set c = ActiveWorkbook.Charts.Add
Set c = c.Location(Where:=xlLocationAsObject, Name:="Sheet1")
With c
    .ChartType = xlLine
    ' set other chart properties
End With

Dim s As Series
Set s = c.SeriesCollection.NewSeries
With s
    .Values = yaxis
    .XValues = xaxis
    ' set other series properties
End With

EDIT

Так называемые «линейные графики» не всегда ведут себя так, как вы ожидаете.Это наглядный пример.Когда время находится на оси x и оно отформатировано как дд / мм / гггг чч: мм, линейные диаграммы вынуждают все точки с одинаковой датой (днем) в одну и ту же ячейку, независимо от времени суток.Почему они сделали это так?Я понятия не имею.Линейные графики делают все другие сумасшедшие вещи.

Я почти уверен, что вам нужен точечный график.Фактически, то, что вы хотите, это почти всегда точечный график и почти никогда не линейный график.

Вот пример.Я сделал свои собственные данные о температуре, но сохранил ваши даты.

enter image description here

Произведено с использованием этого кода:

Dim xaxis As Range
Dim yaxis As Range
Set xaxis = Range("$B$26", Range("$B$26").End(xlDown))
Set yaxis = Range("$C$26", Range("$C$26").End(xlDown))

Dim c As Chart
Set c = ActiveWorkbook.Charts.Add
Set c = c.Location(Where:=xlLocationAsObject, Name:="Sheet1")
With c
    .ChartType = xlXYScatterLines 'A scatter plot, not a line chart! 
    ' set other chart properties
End With

Dim s As Series
Set s = c.SeriesCollection.NewSeries
With s
    .Values = yaxis
    .XValues = xaxis
    ' set other series properties
End With

With c.Axes(xlCategory)
    .MajorUnit = 0.125
End With

With c
    .Axes(xlCategory, xlPrimary).HasTitle = True
    .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Time"
    .Axes(xlValue, xlPrimary).HasTitle = True
    .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Temperature"
    .HasLegend = False
End With
1 голос
/ 19 декабря 2011

Никогда не получалось, чтобы это работало слишком хорошо, но вот решения, с которыми мне пришлось столкнуться,

Sub Graph()
Dim xaxis As Range
Dim yaxis As Range
Dim temp As Range

Dim total As Range

Set yaxis = ActiveSheet.Buttons(Application.Caller).TopLeftCell
yaxis.Select

Set yaxis = Range(Cells(yaxis.Row, yaxis.Column), Cells(yaxis.Row, yaxis.Column))
yaxis.Select
Set temp = yaxis

yaxis.Offset(2, 0).Select

ActiveCell.Activate
ActiveCell.Select
Do Until ActiveCell.Value = ""
ActiveCell.Offset(1, 0).Activate
Loop
Set yaxis = Range(yaxis.Offset(2, 0), ActiveCell.Offset(-1, 0))
yaxis.Select

Range("$b$26").Activate
Do Until ActiveCell.Value = ""
ActiveCell.Offset(1, 0).Activate
Loop
Set xaxis = Range("$b$26", ActiveCell.Offset(-1, 0))
xaxis.Select
Set total = Union(xaxis, yaxis)
total.Select
temp.Offset(2, 0).Activate
temp.Select
ActiveSheet.Shapes.AddChart.Select
ActiveChart.ChartType = xlXYScatterLines
ActiveChart.SetSourceData Source:=total
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...