Excel VBAでワードを起動して グラフをワードに図として貼付け(Excel VBA)

【本日のミッション】

Excel VBAでワードを起動して、グラフをワードに図として貼付けせよ。

ミッションの概要

Excel VBAでワードを起動して、グラフをワードに図として貼付けせよ、というのが今回のミッションです。


↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

Wordアプリケーションは、セルやシートと違って、Excel上には存在しない外部オブジェクトです。

Excelでは、「Word.Application」というオブジェクトを使って、Wordを操作する(作成、削除、移動、入力、コピー等)ことができます。

Word.Application」を使用するには、下記の何れかの方法で準備をする必要があります。

  • 参照設定を利用する方法
  • CreateObject 関数を利用する方法

参照設定を利用する方法

VBE画面の参照設定を利用する方法です。

【利用方法】

  1. VBE画面[ツール] ー [参照設定] をクリックします。



    「Microsoft Word XX.X Object Library」にチェックを入れて<OK>ボタンをクリックします。


    参照設定が完了したら、下記コードの実行が可能になります。

    Sub ExcelからWord起動グラフ貼付_参照設定必要()
    
        '【変数】
        Dim wdApp As Word.Application    
    
        '■画面更新の停止
        Application.ScreenUpdating = False
        '■Wordの準備
        Set wdApp = New Word.Application
        
        '■Wordの可視化
        wdApp.Visible = True
        
        '■新規文書の作成
        wdApp.Documents.Add
        
        '■グラフのコピー
        ActiveSheet.ChartObjects("グラフ 1").Copy
        
        '■Wordに貼付け(リンク貼付しない、行内に配置、拡張メタファイル)
        wdApp.Selection.PasteSpecial Link:=False, Placement:=wdInLine, DataType:=wdPasteEnhancedMetafile
        Application.CutCopyMode = False   ’カットコピーモード解除
    
        '■変数の解放
        Set wdApp = Nothing
        
        '■画面更新の再開
        Application.ScreenUpdating = True
    End Sub
  2. 変数「wdApp」をWord.Applicationとして宣言します。

    Dim wdApp As Word.Application

    変数の宣言で「Dim wdApp As Object」としてしまうとVBAのエラーはでませんが、インテリセンス機能(自動メンバー表示)が利用できませんのでご注意ください。

  3. Newキーワードを使って、変数「wdApp」にWord.Applicationをセットします。
    Set wdApp = New Word.Application

    この記述をすることで、変数「wdApp」をWord.Applicationとして使うことができます。

  4. Word.Applicationを可視化します。
    この記述で、画面上にWordアプリケーションが表示されます。

    wdApp.Visible = True
  5. 新規文書を作成します。タイトルバーが「Word」から「文書1 – Word」に変わります。
    wdApp.Documents.Add


    ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

  6. Excelのグラフをコピーします。
    ActiveSheet.ChartObjects("グラフ 1").Copy
  7. コピーしたグラフを図としてWordに貼付けし、カットコピーモードを解除します。
    wdApp.Selection.PasteSpecial Link:=False, Placement:= wdInLine, DataType:= wdPasteEnhancedMetafile
    Application.CutCopyMode = False
  8. 処理の最後に、変数「wdApp」を解放します。

    Set wdApp = Nothing

【メリット】

  • VBE上でWord.Applicationに関するインテリセンス機能(自動メンバー表示)を使うことができます。
    メンバーが表示されるので、入力ミスが減ります。
  • Selection.PasteSpecial メソッドの定数を、名前で指定することができます。(下記 Selection.PasteSpecial メソッドの項参照)
    wdApp.Selection.PasteSpecial Link:=False, Placement:=wdInLine, DataType:=wdPasteEnhancedMetafile

【デメリット】

  • 参照設定をしていないと、変数「wdApp」の宣言の処理でエラーが出てしまいます。
    コンパイルエラー:ユーザ定義型は定義されていません。
■■■スポンサーリンク■■■

CreateObject 関数を利用する方法

関数を利用して、Word.Applicationを使えるようにする方法です。参照設定をしていなくても利用できます。

【利用方法】

Sub ExcelからWord起動グラフ貼付_参照設定不要()
    '【変数】
    Dim wdApp As Object

    '■画面更新の停止
    Application.ScreenUpdating = False

    '■Wordの準備
    Set wdApp = CreateObject("Word.Application")
    
    '■Wordの可視化
    wdApp.Visible = True
    
    '■新規文書の作成
    wdApp.Documents.Add
    
    '■グラフのコピー
    ActiveSheet.ChartObjects("グラフ 1").Copy
    
    '■Wordに貼付け(リンク貼付しない、行内に配置、拡張メタファイル)
    wdApp.Selection.PasteSpecial Link:=False, Placement:=0, DataType:=9
    Application.CutCopyMode = False     ’カットコピーモード解除

    '■変数の解放
    Set wdApp = Nothing

    '■画面更新の再開
    Application.ScreenUpdating = True
End Sub
  1. まず、変数「wdApp」をObjectとして宣言します。
    参照設定をしていないので、「Word.Application」への宣言はできません。

    Dim wdApp As Object
  2. 次に、CreateObject関数を利用して、変数「wdApp」にWord.Applicationをセットします。
    Set wdApp = CreateObject("Word.Application")
    

    この記述をすることで、変数「wdApp」をWord.Applicationとして使うことができます。

  3. Word.Applicationを可視化します。
    この記述で、画面上にWordアプリケーションが表示されます。

    wdApp.Visible = True
  4. 新規文書を作成します。タイトルバーが「Word」から「文書1 – Word」に変わります。
    wdApp.Documents.Add


    ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

  5. Excelのグラフをコピーします。
    ActiveSheet.ChartObjects("グラフ 1").Copy
  6. コピーしたグラフを図としてWordに貼付けし、カットコピーモードを解除します。
    wdApp.Selection.PasteSpecial Link:=False, Placement:=0, DataType:=9
    Application.CutCopyMode = False
  7. 処理の最後に、変数「wdApp」を解放します。

    Set wdApp = Nothing

【メリット】

  • 参照設定不要!関数の利用だけで、簡単なコードの記述で利用することができます。

【デメリット】

  • VBE上でWord.Applicationに関するインテリセンス機能(自動メンバー表示)が効かなくなります。
    Word.ApplicationはExcel上のオブジェクトではないので、参照設定をしないとインテリセンス機能が働きません。

    ↓これがインテリセンス機能(自動メンバー表示)です。

    インテリセンス機能(自動メンバー表示)が働かないと、入力ミスの可能性が生じます。
    この機能が必要な方は、参照設定をご利用ください。
  • Selection.PasteSpecial メソッドで定数を「値」で指定しないとエラーになります。
    wdApp.Selection.PasteSpecial Link:= False, Placement:= 0, DataType:= 9

    コンパイルエラー:変数が定義されていません。

最後のNothingの必要性

どちらのコードも処理の最後に

Set wdApp = Nothing

と、変数「wdApp」を解放するコードが必要です。

Word.Applicationのインスタンスが、メモリ上にずっと残ってしまうことがあるからです。

それがどういう状況なのかはわからないのですが、私も長時間マクロ処理をしていると処理が遅くなっていく現象に見舞われることがあります。

そんな時は、Excelと一旦閉じて再度立ち上げると、その現象は解消されます。

そんなこともあり、オブジェクト変数は最後に「Nothing」として、メモリ上から消すように心がけています。

Selection.PasteSpecial メソッド

コピーした内容を、Wordのカーソル位置に挿入します。

【参照設定をしている場合】

wdApp.Selection.PasteSpecial Link:=False, Placement:=wdInLine, DataType:=wdPasteEnhancedMetafile

【参照設定をしていない場合】
参照設定をしていない場合、上記のコードにするとエラーが出てしまうので、定数の指定を値にします
コンパイルエラー:変数が定義されていません。

wdApp.Selection.PasteSpecial Link:=False, Placement:=0, DataType:=9

今回の貼付け処理は↓このイメージです。

引数説明省略
LinkTrue:リンク貼り付けをする。
false:リンク貼り付けをしない。(規定値)
PlacementWdOLEPlacement 定数のいずれかを指定できます。

定数内容
wdFloatOverText位置を固定しない
wdInLine行内
DataTypeクリップボードの内容を文書に挿入するときの書式を指定します。 WdPasteDataType クラスの定数を使用します。

定数内容
wdPasteOLEObjectOLE オブジェクト
wdPasteRTFリッチ テキスト形式 (RTF)
wdPasteText文字列
wdPasteMetafilePictureメタファイル
wdPasteBitmapビットマップ
wdPasteDeviceIndependentBitmapデバイスに依存しないビットマップ
wdPasteHyperlinkハイパーリンク
wdPasteShape図形
wdPasteEnhancedMetafile拡張メタファイル
wdPasteHTMLHTML10

※他にも引数は存在しますが、今回使用している引数のみご紹介しています。

参照

系列が1つのグラフを自動大量連続作成(Excel VBA)
「実行時エラー 1004」を出さずに、ワークシート内のグラフを「グラフ 元」以外全て削除(Excel VBA)
グラフの参照先を変えると勝手にグラフの色が変わる現象を解決せよ
系列が複数あるグラフを自動大量連続作成(Excel VBA)
n行毎の改ページ設定 「実行時エラー1004 RangeクラスのPageBreakプロパティを設定できません」の原因(Excel VBA)
参照データ数が異なる・参照先が変動する月別グラフを自動大量連続作成(Excel VBA)
複数系列・参照データ数が異なる・参照先が変動する月別グラフを自動大量連続作成(Excel VBA)
大量の画像やグラフ等のオブジェクトで画面表示が遅いのを解決(Excel)
エクセル シートに画像が存在するかどうか(有無)を調べる方法(Excel VBA)
エクセルシート上 全てのオブジェクト(画像・図形・グラフ等)を選択し、削除する(Excel VBA)
エクセルシート上のオブジェクト(図形・画像・グラフ等)の件数を数える方法(Excel VBA)
エクセル シートにグラフが存在するかどうか(有無)を調べる方法(Excel VBA)
エクセル シートに図形が存在するかどうか(有無)を調べる方法(Excel VBA)
エクセル 選択しているセル範囲に写真が存在しているか(有無)を確認(Excel VBA)
エクセル 選択しているセル範囲にグラフが存在しているか(有無)を確認(Excel VBA)
エクセル 選択しているセル範囲に図形が存在しているか(有無)を確認(Excel VBA)
エクセル 選択セル範囲の写真を削除する(Excel VBA)
エクセル 選択セル範囲のグラフを削除する(Excel VBA)
エクセル 選択セル範囲の図形を削除する(Excel VBA)
Excel VBAでワードを起動して文字を入力操作(Excel VBA)
Excel VBAでワードを起動してエクセルの表をワードに貼付け(Excel VBA)
Excel VBAでワードを起動して エクセルのエクセルの表を図としてワードに貼付け(Excel VBA)
Word コピー貼付けした図が白い枠だけ?図が表示されない現象を解決
Excel VBAでワードを起動して グラフをワードに図として貼付け(Excel VBA)

■■■スポンサーリンク■■■