使用VBA更改Excel图表的方向(纵向或横向)

时间:2012-02-15 17:46:49

标签: vba layout graph charts excel-vba

我正在尝试编写一个宏来自动打印我使用另一个宏在工作簿中创建的所有图表。 (几百个)我遇到的问题是我无法弄清楚如何使用VBA将图形从纵向布局更改为横向布局。我想知道是否有人可以帮助我。我尝试了下面的代码,但它在行“.ChartObjects(x).PageSetup.Orientation = xlLandscape”中给出了一个错误。我理解对于图表对象,这不是正确的属性,但我无法弄清楚是什么否则就是。

任何帮助将不胜感激!

Option Explicit

Sub Print_All_Charts()
    Dim szASheet As String
    szASheet = ActiveSheet.Name

    Dim lChartObjCount As Long
    lChartObjCount = ActiveSheet.ChartObjects.Count

    With Application
        .ScreenUpdating = False

        .ActivePrinter = "HP Color LaserJet 5550 PS on Ne08:"

        'On Error Resume Next
        Dim wks As Worksheet
        For Each wks In ActiveWorkbook.Worksheets

            Dim x As Long
            For x = 1 To lChartObjCount

                With wks

                    .ChartObjects(x).PageSetup.Orientation = xlLandscape

                    .ChartObjects(x).Select

                    .ChartObjects(x).Activate

                    .PrintOut , , 1

                End With

            Next x

        Next wks

        ActiveChart.Deselect
        With Sheets(szASheet)
            .Select
            .Range("A1").Select
        End With

        .ScreenUpdating = True
    End With
End Sub

1 个答案:

答案 0 :(得分:6)

使用VBA操作Excel图表总是有点令人困惑,因为有ChartObject个对象,然后有Chart个对象。每个ChartObject对象都有一个子Chart对象。并不总是非常直观的属性和方法属于Chart,哪些属性和方法可以在其父ChartObject上找到。引用VBA帮助:

  

[ ChartObject ]表示工作表上的嵌入式图表。 ChartObject 对象充当 Chart 对象的容器。 ChartObject 对象的属性和方法控制工作表上嵌入图表的外观和大小。

如果你没戴眼镜,阅读VBA帮助会让你疯狂,因为ChartObject意味着与Chart对象不同的东西!

无论如何,事实证明,.PageSetup.Orientation位于Chart而不是ChartObject,正如您所推断的那样。

    Dim wks As Worksheet
    Dim chartObject As ChartObject

    For Each wks In ActiveWorkbook.Worksheets
        For Each chartObject In wks.ChartObjects
            .Chart.PageSetup.Orientation = xlLandscape ' or xlPortrait
            .Chart.PrintOut Preview:=True, ActivePrinter:="PDFCreator"
        Next
    Next

这假设您要在单独的页面上打印每个图表。您在代码中所做的是立即打印出每个完整的工作表,但这似乎与您的其余问题不符。

在这里,我使用PDFCreator作为我的打印机,因为我不想在测试此代码时浪费一堆纸。你当然可以根据需要调整它。

此外,我在打印时设置了活动打印机。当然,您也可以使用Application.ActivePrinter,但即使宏运行完毕,也会影响活动打印机。