Отсутствует часть графика в VBA, когда 2 или более отдельных графиков строятся при использовании одних и тех же данных - PullRequest
1 голос
/ 11 февраля 2020

Когда я строю свой график, используя один набор данных (текущий 1), график показывает правильный вывод. Однако, когда я строю 2 набора данных одновременно (текущий 1 и текущий 2), часть графика отсутствует (обведено красным) для обоих данных, состоящих из текущего 1 и текущего 2. Кстати, данные одинаковы для обоих сценариев ios и данные отсутствуют. Поскольку мои данные для них огромны, я могу показать вам только ту часть моего образца данных, которая выглядит так, как показано ниже для текущего 1 и текущего 2. Я знаю, что код для построения графика графика current1 содержит только много переменных, которые вы все могут посчитать, что это вызывает проблему, поэтому позвольте мне уточнить, что значения totalsample1 и myarray должны быть правильными, так как именно они отвечают за данные (как показано в примере данных для current1) для построения графика для текущего и всех данных. для построения графика присутствуют в этом случае. Итак, что может быть кодом, который вызывает эту проблему и как ее исправить?

enter image description here enter image description here

Пример данных для текущего 1 enter image description here

Образец данных для текущего 2 enter image description here

1-е обновление: добавить wsf в диапазон и ячейки

2-е обновление: заменена активная диаграмма на cht1

3-е обновление: удалить из For i = 2 к итогу1 Шаг 1 до всей коллекции cht1.series

4-е обновление: я делаю более простую версию своего код для построения графика для текущего 1.

5-е обновление: и с использованием кода, предложенного @ Dy.Lee, идеальный график для тока 1 такой, как показано.

Private Sub addgraph_Vramp1()
  Application.ScreenUpdating = False
        Dim i As Long

    Dim wf As Workbook
    Set wf = ActiveWorkbook
    Dim wsf As Worksheet
    Set wsf = wf.Worksheets("current1")
     Dim shp1 As Shape
   Dim Cht1 As Chart

   Set shp1 = wsf.Shapes.AddChart
   Set Cht1 = shp1.Chart
    wsf.Activate
    With Cht1
   Cht1.SetSourceData Source:=wsf.Range("A1:BQ750")
   Cht1.ChartType = xlXYScatterSmoothNoMarkers
    Cht1.Axes(xlValue).ScaleType = xlLogarithmic
    Cht1.Axes(xlValue).MaximumScale = 0.001
    Cht1.Axes(xlValue).MinimumScale = 0.000000000000001
   End With

    With Cht1
        .Legend.Delete
        .Axes(xlCategory, xlPrimary).HasTitle = True
        .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Voltage"
        .Axes(xlValue, xlPrimary).HasTitle = True
        .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Current"
    End With

изменяется на график для текущего 1 после использования обновленных кодов

enter image description here

изменяется на график после удаления коллекции cht1.series (он все еще остается в обновленном коде только для пусть другие знают, что здесь убирается) enter image description here

Идеальный график :)))) enter image description here

1 Ответ

1 голос
/ 11 февраля 2020

Неправильный диапазон

     Cht1.SeriesCollection(i).XValues = wsf.Range(Cells(2, 2 * i - 1), wsf.Cells(myarray(i + 1), 2 * i - 1))

К

     Cht1.SeriesCollection(i).XValues = wsf.Range(wsf.Cells(2, 2 * i - 1), wsf.Cells(myarray(i + 1), 2 * i - 1))

Это пример создания диаграммы с использованием параметризованной процедуры.

Sub test()
    Dim Ws As Worksheet
    Dim Ws2 As Worksheet

    Set Ws = Sheets("current1")
    Set Ws2 = Sheets("current2")

    addgraph_Vramp1 Ws
    addgraph_Vramp1 Ws2

End Sub

Private Sub addgraph_Vramp1(Ws As Worksheet)

    Dim i As Long, c As Long
    Dim shp As Shape
    Dim Cht As Chart
    Dim rngDB As Range, rngX As Range, rngY As Range
    Dim Srs As Series

    Set rngDB = Ws.UsedRange

    c = rngDB.Columns.Count

    Set shp = Ws.Shapes.AddChart
    Set Cht = shp.Chart

    With Cht
        .ChartType = xlXYScatterSmoothNoMarkers
        .HasLegend = False
        For Each Srs In .SeriesCollection
            Srs.Delete
        Next Srs
        For i = 1 To c Step 2
            With Ws
                Set rngX = Ws.Range(.Cells(2, i), .Cells(2, i).End(xlDown))
                Set rngY = rngX.Offset(, 1)
            End With
            Set Srs = .SeriesCollection.NewSeries
            With Srs
                .XValues = rngX
                .Values = rngY
            End With
        Next i
        .Axes(xlValue).ScaleType = xlLogarithmic
        .Axes(xlValue).MaximumScale = 0.001
        .Axes(xlValue).MinimumScale = 0.000000000000001
        .Axes(xlCategory, xlPrimary).HasTitle = True
        .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Voltage"
        .Axes(xlValue, xlPrimary).HasTitle = True
        .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Current"
    End With

End Sub
...