Изменение ориентации (книжной или альбомной) диаграммы Excel с помощью VBA - PullRequest
5 голосов
/ 15 февраля 2012

Я пытаюсь написать макрос для автоматической печати всех диаграмм, которые я создал в книге, используя другой макрос. (буквально сотни) У меня проблема в том, что я не могу понять, как изменить график с книжного макета на альбомный с помощью 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 Ответ

6 голосов
/ 16 февраля 2012

Управление диаграммами Excel с использованием VBA всегда немного сбивает с толку, потому что есть 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 вместо этого, но это повлияет на активный принтер, даже когда макрос завершит работу.

...