シェアする

知識ゼロから1時間でAccess検索システムを作成する手順

Accessでの検索システムは、下記の4つのステップをふむことで、作成することができます。


STEP1. 「テーブル」を作成する

STEP2. その「テーブル」をもとにした「クエリ」を作成する。

STEP3. その「クエリ」をもとにした「フォーム」を作成する。

STEP4. 検索キーワードを入力する検索用の「フォーム」を作成する。


「テーブル」というのは、Excelの表のように、実際にデータを格納するものです。
「テーブル」の各行を「レコード」と呼び、各列を「フィールド」(項目)と言います。

「クエリ」は、テーブルをもとにした見かけ(テーブルの特定のフィールドだけを表示したり、テーブルの特定のフィールドで並べ替えをして表示したり)を定義するものです。

「フォーム」は、テーブルやクエリをもとに人間が操作しやすいようにデータを配置したり、検索キーワードを入力する場所を定義するものです。

システムを使う人(ユーザー)には、フォームだけを操作してもらうようにします。

今回作成する検索システムは、下記のようなイメージになります。

黒矢印は、データの継承関係を示し、赤矢印は、フォーム間の遷移を示しています。

実際にデータが入っているのは、「テーブル」だけです。

その「テーブル」に入っているデータを「クエリ」や「フォーム」といった窓(見かけを作る仕組み)を通して見ているといったイメージです。


下記においては、複数の「氏名」が保存されたテーブルから、特定の「氏名」を検索するという単純なシステムの作り方を説明しています。

まずは、実際に手を動かして、このシステムを作成することで、全体的なイメージをインプットし、その後にAccessの解説本を読んで細かい知識を身につけるとよいと思います。

(おことわり)

本システムは、Access2003で作成しています。


それでは、ここから、検索システムの作成手順を説明します。

記事の最後の方に、本システムのサンプル.mdbをダウンロードできるようにしています。

手順1. データベースを作成します。

Accessを起動して、新規作成アイコンをクリックします。

スクリーンショット

空のデータベースをクリックします。

スクリーンショット

ファイル名に任意のデータベース名(ここでは、「検索」とします)を入力し、作成ボタンをクリックします。

スクリーンショット

下記のように、空っぽのデータベースが作成されます。

スクリーンショット

目次へ戻る

手順2. テーブルを作成します。

左側の「オブジェクト」欄で「テーブル」を選択します。次に「デザインビューでテーブルを作成する」を選択した状態で「デザイン」をクリックします。
スクリーンショット

下記の図のように、フィールド名(ID、氏名)と、データ型(オートナンバー型、テキスト型)を入力します。
ここでは、IDというテーブル内に固有(重複がない)の項目を設けました。
オートナンバー型は、1から順番に自動的に番号がふられるというデータ型で、自分で入力はしません。

データ型について、詳しく知りたい方は、こちらをクリックしてください。

「ID」という項目を主キーに設定します。
主キーは、固有の値(一つのテーブル内で重複しない値)の項目にしか設定できません。

「ID」の行をクリックして選択した上で、赤枠の「鍵マーク」アイコンをクリックします。

上の「テーブル」の画面の右上の×ボタンをクリックすると、下記のダイアログが表示されるので、「はい」をクリックします。

任意のテーブル名を入力して「OK」をクリックします。

下記のようにテーブルが作成されます。

スクリーンショット

「T_マスタ」テーブルをダブルクリックするとデータを入力する画面が展開するので下記の図のようにデータを入力します。

入力するのは、「氏名」の列だけです。「ID」は、オートナンバー型なので「氏名」を入力すると自動的に番号がふられます。

データの入力が終わったら、×ボタンで閉じます。

目次へ戻る

手順3. クエリーを作成します。

「オブジェクト」欄で「クエリ」選択します。次に「デザインビューでクエリを作成する」を選択した状態で、「デザイン」をクリックします。

スクリーンショット

クエリのもとになるデータ(ここでは、先ほど作成したテーブル「T_マスタ」)を選択して、「追加」ボタンをクリックし、その後「閉じる」ボタンをクリックします。

下図のように「T_マスタ」の各項目(「ID」と「名前」)をフィールド欄にドラッグアンドドロップします。

上の画面で×ボタンを押すと、保存するかどうかを聞いてくるので、「はい」をクリックします。

任意のクエリ名(ここでは、「Q_マスタ」とします)を入力してOKを押します。

すると、下記のように「Q_マスタ」というクエリが作成されます。

「Q_マスタ」をダブルクリックすると、クエリが開きます。。

今回、クエリについては、テーブルの全部のフィールドを順番を変えずに配置しており、抽出条件なども設定していないので、見た目は「T_マスタ」テーブルと同じになります。

見た目が「T_マスタ」と同じであることを確認したら閉じましょう

目次へ戻る

手順4. 表形式のフォームを作成します。

オブジェクト欄の「フォーム」を選択した状態で、「新規作成」をクリックします。

スクリーンショット-3

「オートフォーム:表形式」を選択し、基になるテーブルまたはクエリの選択で、「Q_マスタ」を選択し、「OK」ボタンをクリックします。

スクリーンショット

「Q_マスタ」を基にした表形式のフォームが表示されます。


上の画面の×ボタンをクリックすると、下記のダイアログが表示されるので「はい」をクリックします。

名前を付けて保存ボックスが表示されるので、任意のフォーム名(ここでは、「F_表形式」とします)を入力してOKをクリックします。

「F_表形式」というフォームが作成されます。

目次へ戻る

手順5.単票形式のフォームを作成します。

オブジェクトとして「フォーム」を選択した状態で「新規作成」をクリックします。

「オートフォーム:単票形式」を選択し、基になるテーブルまたはクエリ(ここでは、「Q_マスタ」)を選択して「OK」をクリックします。

下記のような単票フォームが作成されます。

上の画面で×ボタンをクリックすると、下記のダイアログが表示されるので「はい」をクリックします。

任意のフォーム名を入力して「OK」をクリックします。

すると、「F_単票形式」というフォームが作成されます。

目次へ戻る

手順6. 検索フォームを作成します。

「氏名」を検索キーワードとする入力フォームを作成する手順を説明します。

オブジェクトは、「フォーム」を選択した状態で、「新規作成」をクリックします。

「デザインビュー」を選択して、OKを押します。

スクリーンショット

下記のような何もないフォーム画面が表示されます。

「ツールボックス」のテキストボックス「ab|」をクリックして、フォーム上でもう一度クリックします。

検索キーワードなどのテキスト(文字)を入力する部分のことを「テキストボックス」と言います。

すると、下記の画面が表示されます。

この画面「テキストボックスウィザード」は、テキストボックスの文字のサイズや表示の仕方などを設定する画面ですが、後で変更することもできるので、ここでは、そのままの設定で「次へ」をクリックします。

すると、次の画面が表示されます。

この画面では、テキストボックスの入力モードを設定します。氏名は、日本人名を漢字入力をすることを想定し、赤枠のように設定します。そして、「次へ」をクリックします。

すると、下記の画面が表示されます。

この画面では、任意のテキストボックス名を入力して、「完了」をクリックします。

このテキストボックス名は、同一フォーム上では、重複してはいけません。

あとで、でてくるプログラム(VBA)などでも、このテキストボックス名を指定する場面がありますので、非常に重要です。

すると、下記のように、フォーム上にテキストボックスが配置されます。

ツールボックスの「ボタン」アイコンをクリックして、フォームの上でもう一度クリックします。

コマンドボタンウィザードが起動しますが、ここではキャンセルをクリックして閉じます。

フォーム上にボタンが配置されるので、ボタンの上で右クリックをし、プロパティを選択します。

「名前」と「標題」を任意の文字(ここでは、両方とも「検索」とします)に変更します。
つぎに、「クリック時」の右空白欄をクリックすると、右端に…ボタンが表示されるので、それをクリックします。


ビルダの選択ボックスが展開されるので、コードビルダを選択して、OKを押します。

スクリーンショット

VBAエディターが開くので、赤枠のようにコードを書きます。

入力が終わったら、Visual Basic エディタの×ボタン(赤矢印のところ)をクリックして閉じます。


ここで、上記のコードについて、説明します。

本来 DoCmd.OpenForm命令の形式は、

OpenForm “FormName”, View, FilterName, WhereCondition, DataMode, WindowMode, OpenArgs

となりますが、

今回は、WhereConditionの部分だけを設定し、青字の部分のパラメータが省略されています。設定したWhereConditionよりも前のカンマ,は省略できませんが、WhereConditionより後ろのカンマ,は省略することができます。

DoCmd.OpenFormについて詳しく知りたい方は、こちらをクリックしてください。

DoCmd.OpenForm “F_表形式”は、「F_表形式」というフォームを開きなさいという意味になります。

その時の条件として、「”氏名 like ‘*” & Me!氏名 & “*'”」が設定されているわけです。

ここで、この条件文を色分けしてみます。

氏名 like ‘* & Me!氏名 & *’

まず青字の部分、「氏名 like ‘*」と「*’」は、そのままの文字列として認識します。そして、そのままの文字列として認識する場合は、文字列 のように ダブルクォーテーッション”  “ で囲います。

次に、赤字の部分、「Me!氏名」は、文字列そのものではなくデータ変数(山田や山本など、中身が変わる)として認識します。データ変数は、文字列のように ” ” で囲みません。

さらに、

Meというのは、このプログラムを実行させる「検索」ボタンが設置されているフォーム自身を意味します。

!は、その中にあるという意味です。

まとめると、

「Me!氏名」=今作成中の検索フォーム上の「氏名」テキストボックス

となります。

したがって、たとえば、検索フォームの「氏名」テキストボックスに「山田」と入力した場合には、

Me!氏名」のデータ内容は、「山田」ということになります。

また、「文字列」と「データ変数」を結合するときは、アンパサンド &でつなぐという決まりがあります。

したがって、Me!氏名というデータ変数を具体的な文字列「山田」に置き換えた場合は、すべてが文字列になるので、「&」は必要なくなるわけです。

結果

(置き換え前) 氏名 like ‘* & Me!氏名 & *’“ 

(置き換え後) 氏名 like ‘*山田*’

という条件文になります。

解釈すると、

「氏名」(これから開かれるフォーム「F_表形式」にある「氏名」テキストボックス)が、山田という文字を含んでいたら」

という条件文になります。

ここで、山田の前後の*は、任意の文字を意味し、like文とあわせて部分一致の条件を表しています。

さらに、山田の前後のアスタリスク * * のさらに外側のシングルクォーテーション ‘  ‘ は、データ型が「テキスト型」の場合につけなければならない決まりになっています。

「任意の文字列+山田+任意の文字列」は、テキスト型なので、シングルクォーテーション’ ‘で囲うわけです。

ちなみに、「氏名」もテキスト型です。

「F_表形式」上の「氏名」は、テキスト型として定義された「T_マスタ」テーブルの「氏名」フィールドを継承した「Q_マスタ」クエリの「氏名」を元データとしているからです。

抽出条件は、データ型が同じものでなければ指定できません。

今回は、

「F_表形式」フォームの「氏名」と
検索フォームの「Me!氏名」が

両方ともテキスト型なので条件指定ができます。

異なるデータ型(テキスト型と数値型)を比較したりすると、データ不一致エラーになります。


続いて、下記画面の×ボタンをクリックします。

すると、下記ダイアログが表示されるので、「はい」をクリックします。

任意のフォーム名を入力して「OK」をクリックします。

すると、「F_検索」というフォームができます。


<動作テスト>

ここまでに作成したフォームが、どのように動作するのかテストしてみましょう。

まず、「F_検索」をダブルクリックして検索フォームを立ち上げます。

「氏名」テキストボックスに「山田」と入力して、「検索」ボタンをクリックします。

すると、「山田」という文字が含まれる人の氏名が表示されます。

目次へ戻る

手順7. 表形式のフォーム(複数候補フォーム)から単票形式のフォームへ移行するボタンを設置します。

<実現したい内容>

例えば、「山田」という氏名の人のデータを検索した場合に、下記のような複数候補フォームが表示された場合に、「山田花子」を選択して単票形式のフォームを表示させます。

表形式のフォーム(複数候補フォーム)

スクリーンショット

単票形式のフォーム

スクリーンショット

<選択ボタンの設置手順>

「F_表形式」フォームを選択した状態で、「デザイン」をクリックします。

すると、「F_表形式」フォームがデザインビューで開きます。

氏名の右に「選択」というボタンを配置したいので、赤矢印のようにドラッグアンドドロップで、フォームの余白を広げます。

次に、ツールボックスの「ボタン」アイコンをクリックし、

フォームの配置したい位置でもう一度クリックします。

すると、「コマンドボタンウィザード」が表示されますが、ここでは、何も設定しないので「キャンセル」をクリックします。


次に、配置したボタンの上で右クリックして、「プロパティ」を選択します。

「名前」と「標題」を任意で入力します。(ここでは、ともに「選択」としました)

つぎに、クリック時にカーソルをあわせ、右端の…ボタンをクリックします。

「コードビルダ」を選択して、「OK」をクリックします。

スクリーンショット

赤枠のようなコードを入力します。


ここで、上記コードの抽出条件文について説明します。

まず、上記のコードの抽出条件の部分を色分けしてみます。

ID = & Me!ID

青字の部分 ID= は、文字列そのものとして認識し、赤字の部分Me!IDは、データ変数として認識します。

ここで、Me!IDは、「選択」ボタンを設置したフォーム上の「ID」を示しています。

この「ID」は、「T_マスタ」テーブルの数値型の「ID」フィールドを継承した「Q_マスタ」の「ID」を元にしています。

したがって、Me!IDは、数値型なので、テキスト型のデータのように、シングルクウォーテーション ‘  ‘で囲う必要はありません。

そして、文字列とデータ変数は、&でつなぐ必要があります。

前に説明したテキスト型のデータ変数「Me!氏名」を使った抽出条件と比べると下記のように、シングルクウォーテーションのありなしに違いがあることがわかります。

数値型の場合 テキスト型の場合
 データ変数を使った記述 ID = & Me!ID 氏名 like ‘* & Me!氏名 & *’
具体的な値を入れた時の例 ID = 1   氏名 like ‘*山田*’

入力が終わったら、赤矢印の×ボタンでVisual Basicエディターを閉じます。

さらに、「コマンドボタンのプロパティ」も×ボタンで閉じます。

続けて、「F_表形式」のデザインビューの×ボタンをクリックします。

すると、下記ダイアログが表示されるので「はい」をクリックします。

<動作テスト>

「F_検索」をダブルクリックして立ち上げます。

「氏名」のテキストボックスに「山田」と入力して、「検索」ボタンをクリックします。

すると、「山田」という文字を含む候補者(ここでは2名)が表形式で表示されます。

たとえば、「山田花子」の右の「選択」ボタンをクリックしてみます。

すると、「山田花子」の単票形式のフォームが開きます。

目次へ戻る

画面遷移の修正

ここまで説明したきたシステムでは、検索結果が1人でも複数人でも、表形式のフォームが開くような仕組みになっていました。

たとえば、「山本」という人は、1人しかいないのに「表形式」フォームを経由して「単票形式」フォームを開かなければなりません。

表形式フォーム

単票フォーム

しかし、検索結果が1人なのに表形式のフォームを経由して、単票形式のフォームを開くのは無駄な動きです。

そこで、検索結果が1人のときは、単票形式のフォームを開き、複数人のときは表形式のフォームを開いたほうがスマートです。

それを実現するのが、下記のVBAコードになります。

このコードを「F_検索」フォームの「検索」ボタンのクリック時に組み込めば、より効率的なシステムが出来ます。

このコード一つ一つについて、細かく説明すると非常に難しくなるので、大体のイメージを説明します。

そもそも、何がやりたかったのかというと、
検索結果が1人のときには、単票形式のフォームを開き、
検索結果が2人以上のときは、表形式のフォームを開かせようということでした。

そのためには、検索結果の人数を知る必要があります。

その検索結果の人数を調べるために、「レコードセット」というものを使う必要が出てきます。
「レコードセット」というのは、レコード(1つの行)のセット(集まり)を意味します。

その「レコードセット」というものを使うためには、ADOという仕組みを使わなければなりません。

そのことを前提として、上記のコードを説明します。


Dim cn As ADODB.Connection
Set cn = CurrentProject.Connection

この2行は、
「現在のデータベース(今自分が開いているデータベース)に接続しますよ。」
「そして、その接続しているという情報を「cn」という変数に入れておきますよ。」
ということを意味します。
「レコードセット」を使うためには、上のコードを書かなければいけないと覚えておきましょう。


Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset

この2行で、「レコードセットを使います。」「レコードセットを代入する変数は、rsとします。」
ということを意味します。


Dim rsCount As Double

これは、レコードの件数を保存しておく変数を、「rsCount」という名前で定義しています。


rs.Open “Q_マスタ”, cn, adOpenKeyset, adLockOptimistic

これは、先ほど定義したレコードセットを格納する変数「rs」に「Q_マスタ」を格納する。ことを意味します。
cnより後ろの設定は、複雑なので省きます。


If IsNull(Me!氏名) Then
MsgBox “氏名を入力してください。”
Me!氏名.SetFocus
Exit Sub
End If

「Me!氏名」は、「F_検索」フォームの「氏名」テキストボックスを意味します。
それが、IsNull(空白)だったら、
「氏名を入力してください。」というメッセージボックスを表示させ、
「F_検索」フォームの「氏名」テキストボックスのところに、カーソルを戻して、
プログラムを抜け出す(Exit Sub)
ことを意味します。


rs.Filter = “氏名 like ‘*” & Me!氏名 & “*'”

もともと「rs」には、「Q_マスタ」が入っています。それに対し、右辺の条件(「Q_マスタ」の「氏名」フィールドが、「F_検索」の「氏名」を含む)という条件を満たすものでフィルターをかけ(抽出し)、その結果を「rs」に代入します。


If rs.RecordCount = 0 Then
rsCount = 0
Else
rs.MoveLast
rsCount = rs.RecordCount
End If

「rs.RecordCount」(rsのレコード件数)が0だったら、rsCountに0を代入します。
そうでなかったら、
フィルターをかけられた後のレコードセット「rs」の最後の行へ移動させ、その位置の先頭からの行数(rs.RecordCount)をrsCountに代入します。


If rsCount = 0 Or IsNull(Me!氏名) Then
MsgBox “該当するデータがありません。”
Me!氏名.SetFocus
Else
If rsCount > 1 Then
DoCmd.OpenForm “F_表形式”, , , “氏名 like ‘*” & Me!氏名 & “*'”
ElseIf rsCount = 1 Then
DoCmd.OpenForm “F_単票形式”, , , “氏名 like ‘*” & Me!氏名 & “*'”
End If
End If

rsCountが0 もしくは、「F_検索」の「氏名」が空白だったら、
「該当するデータがありません」というメッセージボックスを表示させ、
「F_検索」の「氏名」にカーソルを移します。
そうでなかったら、
rsCountが1より大きい時は、「F_表形式」フォームを開き、
rsCountが1の時は、「F_単票形式」フォームを開く。


rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing

rsとcn変数を閉じて、メモリーを解放します。


細かい説明は、省いていますので、詳しく知りたい方は、
「ADO」と「レコードセット」について、学習してください。

時間がない方は、「レコードセットを使う時は、こういう風にコードを書くんだ。」と割り切って使うことも重要だと思います。

完全に理解しないと、使わないということでは、いつまでたっても検索システムを作ることができません。

Accessデータベースは、作りながら学んでいく。それが大事だと思います。

トライアンドエラーで頑張りましょう

目次へ戻る

サンプルダウンロード

下記のフォームにご自身のメールアドレスを入力して送信していただくと、ダウンロード用のパスワードを返信いたします。

メールアドレス