我希望使用VBA在Excel 2010上格式化多个选定的图表。无论我选择一个还是多个图表,我都希望代码能够正常工作。当只选择一个图表但是当选择了多个图表时,下面的代码可以工作,我得到一个"运行时错误' 91'对象变量或With Block变量未设置"。知道如何为所选图表的数量运行宏吗?
Sub ChartFormat5_Click()
''Adjust chart area
ActiveChart.ChartArea.Select
'Size
Selection.Width = 631.9
Selection.Height = 290.1
'Border
With Selection.Format.Line
.Visible = msoTrue
.ForeColor.ObjectThemeColor = msoThemeColorText1
.ForeColor.TintAndShade = 0
.ForeColor.Brightness = 0
.Transparency = 0
.Weight = 1
.DashStyle = msoLineSolid
End With
'Font
With Selection.Format.TextFrame2.TextRange.Font
.Name = "Calibri"
.Size = 10
.Fill.Visible = msoTrue
.Fill.ForeColor.ObjectThemeColor = msoThemeColorText1
.Fill.ForeColor.TintAndShade = 0
.Fill.ForeColor.Brightness = 0
.Fill.Transparency = 0
.Fill.Solid
End With
''Adjust axis alignment and format
ActiveChart.Axes(xlCategory).Select
With Selection.Format.Line
.Visible = msoTrue
.ForeColor.ObjectThemeColor = msoThemeColorText1
.ForeColor.TintAndShade = 0
.ForeColor.Brightness = 0
.Transparency = 0
End With
ActiveChart.Axes(xlCategory).TickLabelSpacing = 1
ActiveChart.Axes(xlCategory).TickLabels.Orientation = 45
ActiveChart.Axes(xlValue).Select
Selection.TickLabels.NumberFormat = "#,##0_);(#,##0)"
With Selection.Format.Line
.Visible = msoTrue
.ForeColor.ObjectThemeColor = msoThemeColorText1
.ForeColor.TintAndShade = 0
.ForeColor.Brightness = 0
.Transparency = 0
End With
ActiveChart.Axes(xlValue).AxisTitle.Select
Selection.Left = 1.5
Selection.Format.Line.Visible = msoFalse
''Adjust legend box
ActiveChart.Legend.Select
With Selection.Format.Fill
.Visible = msoTrue
.ForeColor.RGB = RGB(255, 255, 255)
.Transparency = 0
.Solid
End With
With Selection.Format.Line
.Visible = msoTrue
.ForeColor.ObjectThemeColor = msoThemeColorBackground1
.ForeColor.TintAndShade = 0
.ForeColor.Brightness = -0.5
.Transparency = 0
End With
Selection.Left = 124
Selection.Top = 67
''Adjust plot area size and format
ActiveChart.PlotArea.Select
'Borders
With Selection.Format.Line
.Visible = msoTrue
.ForeColor.ObjectThemeColor = msoThemeColorText1
.ForeColor.TintAndShade = 0
.ForeColor.Brightness = 0
.Transparency = 0
.Weight = 0.75
.DashStyle = msoLineSolid
End With
'Size
Selection.Width = ActiveChart.ChartArea.Width - 30.4
Selection.Height = ActiveChart.ChartArea.Height - 8.5
Selection.Top = 4
Selection.Left = 20
'Gridlines
ActiveChart.Axes(xlValue).MajorGridlines.Select
With Selection.Format.Line
.Visible = msoTrue
.ForeColor.ObjectThemeColor = msoThemeColorText1
.ForeColor.TintAndShade = 0
.ForeColor.Brightness = 0
.Transparency = 0
End With
With Selection.Format.Line
.Visible = msoTrue
.DashStyle = msoLineDash
End With
End Sub
答案 0 :(得分:1)
这将处理活动图表或所有选定图表。第一个例程确定要处理的内容(活动图表或选定图表)和第二个例程。
Sub FormatCharts()
Dim obj As Object
If Not ActiveChart Is Nothing Then
FormatOneChart ActiveChart
Else
For Each obj In Selection
If TypeName(obj) = "ChartObject" Then
FormatOneChart obj.Chart
End If
Next
End If
End Sub
Sub FormatOneChart(cht As Chart)
' do all your formatting here, based on cht not on ActiveChart
End Sub
不要选择图表的某些部分,只需完全引用它们即可。而不是
ActiveChart.ChartArea.Select
With Selection.Format.Line
使用此
With cht.ChartArea.Format.Line
等
答案 1 :(得分:0)
刚开始回答有关stackoverflow的问题,所以我希望这会帮助你。
由于您一次选择了多个图表,因此您应该废弃ActiveChart.ChartArea.Select
只需遍历当前选择中的每个ChartObject,如下所示:
Sub ChartFormat5_Click()
Dim cObject As ChartObject
For Each cObject In Selection
With cObject
'Do all your stuff here... E.g.
.Chart.PlotArea.Width = 631.9
End With
Next cObject
End Sub