Я довольно новичок в VBA, поэтому мой предоставленный код может быть далеко не оптимизирован. Однако я был бы рад услышать, что можно улучшить!
У меня есть лист с двумя столбцами данных, одной ячейкой для записи, точечной диаграммой и тремя кнопками. Предполагается, что диаграмма просто отображает два столбца и добавляет значение ячейки ввода в виде вертикальной линии. Одна кнопка предназначена для обновления графика (например, для настройки осей). Другой должен показать пример, вставив некоторые данные, хранящиеся на другом скрытом листе, в два столбца, а также в ячейку ввода, и после этого обновите диаграмму. Предполагается, что последняя кнопка просто сбрасывает лист, так что столбцы данных и ячейка ввода пусты, а диаграмма должна быть скрыта.
Проблема: Однако кнопка обновления не работает. Похоже, изменить размер поля просмотра диаграммы в соответствии с вновь введенными данными. Но числа, показанные на оси Y, всегда 0,05. Я предоставил картинку, чтобы показать вам, что я имею в виду:
![Chart](https://i.imgur.com/2ISWCVV.jpg)
Когда я нажимаю кнопку примера, ось y показывает правильные значения. Я попытался сначала скопировать данные в столбцах на другой лист, затем обновить диаграмму и затем вставить данные обратно в столбцы, но безуспешно.
Я заметил, что когда на диаграмме отображается только 0,05, и я нажимаюна графике, чтобы «выбрать данные» и просто выбрать вторую серию, значения y изменятся на то, что они должны быть, и я могу закрыть окно, и оно останется в порядке, пока я снова не нажму кнопку обновления.
Может быть, в моем коде есть недостатки, о которых я не знаю? Может быть, мне нужно вместо обновления диаграммы удалить старую и каждый раз создавать новую? Однако я уже попробовал это с тем же результатом. Может быть, код должен быть написан в другой последовательности?
Пример кнопки:
Private Sub ExampleBtn_Click()
Call RefreshBtn_Click
Range("C5:D27").ClearContents 'data columns
Range("C5:D14").Value = Sheets("ExampleSheet").Range("A1:B10").Value
Range("O3").Value = 3.5 'entry cell
End Sub
Кнопка сброса:
Private Sub ResetBtn_Click()
ActiveSheet.ChartObjects(1).Visible = False
Range("C5:D27").ClearContents 'data columns
Range("O3").ClearContents 'entry cell
Range("C5").Select
End Sub
Кнопка обновления:
Private Sub RefreshBtn_Click()
ActiveSheet.Unprotect
Application.ScreenUpdating = False
ActiveSheet.ChartObjects(1).Visible = True
'range of Nachdruckzeit
Set zeit = Range("C5:C27")
'range of Masse
Set masse = Range("D5:D27")
yMax = Application.WorksheetFunction.max(Range("D5:D27")) + 0.02
yMin = Application.WorksheetFunction.min(Range("D5:D27")) - 0.02
'refresh the chart
With ActiveSheet.ChartObjects(1)
.Width = Range("F5:P30").Width
.Height = Range("F5:P30").Height
If .Chart.SeriesCollection.Count = 1 Then
.Chart.SeriesCollection(1).Delete
ElseIf .Chart.SeriesCollection.Count = 2 Then
.Chart.SeriesCollection(2).Delete
.Chart.SeriesCollection(1).Delete
End If
With .Chart.SeriesCollection.NewSeries
.XValues = zeit
.Values = masse
.Name = "Siegelpunktermittlung"
.HasDataLabels = False
End With
t = Range("O3").Value 'entry cell
With .Chart.SeriesCollection.NewSeries
.Name = "gewaehlt"
.XValues = Array(t, t)
.Values = Array(0, yMax)
.MarkerStyle = xlMarkerStyleNone
.Border.Color = vbWhite
End With
End With
'Cosmetics
With ActiveSheet.ChartObjects(1).Chart
.HasLegend = False
.ChartArea.Format.Fill.Visible = msoFalse
.PlotArea.Format.Fill.Visible = msoFalse
.SeriesCollection(1).MarkerStyle = xlMarkerStyleCircle
.SeriesCollection(1).Format.Fill.ForeColor.RGB = RGB(251, 243, 223)
.SeriesCollection(1).Format.Line.ForeColor.RGB = RGB(255, 140, 0)
.SeriesCollection(1).MarkerForegroundColorIndex = -4142
'x-axis
With .Axes(xlCategory)
.HasTitle = True
.TickLabels.Font.Color = vbWhite
.AxisTitle.Font.Size = 12
.AxisTitle.Font.Color = vbWhite
.AxisTitle.Caption = "Nachdruckzeit [s]"
End With
'y-axis
With .Axes(xlValue)
.HasTitle = True
.MinimumScale = yMin
.MaximumScale = yMax
.TickLabels.Font.Color = vbWhite
.AxisTitle.Font.Size = 12
.AxisTitle.Font.Color = vbWhite
.AxisTitle.Caption = "Masse [g]"
End With
End With
Application.ScreenUpdating = True
ActiveSheet.Protect
End Sub