UserFormにグラフを表示する|Excel VBA

ユーザーフォーム関連のテクニック

UserFormにグラフを表示する

(Excel 97/2000/2002/2003/2007/2010/2013)

ワークシート上にグラフを作成したとします。
このグラフを、UserFormに表示するにはどうしたらいいでしょう。
UserFormのコントロールには、シート上のグラフを表示する機能はないので、いくつかの工夫が必要です。

UserFormのコントロールには、任意の画像を表示するImageコントロールがあります。
Imageコントロールに画像を表示するには次のようにします。
UserFormにImageコントロールを配置してから実行してください。

Private Sub UserForm_Initialize()
    Image1.Picture = LoadPicture("C:\Data\mogtan.gif")
End Sub

これでImage1にはC:\Data\mogtan.gifが表示されます。
UserForm上に任意の画像を表示することができるのですから、何らかの方法で、シート上のグラフを"画像として"保存できれば問題は解決です。
グラフを画像として保存するには、ChartオブジェクトのExportメソッドを使用します。
次のコードは、アクティブシートのグラフをC:\Data\Graph.jpgとして保存します。

Sub Sample1()
    ActiveSheet.ChartObjects(1).Chart.Export "C:\Data\Graph.jpg"
End Sub

ヘルプによると、Exportメソッドで保存する画像形式は、引数FilterNameに
"JPG"や"GIF"などを指定せよ、と書かれていますが、保存する画像ファイル名の
拡張子が自動的に判断されているようです。
拡張子に jpg、png、gif、bmpなどを指定すると、それぞれ適切な形式で保存されます。
(ただし、png形式はLoadPicture関数で対応していないので、今回は使えません。)

これらの動作を組み合わせると、シート上のグラフをUserFormに表示できます。

Private Sub UserForm_Initialize()
    ActiveSheet.ChartObjects(1).Chart.Export "C:\Data\Graph.jpg"
    Image1.Picture = LoadPicture("C:\Data\Graph.jpg")
End Sub

もう少し完成度を高めるのなら、次のようにImageのプロパティを設定したり、アクティブシートにグラフがあるかどうかの判定、不要になった画像ファイルの削除などの処理を追加するとよいでしょう。

Private Sub UserForm_Initialize()
    Const GRAPH_IMAGE As String = "C:\Data\Graph.bmp"

    'グラフの存在チェック
    If ActiveSheet.ChartObjects.Count = 0 Then Exit Sub
    
    'グラフを画像として保存
    ActiveSheet.ChartObjects(1).Chart.Export GRAPH_IMAGE
    
    '画像ファイルをImageに読み込み
    If Len(Dir(GRAPH_IMAGE)) > 0 Then
        With Image1
            .PictureSizeMode = fmPictureSizeModeClip      '拡大・縮小なし
            .PictureAlignment = fmPictureAlignmentCenter  '中央配置
            .BorderStyle = fmBorderStyleNone              '枠なし
            .Picture = LoadPicture(GRAPH_IMAGE)
        End With
        '画像ファイルを削除
        Kill GRAPH_IMAGE
    End If
End Sub