【Access VBA】レポートの画像を動的に切り替える方法

PROGRAMMING
Image by Mediamodifier from Pixabay

Accessのレポートに画像を埋め込み、レコードの値(フラグ)に合わせ、動的に画像の中身を動的に切り替える方法を解説しています。

やり方は2通りあり、

  1. 連結オブジェクトフレームを使用する方法
  2. イメージを使用する方法

があります。両方とも、レポート上に配置するコントロールの名称です。連結オブジェクトフレームはテーブルに格納したイメージやOLEオブジェクトを表示させるものですが、Microsoftのオンラインドキュメントが分かりにくかったため、手順をまとめました(メモ代わりでもあります)。イメージコントロールは、Accessの外部にある画像ファイルを指定するのに使用できます。

連結オブジェクトフレームを使用する方法

公式サイトの引用ですが、「連結オブジェクトフレーム」は以下の用途で使用します。

連結オブジェクト フレーム オブジェクトを使うと、Access データベースのテーブルに格納されたピクチャ、グラフ、または OLE オブジェクトを表示することができます。 たとえば、テーブルに格納した社員のピクチャを、連結オブジェクト フレームを使ってフォームやレポートに表示することができます。

BoundObjectFrame オブジェクト (Access)

要するに、テーブル内のオブジェクトをが対象のようです。
早速、作り方を具体的に示します。

まずは、ビットマップイメージを格納したテーブルを用意

今回は、フラグを見て女性と男性の画像を切り替えて表示するレポートを作ってみます。画像を格納するテーブルは、「table1」とし、画像を入れる列のデータ型は「OLEオブジェクト型」にします。

ビットマップ画像を格納するテーブル

画像は、以下のものを使いました(いらすとやさんから)。

今回使用する画像(女性・男性)

ペイントで開き、コピー&ペーストで貼りつけます。セルの内容が「Bitmap Image」になるはずです(ファイルをドラッグ&ドロップする方法ではできないので注意)。

ビットマップ画像が入ったテーブル

次に、レポートに表示させるデータを用意します。「data1」としました。「sex」列に区分を格納します。

レポートに表示させるデータ

「data1」にデータを入れます。”1″が女性、”2″が男性。

レポートに表示させるデータを投入

これで、とりあえずデータの準備は完了。

レポートを作成

新規でレポートを作成し、「連結オブジェクトフレーム」を貼り付けます。また、「sex」の値を入れる項目もテキストボックスで用意しておきます。ちなみに、隠し項目と画像では書いていますが、説明の便宜上、表示させています。

連結オブジェクトフレーム
連結オブジェクトフレームとテキストボックスを貼り付ける

レポートのプロパティで、レコードソースに「data1」を指定。

レポートのプロパティ

テキストボックスのプロパティで、コントロールソースには「sex」を指定。

画像切り替えのロジックをVBAで記述

レポートの詳細のセクションをクリックして「イベント」タブの「印刷時」を、「イベントプロシージャ」にして「…」をクリックします。すると、Visual Basic Editorが立ち上がります。

印刷時のイベントプロシージャを指定

VBAを以下のように書きます。連結オブジェクトフレーム(pic1)のValueプロパティに、OLEオブジェクトのデータ(ビットマップ)を、セットします。

Option Compare Database
Option Explicit

Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)
    Dim female, male As Object
    Dim db As DAO.database
    Dim rst As DAO.Recordset
    
    'table1データ取得
    Set db = CurrentDb
    Set rst = db.OpenRecordset("table1")
    '画像取得
    rst.MoveFirst
    Set female = rst!girl
    Set male = rst!boy
    
    '連結オブジェクトフレームにセット
    Select Case Me.txt1.Value
        Case "1"
            Me.pic1.Value = female
        Case "2"
            Me.pic1.Value = male
    End Select
    
End Sub

うまくできてると、「印刷プレビュー」で以下のように表示されるはずです。ちゃんと、画像が切り替え表示されていますね。

/archive2019/archive2019/archive2019
切り替え表示の結果(連結オブジェクトフレーム)

以上が、テーブルのデータに画像を入れて、それ参照する方法です。この方法のメリットとしては、外部にデータを用意しなくていいので、Accessファイル単体だけを更新するだけで済みます。外部に必要なファイルを用意しなくていいので、単純な構成にできます。本番環境のファイルを更新する際、画像ファイルをコピーし忘れていた…などという、ありがちなミスを防げるかもしれません。

イメージを使う方法(画像ファイルのパスを指定する)

Access外部に要してある画像ファイルを、パスを指定することで表示させる方法もあります。イメージというコントロールを使います。

/archive2019/archive2019/archive2019
イメージコントロール

レポートへの配置の方法は、ほぼ同じです。違うのが、コントロールを貼り付けた後、ダイアログで読込む画像を聞かれます。が、これは無視してOKなので、「×」を押します(初期表示させる場合はここで指定しても良い)。

VBは以下の通りにします。Pictureプロパティに、文字列で画像ファイルのパスをセットします。img1は、イメージのコントロール名です。

Option Compare Database
Option Explicit

Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)
    '連結オブジェクトフレームにセット
    Select Case Me.txt1.Value
        Case "1"
            Me.img1.Picture = "G:\work\sex\girl.png"
        Case "2"
            Me.img1.Picture = "G:\work\sex\boy.png"
    End Select
    
End Sub

うまくできると、以下のようになるはずです(画像の色が変なのは縮小したせいです…)。

/archive2019/archive2019/archive2019
切り替え表示の結果(イメージ)

参考サイト
BoundObjectFrame オブジェクト (Access)
Image オブジェクト (Access)

以上です。

/archive2019
/archive2019/archive2019/archive2019 /archive2019
/archive2019