Excel 在VBA中创建图表时,如何确定Y轴上包含哪些数据
我使用vba创建具有动态范围的图表,excel会自动选择是否使用数据行或数据列根据数据集的相对尺寸为图表创建“系列”(参见图片)。如何预先确定“序列”的y值始终是同一行中的数据,而不是同一列中的数据。 ![不正确]: ![正确]: 第一篇文章,为格式错误道歉等 确认数据范围正确。几乎100%可以肯定这是因为在错误的场景中,行多于列,因此它默认使用一列中的值,而不是一行中的值Excel 在VBA中创建图表时,如何确定Y轴上包含哪些数据,excel,vba,Excel,Vba,我使用vba创建具有动态范围的图表,excel会自动选择是否使用数据行或数据列根据数据集的相对尺寸为图表创建“系列”(参见图片)。如何预先确定“序列”的y值始终是同一行中的数据,而不是同一列中的数据。 ![不正确]: ![正确]: 第一篇文章,为格式错误道歉等 确认数据范围正确。几乎100%可以肯定这是因为在错误的场景中,行多于列,因此它默认使用一列中的值,而不是一行中的值 Set rng = Selection Sheet9.Activate ActiveSheet.Shap
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的响应,创建新数据系列的循环将事情清理干净。感谢“最佳编码实践”的反馈!