当使用相同数据绘制 2 个或更多单独的图形时,VBA 中图形的缺失部分

Missing portion of the graph in VBA when 2 or more separate graphs are plotted when same data are used

当我使用一组数据(当前 1)绘制图表时,图表显示了正确的输出。但是,当我同时绘制 2 组数据(当前 1 和当前 2)时,对于由当前 1 和当前 2 组成的两个数据,图形的一部分丢失(用红色圈出)。顺便说一句,两种情况下的数据都相同,并且没有数据丢失。由于我的数据量很大,我只能向您展示我的数据样本的一部分,如下所示,当前 1 和当前 2。我知道绘制 current1 图形的代码只包含很多变量,您所有人都可能认为是导致问题的原因,所以让我澄清一下 totalsample1 和 myarray 值应该是正确的,因为它们负责数据(如 current1 的数据示例中显示的数据),用于绘制当前和所有数据的图形在这种情况下存在用于绘图。那么导致此问题的代码可能是什么以及如何解决它?

当前 1 的数据样本

当前 2 的数据样本

第一个 update:add wsf 到范围和单元格

第二次更新:用 cht1 替换了 activechart

第三次更新:从 For i = 2 到 totalsample1 Step 1 中删除,直到所有 cht1.series 集合

第四次更新:我制作了一个更简单的代码版本来绘制当前 1 的图表。

第五次更新:使用@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 的图表发生变化

删除 cht1.series 集合后图表的变化(它仍然保留在更新的代码中只是为了让其他人知道这里删除了什么)

理想图:))))

捕捉到错误的范围

     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