2012-02-15 4 views
4

Я пытаюсь написать макрос, чтобы автоматически печатать все диаграммы, которые я создал в книге, используя другой макрос. (буквально сотни) Проблема, с которой я сталкиваюсь, заключается в том, что я не могу понять, как изменить график с макета портрета на макет ландшафта с помощью VBA. Мне было интересно, сможет ли кто-нибудь помочь мне. Я пробовал код ниже, но он дает мне ошибку в строке «.ChartObjects (x) .PageSetup.Orientation = xlLandscape« Я понимаю, что для объекта диаграммы это неправильное свойство, но я не могу понять, что иначе это так.Изменение ориентации (портретной или альбомной) диаграммы Excel с использованием VBA

Любая помощь будет оценена!

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

Графики на самом деле не моя область знаний. Однако, как я их понимаю, они не «ориентированы». Высота может быть меньше ширины, но это не то же самое. Какое влияние имеет «Листы» («xxxxxx»). PageSetup.Orientation = xlLandscape' есть? –

+1

Другие пункты. (1) У вас должно быть «End With» под '.ActivePrinter = ...' для завершения 'With Application'. Добавьте еще один «С помощью приложения» перед окончательным '.ScreenUpdating = True'. (2) Вы устанавливаете 'lChartObjCount' количество графиков на странице, которая активна при запуске макроса. Затем вы используете 'lChartObjCount' для каждого листа в книге. Вам нужно иметь «С wks'' для x = 1 до .ChartObjects.Count'. –

ответ

5

Манипулирование диаграмм Excel с помощью VBA всегда немного сбивает с толку, потому что есть ChartObject объекты, а затем есть Chart объекты. Каждый объект ChartObject имеет ребенка Chart объект. Не всегда очень интуитивно понятно, какие свойства и методы принадлежат Chart и которые можно найти у его родителя ChartObject. Цитирование VBA помощь:

[ChartObject] представляет собой внедренную диаграмму на листе. Объект ChartObject выступает в качестве контейнера для Диаграмма объект. Свойства и методы объекта 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, но это повлияет на активный принтер, даже когда макрос будет запущен.

+1

Отлично работает! Все, что мне нужно было сделать, это вставить дочерний объект после моего графического объекта, чтобы код выглядел следующим образом: «ChartObjects (x) .Chart.PageSetup.Orientation = xlLandscape» Спасибо За вашу помощь Жан! Путаница между родительскими и дочерними объектами сводит меня с ума.Код теперь отлично работает, чтобы распечатать каждый график в книге в ландшафтном макете! –

Смежные вопросы