2012-02-15 3 views
4

別のマクロを使用してワークブックで作成したすべてのグラフを自動的に印刷するマクロを作成しようとしています。 (文字通り数百)私が抱えている問題は、VBAを使用してグラフをポートレートレイアウトからランドスケープレイアウトに変更する方法を理解できないことです。誰かが私を助けることができるかどうか疑問に思っていた。私はコードを試してみましたが、 ".ChartObjects(x).PageSetup.Orientation = xlLandscape"という行にエラーが表示されます。これは正しいプロパティではないが、それ以外はそうです。VBAを使用してExcelチャートの向き(縦または横)を変更する

助けていただけたら幸いです! ChartObjectオブジェクトがあると、その後Chartオブジェクトがあるので、VBAを使用してExcelのグラフを操作

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

グラフは実際に私の専門分野ではありません。しかし、私が理解しているように、彼らは「方向づけ」されていません。高さは幅よりも小さいかもしれませんが、それは同じではありません。 'Sheets(" xxxxxx ")。PageSetup.Orientation = xlLandscape'の効果は? –

+1

その他のポイント。 (1) 'With Application'を終了するには、' .ActivePrinter = ... 'の下に' End With'を置くべきです。最後の '.ScreenUpdating = True'の前に別の' With Application'を追加してください。 (2) 'lChartObjCount'を、マクロが開始されたときにアクティブなページ上のチャートの数に設定します。次に、ブック内のすべてのシートに対して 'lChartObjCount'を使います。 With wks'' for x = 1 To .ChartObjects.Count'が必要です。 –

答えて

5

は、常に少し混乱しています。各ChartObjectオブジェクトには、子オブジェクトChartがあります。プロパティとメソッドがChartに属し、その親にあるChartObjectにあるものは、必ずしも直感的ではありません。 VBAのヘルプ引用:

[ChartObjectには]ワークシート上の埋め込みグラフを表しています。 ChartObjectオブジェクトはチャートオブジェクトのコンテナとして機能します。 ChartObjectオブジェクトのプロパティとメソッドは、ワークシート上の埋め込みチャートの外観とサイズを制御します。あなたがあなたのメガネを持っていない場合ChartObjectChartオブジェクトとは異なる何かを意味するので

読書VBAのヘルプは、あなたにナットを駆動することができます!

あなたが推測していた通り、.PageSetup.OrientationChartにありません。

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

素晴らしい作品です!私がしなければならなかったのは、私のchartobjectの後に子オブジェクトを挿入することだったので、コードは "ChartObjects(x).Chart.PageSetup.Orientation = xlLandscape"のようになりました。親と子のオブジェクトの混乱は私を狂わせる。このコードは、ワークブック内のすべてのグラフをランドスケープレイアウトで印刷するのに最適です。 –

関連する問題