1. 導入:なぜUserFormにグラフを表示するのか
実務において、ダッシュボードや入力インターフェースを作成する際、ワークシート上のグラフをそのまま表示させたいというニーズは非常に多いものです。しかし、UserFormには標準でグラフを直接描画するコントロールが存在しません。この課題を解決するためには、「グラフを一度画像ファイルとして書き出し、それをImageコントロールで表示する」というステップを踏むのが定石です。本記事では、この一連の処理をスマートに実装する方法を解説します。
2. 基礎知識:ExportメソッドとLoadPicture関数
今回の解決策の核となるのは、以下の2つの機能です。
・Chart.Exportメソッド: ワークシート上のグラフを画像ファイル(.jpg, .bmp, .gifなど)として書き出す機能です。
・LoadPicture関数: 指定したパスの画像ファイルをUserFormのImageコントロールに読み込む機能です。
注意点として、Excelの標準機能であるLoadPictureはPNG形式の読み込みに対応していない場合があるため、実務では互換性の高い「BMP」や「JPG」形式を利用するのが無難です。
3. 実装のステップ
実装の手順は以下の通りです。
1. グラフの有無をチェックし、エラーを回避する。
2. グラフを一時ファイルとしてディスクに保存する。
3. Imageコントロールにその画像を読み込む。
4. 処理終了後、不要になった一時ファイルを削除する(Killステートメント)。
この手順を踏むことで、メモリを圧迫せず、クリーンにグラフを表示することが可能です。
4. サンプルプログラム
以下のコードをUserFormのモジュールに貼り付けてください。あらかじめUserFormに「Image1」という名前のコントロールを配置しておく必要があります。
Private Sub UserForm_Initialize()
‘ 一時保存する画像ファイルのパスを定数で定義
Const TEMP_FILE As String = “C:\Temp\TempGraph.bmp”
‘ グラフが存在しない場合の処理
If ActiveSheet.ChartObjects.Count = 0 Then
MsgBox “グラフが見つかりません。”, vbExclamation
Exit Sub
End If
‘ 1つ目のグラフを画像として書き出し
ActiveSheet.ChartObjects(1).Chart.Export TEMP_FILE
‘ 画像が正しく作成されたか確認して読み込み
If Len(Dir(TEMP_FILE)) > 0 Then
With Me.Image1
.Picture = LoadPicture(TEMP_FILE)
.PictureSizeMode = fmPictureSizeModeStretch ‘ 枠に合わせて伸縮
.BorderStyle = fmBorderStyleNone
End With
‘ 読み込みが終わったら一時ファイルを削除(クリーンアップ)
Kill TEMP_FILE
End If
End Sub
5. 応用・注意点
・一時ファイルの保存場所:
実務では「C:\」直下は権限の問題で書き込みできないケースがあります。その場合は「Environ(“TEMP”)」を使って、Windowsのテンポラリフォルダを指定するのが安全です。
例:Const TEMP_FILE As String = Environ(“TEMP”) & “\TempGraph.bmp”
・画面更新のチラつき対策:
グラフが動的に変化する場合、何度もExport処理を行うと画面がチラつくことがあります。その際は、表示用の画像ファイルを固定して、必要に応じて「Application.ScreenUpdating = False」を併用することで、よりスムーズな動作になります。
・ファイルロックへの配慮:
Killステートメントでファイルを削除する際、ファイルがまだ使用中と判定される場合は、少しだけ処理を待機させる(DoEventsを入れる)などの工夫をすると、より堅牢なプログラムになります。
