Добавление меток к линейной диаграмме с помощью VBA

avatar
Wren
9 августа 2021 в 05:12
94
2
1

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

Sub addchart()

    If ActiveSheet.ChartObjects.Count > 0 Then
        ActiveSheet.ChartObjects.Delete
    End If
    
    Dim ws As Worksheet
    Dim ch As chart
    Dim ch1 As chart
    Dim dt As Range
     
    Dim i As Integer
    
    i = Cells(Rows.Count, "I").End(xlUp).Row
    
    Set ws = ActiveSheet
    Set dt = Range(Cells(2, 10), Cells(i, 10))
    Set ch = ws.Shapes.AddChart2(Width:=1300, Height:=300, Left:=Range("a13").Left, Top:=Range("a13").Top).chart
    
    
    With ch
        .SetSourceData Source:=dt
        .ChartTitle.Text = "Deflection Curve"
        .ChartType = xlLine
        .SeriesCollection(1).Name = "Deflection"
    End With
    
    If Application.WorksheetFunction.Min(dt) > -50 Then
    With ch.Axes(xlValue)
        .MinimumScale = -50
        .MaximumScale = 0
    End With
    End If
    
End Sub

Распечатанная диаграмма выглядит примерно так

chart

Я пытаюсь понять, как добавлять метки к произвольным точкам на диаграмме. Две метки, если быть точным. Один имеет минимальное значение. И один - это значение в любой произвольной точке на оси x. Оба значения x известны и будут взяты в качестве входных данных из двух ячеек на листе. Что-то вроде этого.

Something like this

Стиль выделения не имеет значения. Спасибо за помощь!

P.S. - Я новичок в VBA и всему учусь на ходу. Я смотрю, что мне нужно сделать, а затем пытаюсь подражать тем примерам, которые вижу в Интернете. Так что возможно, существующая программа, которую я написал для диаграммы, может иметь ненужные шаги или в некотором роде неэффективна. Я был бы признателен, если бы у кого-то были какие-либо советы, чтобы предложить, чтобы улучшить его, даже если он делает свою работу. Спасибо!

Источник

Ответы (2)

avatar
Wren
11 августа 2021 в 05:41
1
Sub addchart()

    If ActiveSheet.ChartObjects.Count > 0 Then
        ActiveSheet.ChartObjects.Delete
    End If
    
    Dim ws As Worksheet
    Dim ch As Chart
    Dim dt As Range
     
    Dim i As Integer
    
    i = Cells(Rows.Count, "I").End(xlUp).Row
    
    Set ws = ActiveSheet
    Set dt = Range(Cells(2, 10), Cells(i, 11))      ' Added another column with the relevant values to highlight line chart
    Set ch = ws.Shapes.AddChart2(Width:=1300, Height:=300, Left:=Range("a13").Left, Top:=Range("a13").Top).Chart
    
    
    With ch
        .SetSourceData Source:=dt
        .ChartTitle.Text = "Deflection Curve"
        .FullSeriesCollection(1).ChartType = xlLine
        .SeriesCollection(1).Name = "Deflection"
        .SeriesCollection(2).ChartType = xlColumnStacked       'the second column shows up as a bar chart along with the line chart
    End With
    
    If Application.WorksheetFunction.Min(Range(Cells(2, 10), Cells(i, 10))) > -30 Then
    With ch.Axes(xlValue)
        .MinimumScale = -30
        .MaximumScale = 0
    End With
    End If
    
End Sub
avatar
Capt.Krusty
9 августа 2021 в 06:49
1

Попробуйте для первых шагов сделать метки для диаграмм:

Dim chartname as string

chartname = "enter_a_name"

ActiveSheet.Shapes.AddChart2(227, xlLine).Name = chartname
    With ActiveSheet.Shapes(chartname).Line
        .Visible = msoTrue
        .ForeColor.RGB = RGB(0, 0, 0)
        .Transparency = 0
        .Weight = 1.5
    End With
        
Set my_chart = ActiveSheet.ChartObjects(chartname).Chart
    
    'Delete all Autolabels
    my_chart.SetElement (msoElementDataLabelNone)
    
    'Enter format of axis (just if you want to)
    'With my_chart.Axes(xlCategory)      ' axis adjustment
        '.CategoryType = xlCategoryScale ' not XlCategoryType.xlAutomaticScale | XlCategoryType.xlTimeScale
        '.TickLabels.NumberFormat = "DD.MM.YYYY hh:mm"
        '.TickLabels.Orientation = xlUpward
    'End With
    
    cols = Array("F", "L")              ' columns containing labels
    For j = 1 To my_chart.SeriesCollection.Count
        Set sc = my_chart.SeriesCollection(j)

        For i = 2 To sc.Points.Count
            sc.Points(i).ApplyDataLabels
            sc.Points(i).DataLabel.Text = Range(cols(j - 1) & i + x).Value ' x= starting row containing values /labels
        Next i
Wren
11 августа 2021 в 05:39
0

Спасибо за ответ, но мне было трудно его понять, так как я новичок в VBA. Но я нашел другое более простое решение, которое я опубликую