【Microsoft Access】テーブルに画像を格納して、フォームで表示する

## はじめに
今までMicrosoft Access（以下、Access）で画像の格納や表示をしたことがなかったのですが、
画像を使用したAccessツールを使用する機会があったので使用方法をまとめてみました！

## Accessで画像を使うとは
Accessでは画像をデータとしてテーブルに格納することができます。

![操作1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576431/e22d8383-e40f-f5c5-4538-061cd62fa017.gif)


保存したデータは下記のようにフォーム上で表示させることができます。

![操作2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576431/12abc952-0921-17dd-f762-e401e8752bd2.gif)

## テーブルに画像を格納する（手動）
テーブルに画像を格納する手順は下記のとおりです。

➀画像を格納するフィールドのデータ型を __添付ファイル__ に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576431/f2406398-8c40-a4b2-ebb2-da5b6218a114.png)

➁テーブルを開くとフィールドにクリップのマークが入っています。
　クリップマークをダブルクリックし、「添付ファイルの管理」を選択します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576431/b3314134-be1c-f829-5312-8652d7f9fbb9.png)

➂「追加」ボタンをクリックするとファイル選択画面が表示されます。
　テーブルに格納したい画像を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576431/92ce4d9c-3a1f-81ee-50ac-10e5f31288b8.png)

➃画像が格納されると、クリップマークの右側に格納した画像の数に応じた数字が表示されます。
<br><br/>
一つずつファイルを選択する必要があるため少し手間がかかりますが、簡単に画像を格納することができます！

## テーブルに画像を格納する（VBA）
手動での画像格納手順をマクロで実行してみます！

【実行内容】
「リスト」テーブルの「画像」フィールドに画像を格納していきます。
今回は、１レコード目に「1.png」の画像を保存、２レコード目に「2.png」の画像を保存...
となるようにマクロを動かしていきます。

VBAは下記のとおりです。

```vb:Access VBA
Sub ImageInsert_Click()
    Dim dbs As database
    Dim rst As Object
    Dim rsA As Object
    Dim PictFld  As Object
    Dim strFile As String
    Dim strPath As String: strPath = <画像が格納されているフォルダパス>
    Dim strPattern As String: strPattern = "*.png"
    Dim i As Integer: i = 1

    Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset("リスト")
    Set PictFld = rst("画像")

    '「リスト」テーブルの1レコード目から順に処理を行う'
    Do Until rst.EOF
        '「画像」フィールドのレコードセットを取得する'
        Set rsA = PictFld.Value

        '名前が"i"の画像を取得'
        strFile = Dir(strPath & "\" & i & strPattern) 

        rst.Edit

        '対象の画像がある場合は、画像を格納'
        If strFile <> "" Then
            rsA.AddNew
            rsA("FileData").LoadFromFile strPath & "\" & strFile
            rsA.Update
        End If

        i = i + 1

        rsA.Close
        rst.Update
        rst.MoveNext
    Loop

    rst.Close
    dbs.Close
    Set fld = Nothing
    Set rsA = Nothing
    Set rst = Nothing
    Set dbs = Nothing

    MsgBox "画像の格納が完了しました"
End Sub
```
マクロの結果としては前出の「Accessで画像を使うとは」に載せているテーブルを作成することができます。

## フォームで画像を表示する
テーブルに画像を格納できたら、今度はフォームで画像を使ってみましょう！
レコードの情報を表示し、ボタンで表示するレコード情報を切り替えていくようなフォームを用意しました。

画像をフォームに表示する設定は下記のとおりです。

➀フォームを作成し、レコードソースとして作成したテーブルを設定する。
今回は「リスト」テーブルに画像を格納したため、リストを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576431/38f3ec38-cabc-6056-e0b0-c58aae9df7ce.png)

➁リボンのフォームデザインから「添付ファイル」をフォーム上に配置する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576431/9b6bc128-177e-47df-cd0e-470b5b02d969.png)

➂設置した「添付ファイル」オブジェクトを選択し、コントロールに画像を格納したフィールドを選択する。
今回は「画像」フィールドに格納したため、画像を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576431/7743dc1d-3fd2-cd89-df1f-1d54a5ab6e09.png)

上記のようにファームを設定すると、前出の「Accessで画像を使うとは」に載せているフォームのように画像を表示させることができます。

## 【豆知識】テーブルのデータ型について
今回は画像を格納するフィールドのデータ型を __添付ファイル型__ としましたが
他にも __OLEオブジェクト型__ が存在します。

それぞれの違いとしては
■添付ファイル型
　Access2007以降に追加されたデータ型
　すべての種類のドキュメントとバイナリファイルを格納できる
　また、１レコードに複数の添付ファイルを格納することが可能

■OLEオブジェクト
　Access2007以前からあるデータ型
　環境によってはフォームで画像を表示できない場合がある

.accdbファイル形式では __添付ファイル型__ を使用した方が無難かと思います！

　↓Microsoftの参考URLです。
[使用が推奨される Access ファイル形式](https://support.microsoft.com/ja-jp/topic/%E4%BD%BF%E7%94%A8%E3%81%8C%E6%8E%A8%E5%A5%A8%E3%81%95%E3%82%8C%E3%82%8B-access-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%BD%A2%E5%BC%8F-012d9ab3-d14c-479e-b617-be66f9070b41)

## 感想・まとめ
AccessのVBAで画像を使用したことがなかったのでVBA作成に手こずってしまいましたが、
フォームに画像を載せるのはとても簡単にできました！
使用する画像情報の管理（ファイル名の設定など）は手がかかりそうですが、
それさえ準備できれば使用するのはそこまで難易度は高くなさそうです。

また、個人的に懸念していたファイル容量も「添付ファイル型」では
自動的に画像が圧縮されるためそこまで大きくならなそうです。
（今回は元の画像データが合計約3MBで、作成したAccessは約4MBでした）
とはいえ、Accessの容量上限は2GBなので、格納する画像の数が多い場合は検討が必要そうですね。

今回の記事に使用した画像は下記サイトからお借りしました。
[ぱくたそ](https://www.pakutaso.com/)

## ご案内
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area