Excel 在VBA中创建图表时,如何确定Y轴上包含哪些数据

Excel 在VBA中创建图表时,如何确定Y轴上包含哪些数据,excel,vba,Excel,Vba,我使用vba创建具有动态范围的图表,excel会自动选择是否使用数据行或数据列根据数据集的相对尺寸为图表创建“系列”(参见图片)。如何预先确定“序列”的y值始终是同一行中的数据,而不是同一列中的数据。 ![不正确]: ![正确]: 第一篇文章,为格式错误道歉等 确认数据范围正确。几乎100%可以肯定这是因为在错误的场景中,行多于列,因此它默认使用一列中的值,而不是一行中的值 Set rng = Selection Sheet9.Activate ActiveSheet.Shap

我使用vba创建具有动态范围的图表,excel会自动选择是否使用数据行或数据列根据数据集的相对尺寸为图表创建“系列”(参见图片)。如何预先确定“序列”的y值始终是同一行中的数据,而不是同一列中的数据。 ![不正确]: ![正确]:

第一篇文章,为格式错误道歉等

确认数据范围正确。几乎100%可以肯定这是因为在错误的场景中,行多于列,因此它默认使用一列中的值,而不是一行中的值

Set rng = Selection

    Sheet9.Activate
    ActiveSheet.Shapes.AddChart2(-1, xlLine, , , WorksheetFunction.max(500, 1.7 * lcol)).Select

    With ActiveChart
        .SetSourceData Source:=rng
        .FullSeriesCollection(1).XValues = Sheet10.Range(Sheet10.Cells(5, 3), Sheet10.Cells(5, lcol2))

        .SetElement (msoElementPrimaryCategoryAxisTitleAdjacentToAxis)
        .SetElement (msoElementPrimaryValueAxisTitleAdjacentToAxis)

        .HasTitle = True
        .ChartTitle.Text = "Equipment Utilization (Weekly)"
        .Axes(xlCategory, xlPrimary).HasTitle = True
        .Axes(xlCategory, xlPrimary).AxisTitle.Text = "Date"
        .Axes(xlValue, xlPrimary).HasTitle = True
        .Axes(xlValue, xlPrimary).AxisTitle.Text = "Utilization"
        .HasLegend = True
        .Axes(xlCategory).Select
        Selection.TickLabels.Orientation = xlUpward

        .Axes(xlSecondary).TickLabels.NumberFormat = "0.0%"
        .Axes(xlValue).MaximumScale = 1

    End With

尝试以下操作:
ActiveChart.SetSourceData:=ActiveSheet.range(“A5:E15”),绘图者:=xlColumns


来源:

试试这个:
ActiveChart.SetSourceData:=ActiveSheet.range(“A5:E15”),绘图者:=xlColumns


来源:

你可以试试这个。由于我没有您的数据,您可能仍然需要对此进行一些修改。此外,您应该使用XY散点图(这就是我使用的)。最后,在编写代码时使用selection和select是不好的做法。尝试将其修改为不使用这些

Sub Test()
    Dim rng As Range
    Dim sht As Worksheet

    Dim intI As Integer
    Dim strSheet As String
    Dim lCol As Long
    Dim lCol2 As Long
    Dim lRow As Long
    Dim lRow2 As Long

    strSheet = "Sheet1"
    Set sht = ThisWorkbook.Worksheets(strSheet)

    Set rng = sht.Range("D5")
    lCol = rng.Column
    lCol2 = sht.Range(sht.Cells(rng.Row, _
                      sht.Columns.Count).Address).End(xlToLeft).Column
    lRow = rng.Row + 3 '3 is the offset from D5!
    lRow2 = sht.Range(sht.Cells(sht.Rows.Count, _
                      rng.Column).Address).End(xlUp).Row

    sht.Shapes.AddChart2 -1, xlXYScatterLines, , , _
                         WorksheetFunction.Max(500, 1.7 * lCol)

    With sht.Shapes(sht.Shapes.Count).Chart
        '.SetSourceData Source:=Rng
        For intI = lCol To lCol2
            .SeriesCollection.NewSeries
            .FullSeriesCollection(1).XValues = _
                       sht.Range(sht.Cells(rng.Row, lCol), sht.Cells(rng.Row, lCol2))
            .FullSeriesCollection(1).Values = _
                       sht.Range(sht.Cells(lRow, intI), sht.Cells(lRow2, intI))
        Next intI

        .SetElement msoElementPrimaryCategoryAxisTitleAdjacentToAxis
        .SetElement msoElementPrimaryValueAxisTitleAdjacentToAxis

        .HasTitle = True
        .ChartTitle.Text = "Equipment Utilization (Weekly)"
        .Axes(xlCategory, xlPrimary).HasTitle = True
        .Axes(xlCategory, xlPrimary).AxisTitle.Text = "Date"
        .Axes(xlValue, xlPrimary).HasTitle = True
        .Axes(xlValue, xlPrimary).AxisTitle.Text = "Utilization"
        .HasLegend = True
        .Axes(xlCategory).TickLabels.Orientation = xlUpward

        '.Axes(xlSecondary).TickLabels.NumberFormat = "0.0%"
        '.Axes(xlValue).MaximumScale = 1

    End With

    Set rng = Nothing
    Set sht = Nothing

End Sub

你可以试试这个。由于我没有您的数据,您可能仍然需要对此进行一些修改。此外,您应该使用XY散点图(这就是我使用的)。最后,在编写代码时使用selection和select是不好的做法。尝试将其修改为不使用这些

Sub Test()
    Dim rng As Range
    Dim sht As Worksheet

    Dim intI As Integer
    Dim strSheet As String
    Dim lCol As Long
    Dim lCol2 As Long
    Dim lRow As Long
    Dim lRow2 As Long

    strSheet = "Sheet1"
    Set sht = ThisWorkbook.Worksheets(strSheet)

    Set rng = sht.Range("D5")
    lCol = rng.Column
    lCol2 = sht.Range(sht.Cells(rng.Row, _
                      sht.Columns.Count).Address).End(xlToLeft).Column
    lRow = rng.Row + 3 '3 is the offset from D5!
    lRow2 = sht.Range(sht.Cells(sht.Rows.Count, _
                      rng.Column).Address).End(xlUp).Row

    sht.Shapes.AddChart2 -1, xlXYScatterLines, , , _
                         WorksheetFunction.Max(500, 1.7 * lCol)

    With sht.Shapes(sht.Shapes.Count).Chart
        '.SetSourceData Source:=Rng
        For intI = lCol To lCol2
            .SeriesCollection.NewSeries
            .FullSeriesCollection(1).XValues = _
                       sht.Range(sht.Cells(rng.Row, lCol), sht.Cells(rng.Row, lCol2))
            .FullSeriesCollection(1).Values = _
                       sht.Range(sht.Cells(lRow, intI), sht.Cells(lRow2, intI))
        Next intI

        .SetElement msoElementPrimaryCategoryAxisTitleAdjacentToAxis
        .SetElement msoElementPrimaryValueAxisTitleAdjacentToAxis

        .HasTitle = True
        .ChartTitle.Text = "Equipment Utilization (Weekly)"
        .Axes(xlCategory, xlPrimary).HasTitle = True
        .Axes(xlCategory, xlPrimary).AxisTitle.Text = "Date"
        .Axes(xlValue, xlPrimary).HasTitle = True
        .Axes(xlValue, xlPrimary).AxisTitle.Text = "Utilization"
        .HasLegend = True
        .Axes(xlCategory).TickLabels.Orientation = xlUpward

        '.Axes(xlSecondary).TickLabels.NumberFormat = "0.0%"
        '.Axes(xlValue).MaximumScale = 1

    End With

    Set rng = Nothing
    Set sht = Nothing

End Sub

为什么需要
SetSourceData
FullSeriesCollection(1)
?为什么不直接用
SetSourceData
设置图表范围并使用它呢?我在录制宏时得到的结果是,X轴标签不紧靠正在绘制的数据(请参见任一图像)为什么需要
SetSourceData
FullSeriesCollection(1)
?为什么不直接用
SetSourceData
设置图表范围并完成它呢?我在录制宏时得到的结果是,X轴标签不会紧靠正在绘制的数据(请参见任一图像)。感谢IAmNerd2000的响应,创建新数据系列的循环会将事情清理干净。感谢“最佳编码实践”的反馈!感谢IAmNerd2000的响应,创建新数据系列的循环将事情清理干净。感谢“最佳编码实践”的反馈!