【问题标题】:VBA: Formatting Multiple Selected ChartsVBA:格式化多个选定的图表
【发布时间】:2016-01-30 22:24:50
【问题描述】:

我希望使用 VBA 在 Excel 2010 上格式化多个 选定 图表。下面的代码在仅选择一个图表但选择多个图表时有效,我收到“运行时错误'91'对象变量或未设置块变量”。知道如何针对选定图表的数量运行宏吗?

Sub ChartFormat5_Click()


''Adjust chart area

'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


End Sub

谢谢!

【问题讨论】:

    标签: vba excel charts


    【解决方案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
    

    等等

    注意:这是VBA: Formatting Multiple Selected Charts (Chart, Plot, Legend, etc.)的副本

    【讨论】:

      【解决方案2】:

      经过反复试验,如果您只选择了一个或多个图表,我想出了如何让它发挥作用。这很简单,但是当我测试它时这很有效。

      请注意,我将实际的图表区域格式分解为一个单独的子项。

      Sub ChartFormat5_Click()
      
          Select Case TypeName(Selection)
      
              Case Is = "ChartArea" `only 1 selected
      
                  FormatChart Selection
      
              Case Is = "DrawingObjects" 'more than 1 selected
      
                  Dim cht As ChartObject
                  For Each cht In Selection
                      FormatChart cht.Chart.ChartArea
                  Next
      
          End Select
      
      End Sub
      
      Sub FormatChart(chtArea As ChartArea)
      
      With chtArea
      
          'size
          .Width = 631.9
          .Height = 290.1
      
          With .Format
              'Border
              With .Line
                  .Visible = msoTrue
                  .ForeColor.ObjectThemeColor = msoThemeColorText1
                  .ForeColor.TintAndShade = 0
                  .ForeColor.Brightness = 0
                  .Transparency = 0
                  .Weight = 1
                  .DashStyle = msoLineSolid
              End With
      
              'Font
              With .TextFrame2.TextRange.Font
                  .Name = "Calibri"
                  .Size = 10
                  With .Fill
                      .Visible = msoTrue
                      With .ForeColor
                          .ObjectThemeColor = msoThemeColorText1
                          .TintAndShade = 0
                          .Brightness = 0
                      End With
                      .Transparency = 0
                      .Solid
                  End With
              End With
          End With
      End With
      
      End Sub
      

      【讨论】:

      • Scott - 这很好用!但是,如果我只尝试为一个选定的图表(即 5 个图表中的 1 个)运行宏,现在我遇到了麻烦......感谢您的帮助!
      • @JKo_FinanceUse - 你看到我在代码中关于'change ws.ChartObjects to "Selection的评论了吗
      • stackoverflow.com/users/1569536/scott-holtzman - 是的,所以我用 Selection 替换了 ws.ChartObjects 但是当我尝试运行单个选定的图表时,我得到一个运行时错误“438”对象不支持此属性或方法。实际上,我收到错误消息的行是“For Each cht In Selection”。
      • @JKo_FinanceUse - 查看我编辑的答案。它比我想象的要复杂一些,而且它可能有点像 hack,但是当我测试这两种条件时它就起作用了。
      • stackoverflow.com/users/1569536/scott-holtzman 还有一个问题 Scott。假设我也想格式化绘图区域、轴、图例等。我将如何调整上面的代码来执行这个?请检查上面的修改后的代码。谢谢。
      【解决方案3】:

      试试吧:

      Sub ChartFormat5_Click_v02()
      
        For i = 1 To Application.Sheets.Count
      
          Application.Sheets(i).Activate
      
          For j = 1 To ActiveSheet.ChartObjects.Count
      
              ActiveSheet.ChartObjects(j).Activate
      
      
              'your code here
      
          Next j
      
        Next i
      
      End Sub
      

      【讨论】:

      • Andre - 看起来它只选择了工作表中的最后一个图表...我想只为我选择的那些图表自动格式化
      • 实际上,此脚本格式化所有工作表中的所有图表。如果您只想格式化选定的图表,@Scott Holtzman 的答案是更好的选择。
      猜你喜欢
      • 1970-01-01
      • 2018-11-27
      • 2021-08-07
      • 1970-01-01
      • 2017-07-18
      • 1970-01-01
      • 2021-03-15
      • 1970-01-01
      • 2014-04-09
      相关资源
      最近更新 更多