Access初心者が単語帳ツールを作成した記録

#なぜAccess？
社内業務でツール(単語帳)を作成することになったのですが、
使い慣れたExcelより、<font color="Red">**Accessの方が今回は向いているのではないか**</font>？と思い
経験0からAccessで作成を始めてみました。

#環境
・**Windows10 64bit**
・**Microsoft Office Access 365**


#完成イメージ
**起動すると「単語一覧表」と「単語登録」画面が表示される**
![top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/c5f3c56f-afcb-0676-69e7-e506255c6049.png)

**◆単語一覧表をクリックした場合**
「単語一覧」画面へ遷移する
　├遷移した際にDBに保存されている値をリスト表示する
　├単語の検索が行える
　└トップ画面へ遷移することができる

**◆単語登録をクリックした場合**
　→**<font color="Red">今回ボタンを用意するだけで特に処理の記載はありません</font>**

#作成開始
・テーブルの作成
・フォーム(一覧画面)の作成
・一覧画面に検索ボタンを作成
・VBAで検索処理を追加
・トップページの作成
・各画面の遷移
として作成したいと思います。

##Accessを起動し、テーブルを作成する
1.Accessを起動する
2.空のデータベースを選択
3.ファイル名を「単語帳ツール.accdb」へ変更
4.作成ボタンをクリック(格納場所は任意)

そうすると、下記のような画面になると思います。
![file01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/4aa27699-2b8e-6f16-31d6-a235faf4146d.png)


###テーブルへ各フィールドを追加

**「クリックして追加」を選択し、「短いテキスト」を選択します。**
![file02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/06f91701-6ed8-98fb-0bc0-e93347a6e966.png)

**フィールド名を「単語」とします。**
![img04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/c929e11c-e280-7b87-2d5c-d82c8d407dc9.png)

**読み、特徴、カテゴリ、登録者　も同様に作成します。**
<font color="Red">**更新日のみ「日付/時刻」として作成ました。**</font>
![img01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/f18dfcbd-6f05-746a-7915-a9b087b1cc77.png)
**テーブルの完成です。**
![img02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/63cd074c-38f9-dd18-a67c-f1de8f305c20.png)

**ここまで出来たら、Ctrl + S で一度テーブルを保存します。
保存しようとするとテーブル名の入力画面が表示されるので「T_単語テーブル」とします。**
※Tはテーブルの頭文字を取っていますが、特に大きな意味はありません。
![img08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/c4eb66ce-7d27-2ac9-2e59-876e32ed74b1.png)

**データを直接入力してみる
T_単語テーブルに下記を入力してみます。**

|ID|単語|読み|特徴| カテゴリ |登録者|更新日|
|:--:|:--:|:-:|:-:|:-:| :-: |:-:|
|1|トイプードル|といぷーどる|モフモフしている| 犬 |山田 |2020/12/03|
|2|柴犬|しばいぬ|自立心が比較的高い|犬|山田|2020/12/03|
|3|メインクーン|めいんくーん|体が大きい|猫|鈴木|2020/12/03|

**テーブルが作成出来たので、次はフォームを作成したいと思います。**
![list01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/20c62ac8-fd1f-65a3-94d9-3b1c2f0d9ec6.png)


##フォームの作成
**単語一覧画面のフォームを下記の順番で作成**
・フォームデザインを新規作成
・サブフォームの埋め込み
・体裁を整える

**作成 > フォームデザインを選択し、新規フォームを作成します。
フォームが作成出来たら、デザイン > サブフォーム をクリックします。**

![img11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/71e543be-dcb6-a70b-78ee-ea25ca78a83d.png)

**サブフォームの大きさは後で調整可能なので、任意の大きさで作成します。
サブフォームを格納すると、「サブフォームウィザード」が表示されるので、
「既存のテーブルまたはクエリを使用する」を選択し、「次へ」をクリックします。**
<img width="450" alt="image12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/44024166-5f61-03af-7f6f-244f2c514b7b.png">

**「>>」を選択し、全てのフィールドを「選択したフィールド」へ移動させ「次へ」をクリックします。**
<img width="450" alt="image13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/d2c005d6-aa76-cf64-c93f-9467f3ac7d51.png">

**名前を「F_単語一覧」へと変更し「完了」をクリックします。**
<img width="450" alt="image14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/34587669-910f-bef8-e41e-37de004db323.png">

**上書きアイコン or Ctrl + s で名前を付けて保存にて、「F_単語一覧」というフォームにします。**
<img width="450" alt="form01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/60666fc3-71a9-7e6d-4c29-e516e855f2a1.png">

**フォームの詳細で右クリック > フォームヘッダー/フッター を選択します。**
<img width="450" alt="form02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/8109fc0e-e746-85fb-3cd2-8545236d5a66.png">

**作成したフォームヘッダーへタイトル(ラベル)を追加します。**
・デザイン > ラベルを選択し、フォームヘッダーへ任意の大きさのラベルを追加。
・表題を「単語一覧」と入力。
・フォントを「メイリオ」、フォントサイズを「24」、太字へと設定する。

少し一覧画面らしくなりましたね。次はサブフォームの体裁を整えます。

###サブフォームの体裁を整える
**F_単語一覧をデザインビューで開き、下記設定を行います。**
1. 「F_単語一覧」というラベルを削除
2. サブフォームの横幅、縦幅を枠内ピッタリに収める

**◆Before**
<img width="450" alt="Before.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/d2581779-097e-523d-e978-160afb1e494f.png">

**◆After**
<img width="450" alt="After.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/d7dfe952-aae6-d74c-8a8f-fca556a244cd.png">

フォームビューで「F_単語一覧」を開くと、<font color="Red">**単語一覧画面らしく**</font>なりました。
<img width="450" alt="tango01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/054d90b6-4ea0-f1cc-96f9-a332a9397416.png">

**データを追加したい場合は、単語～更新日までを入力します。**
※IDは自動入力されます
<img width="550" alt="tango01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/9daa5918-741d-bcbb-4170-00ea9c333ba7.png">

F_単語一覧は、「T_単語テーブル」からデータを取得しているので、
F_単語一覧画面からデータを追加した場合、「T_単語テーブル」のテーブルも自動で追加されます。

##一覧画面に検索機能の追加
**フォームヘッダーに検索場所を追加したいと思います。**
・検索対象のコンボボックスを作成する
・検索する文字列のテキストボックスを作成する
・検索ボタンで一覧画面が切り替わることを確認する

デザインビューで開いて、検索対象となるコンボボックスを作成します。
デザイン > コンボボックスを選択し、フォームヘッダーへ任意の大きさで作成。
作成するとダイアログが表示されるので<font color="Red">「キャンセル」</font>を選択。
<img width="450" alt="image23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/23cdc3cf-8bcc-febb-7662-44fd4825a99b.png">

ラベルとコンボボックスが追加されるので、
・ラベルの表題を「検索列」へ変更、コンボボックスを選択状態
にします。
![image25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/bca8e7e1-e96f-80a6-95e5-94b95e2db08a.png)

コンボボックスのプロパティから
・値集合タイプを「値リスト」へ
・値集合ソースの「・・・」を選択
します。
<img width="450" alt="image24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/5f0ebbe7-7739-fa5f-768f-99e7f500254f.png">

検索対象は「全て」「単語」「読み」としたいので、直接入力します。
規定値は「全て」とします。
設定完了したら、「OK」をクリック。
![image26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/8889f032-dfe2-d577-7807-aeaf1ecd4503.png)

次は実際に検索する文字列を格納するテキストボックスの追加です。
デザインからテキストボックスを追加し、以下のように設定します。
・標題：検索する文字列
・名前：txtSerch
<img width="450" alt="image27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/131c96a8-689e-c5d9-08a3-bb5422cd0384.png">


フォームビューで表示してみます。
テキストボックスの大きさが合っていない気がしますね、、、
<img width="450" alt="image28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/05a29835-61c7-370b-0f47-1d46a76562e9.png">

再度デザインビューに戻って追加した「コンボボックス」と「テキストボックス」を選択し
配置 > サイズ/間隔 > 低いコントロールに合わせる」 を選択。
<img width="450" alt="image29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/878ad645-d084-c4e5-35be-02b6eb3fbec5.png">

続けて「広いコントロールに合わせる」を選択。
<img width="450" alt="image30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/3a8afbc5-cfb3-3499-a379-a24966df9332.png">

あとはラベルとテキストの間隔を少し調整し、再度フォームビューで表示。
<font color="Red">**先ほどより見た目が綺麗**</font>になりました。
<img width="450" alt="image31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/6aa1965c-5523-8d70-dbad-dc390732c5ef.png">

**次に検索ボタンを追加します。**
デザインビューに戻り、デザイン > ボタン を文字列検索テキストボックスの右に作成します。
ボタンを作成した際に表示される「コマンドボタンウィザード」は<font color="Red">「キャンセル」</font>を選択し、
標題を「検索」へ変更。
<img width="450" alt="image32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/0dcb8bec-1124-ccc8-61c7-9934c62b2503.png">

これで検索ボタンまで配置が完了しました。
**次は検索ボタンでレコード操作**を追加したいと思います。

##VBAで検索処理
**検索処理は下記で実装します。**
1.検索ボタンにクリックイベントを追加
2.検索ボタンクリックで一覧画面を絞り込み(VBA)

F_単語一覧をデザインビューで開きます。
コンボボックスを選択し、プロパティシート > 名前 を「SearchColumn」とします。
![img34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/bb0579ca-caa7-71c9-6d74-1e641a6428f8.png)



検索ボタンを選択し、プロパティシート > 名前 を「検索ボタン」とします。
![image33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/caf2a231-6e3b-d7e2-fd16-68af6bf72a3b.png)

続いてプロパティシート > イベント > クリック時 を[イベントプロシージャ]を選択し
「・・・」を選択します。
![image34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/5c0ecc9c-1789-1796-b3cf-dbe3b5fd1d35.png)

VBEが表示されると思いますので、検索ボタンクリック時の処理を記入します。

### 検索ボタンクリック
```VB
Private Sub 検索ボタン_Click()

    'テキストボックスが空だとNULL扱いになるので空白を代入する
    If IsNull(Me.txtSearch.Value) Then
        Me.txtSearch.Value = ""
    End If

    Get_Search (Me.txtSearch.Value)

End Sub
```
#### 解説
検索する文字列が空の状態で「検索ボタン」をクリックされると
NULL扱いとなってしまうので、空でクリックされた場合は、
Me.txtSerch.Value = ""
としてNULL値を回避します。

その後Get_Serch(引数)を呼んで実際の一覧表示を変更したいと思います。
下記のGet_Serchを検索ボタン_Click()の下へ追加します。

### Get_Serch(引数)
```VB
Private Sub Get_Search(searchVal As String)

    ' ボタン毎で検索結果(SQL)が異なる
    If SearchColumn.Value = "全て" Then
        '検索列が「全て」の場合は、全レコードから絞り込む
        SQL = ""
        SQL = SQL & "SELECT           " & vbCrLf
        SQL = SQL & "*                " & vbCrLf
        SQL = SQL & "FROM             " & vbCrLf
        SQL = SQL & "T_単語テーブル    " & vbCrLf
        SQL = SQL & "WHERE            " & vbCrLf
        SQL = SQL & "ID LIKE " & "'*"   & txtSearch.Value & "*'" & " Or " & vbCrLf
        SQL = SQL & "単語 LIKE " & "'*" & txtSearch.Value & "*'" & " Or " & vbCrLf
        SQL = SQL & "読み LIKE " & "'*" & txtSearch.Value & "*'" & " Or " & vbCrLf
        SQL = SQL & "特徴 LIKE " & "'*" & txtSearch.Value & "*'" & " Or " & vbCrLf
        SQL = SQL & "カテゴリ LIKE " & "'*" & txtSearch.Value & "*'" & " Or " & vbCrLf
        SQL = SQL & "登録者 LIKE " & "'*" & txtSearch.Value & "*'" & " Or " & vbCrLf
        SQL = SQL & "更新日 LIKE " & "'*" & txtSearch.Value & "*'"

    Else
    
        '検索列が「全て」以外の場合、検索したい文字列から絞り込む
        If searchVal <> "" Then
                'テキストボックスに値が入っていれば、条件検索
                SQL = "select * from T_単語テーブル where " & SearchColumn.Value & " LIKE " & "'*" & txtSearch.Value & "*'"
        Else
                'テキストボックスに値が入っていない or 検索解除ボタンなら、全件検索
                SQL = "select * from T_単語テーブル"
        End If
        
    End If

    'Recordsetを開く
    Set myRecordset = CurrentDb.OpenRecordset(SQL)
    Me.F_単語一覧.Form.RecordSource = SQL
    'Recordsetを閉じる
    myRecordset.Close

End Sub
```

#### 解説
検索ボタンがクリックされた際に、対象列が「全て」となっている場合、
「全て」という文字列が「Get_Search」に引数として渡されます。
この場合「T_単語テーブル」の列全てに対して「検索文字列」が対象(あいまい検索)となります。
一方で、「単語」や「読み」が対象となっている場合は、その列のみが検索対象となります。

### 検索してみる
まずは検索列が「全て」の状態で「山」と検索してみます。
登録者「山田」さんがいますので、レコード2件が抽出されます。
![kensaku01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/cfc74cc5-0fef-763e-0629-5522a45df1b4.png)

次に検索列を「読み」へ変更し、「とい」と検索してみます。
読み「といぷーどる」が存在しますので、レコード1件のみが抽出されます。
![kensaku02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/75d74921-494d-210c-aef6-785b0bd0f661.png)

思っていた通りの検索が出来るようになったので、検索処理は一旦完了とします。

##トップページの作成
続いてトップページを作成したいと思います。
・トップページ → 一覧画面
・一覧画面 ← トップページ
としてお互いが画面遷移出来るようにします。

### メインフォームを作成する
作成 > フォームデザインをクリックします。
真っ新なフォームが新規作成されるので、下記のような形で作成します。
※登録ボタンは今回使用しませんが、作成だけしています。
<img width="450" alt="MainF01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/fd6419e5-cad4-273d-a22d-82228ca1df72.png">
**保存(Ctrl + s)を行い、名前を「F_メインフォーム」として保存しました。**

### トップページから一覧画面へ遷移させる
F_メインフォーム内の「単語一覧表」をクリックし、
・プロパティーシート > イベント > クリック時 > イベントプロシージャ
とします。
その後「・・・」をクリックしVBEを開きます。
VBEが表示されたら、クリックイベントを下記のように設定。

```VB
Private Sub WordList_Click()
    DoCmd.OpenForm "F_単語一覧"
End Sub
```
これでトップページから「単語一覧表」ボタンクリック時に一覧画面へ遷移するようになります。
続いて逆パターン(一覧画面からトップページ)を作成します。

### 一覧画面からトップページへ遷移させる
一覧画面に「メインフォームへ」というボタンを作成します。
※プロパティーシート > 名前を「ToMainF」としています。
![kensaku03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872070/6e9b5f13-f0db-5842-f92d-81bda1010e23.png)
先ほどと同じように、作成した「メインフォームへ」ボタンに下記の設定を行います。
・プロパティーシート > イベント > クリック時 > イベントプロシージャ
・「・・・」をクリックしVBEを開きます。
VBEが表示されたら、クリックイベントを追加。

```VB
Private Sub ToMainF_Click()
    DoCmd.OpenForm "F_メインフォーム"
End Sub
```
これで一覧画面からトップページへも遷移可能となりました。

# レコードの修正・追加について
今回は一覧画面からデータの追加を行いましたが、登録画面を作成し
それぞれの項目を入力 > 登録ボタンでレコード追加
としたい場合は下記が参考になるかと思います。
[参考サイト - Accessの登録ボタン解説](https://pc.arthhuman.com/data-add/)

他にも様々な方がWeb上に公開しているので、参考サイトはたくさんありますね。

# 終わりに
Accessの事を何も知らない状態から作成した内容となっておりますので、
使い方を間違えている点や、もっと効率の良い作成方法も多々あるかと存じます。

今回初めてAccessに触れてみて、直感的に使用するのは大分難しいと感じる反面、
VBAに関しては各イベント毎の記述がしやすかったり、綺麗なフォームを容易に作成出来たりと
可能性も感じることが出来ました。

今後はAccessも自分のスキルの1つとして、もっと色んなツール(社内の人が使ってくれるような)
を作成してみたいと思います。

最後までお読みくださりありがとうございました。