Lesson8 非連結フォームからレコードを操作する【レコード追加編】

スポンサーリンク

テーブルを1つ、フォームを1つ用意します。

テーブルの名前は、基本情報とします。テーブルのフィールドは以下のとおり設定してください。

なお、テーブルのフィールドには書式設定やIMEの入力モードを指定する箇所がありますが、非連結フォームを使用する場合、これらは使用しません。

仮に使用してもフォームには反映しません。


フィールド名 属性 備考
ID 長整数型 各人ごとに振られたIDを保存します。
氏名 テキスト型 漢字氏名を保存します。
シメイ テキスト型 カナ氏名を保存します。
生年月日 日付/時刻型 生年月日を保存します。

続いてフォームを作ります。フォームの名前は入力画面とします。

フォームには4つのラベル、4つのテキストボックス、1つのボタンを設置しました。

テキストボックスの名前は上から txt_ID、txt_氏名、txt_シメイ、txt_生年月日。

ボタンの名前は、btn_追加 とします。

txt_生年月日には 書式に日付(S) をセットし、日付が入力されるようにしておきます。

フォームをデザインビューで開き、「クリック時」へ[イベントプロシージャ]を設定します。

設定できたら右にある「・・・」ボタンをクリックすると、VBEが起動しますので、以下のとおりコードを記述してください。

なお、Access2000、Access2002はデーターベースとのやり取りにADOを使用しているため、このページの下にある設定が必要です。

使用される際は、そちらの環境で十分テストのうえ使用してください。

Option Compare Database
Option Explicit

Dim db As DAO.Database
Dim strSQL As String

Private Sub btn_追加_Click()

Set db = CurrentDb
strSQL = "insert into 基本情報 (ID,氏名,シメイ,生年月日) " & _
        "values(" & Me.txt_ID & ",'" & Me.txt_氏名 & "','" & Me.txt_シメイ & "',#" & Me.txt_生年月日 & "#) "

db.Execute strSQL
End Sub

フォームビューに戻り、データを入力しましょう。

ID、氏名、シメイ、生年月日すべてが入力できたら追加ボタンを1回だけ押します。

今回のコードは入力チェックやエラー時の処理を入れていませんので、入力もれやミスの無いように入力してください。とくに生年月日はAccessが理解できる日付の形(西暦表示で年、月、日は/区切り)になっているか注意してください。

ではテーブル「基本情報」を見てみましょう。

なんと!フォームに入力したデータが追加されていますね。

レコードの追加ができました。

解説です

Dim db As DAO.Database →変数 db はデーターベースとして宣言します。
Dim strSQL As String →変数 strSQL を文字列として宣言します。
この部分は、DAO を使うための定型文と考えてください。
Set db = CurrentDb → DAO が操作するデーターベースを指定します。
CurrentDb とは、自身が保存されているmdbファイル(accdbファイル)を指します。
dbに他のmdbファイルを指定することで、別ファイルのデーターベースのレコードを操作することもできます。
strSQL = "insert into 基本情報 (ID,氏名,シメイ,生年月日) " & _
        "values(" & Me.txt_ID & ",'" & Me.txt_氏名 & "','" & Me.txt_シメイ & "',#" & Me.txt_生年月日 & "#) "

変数 strSQL に SQL文を組み立てて代入しています。

SQL文とは、データーベースを操作する命令文のことです。
ここでは、レコードの追加を行うので、追加クエリに相当するSQL文を組み立てています。

insertinto■[レコードを追加するテーブル名]■
([データを入力するフィールド名1],[データを入力するフィールド名2],…[データを入力するフィールド名n])■ 
values([フィールド名1に入力するデータ],[フィールド名2に入力するデータ],…[フィールド名nに入力するデータ])

■は半角スペースを表しています。

Me というキーワードがでてきました。これは、フォームに組み込まれたモジュールが使えるキーワードで、フォームの名前を Me で置き換えることができます。

Me.txt_ID とは、このフォーム(入力画面)にある txt_ID というテキストボックスの値を指しています。

ちなみに全く省略しない記述の仕方は、[Forms]![入力画面]![txt_ID].value です。

この例では変数 strSQL に代入された値は、

insert into 基本情報 (ID,氏名,シメイ,生年月日) values(1,’てすと 太郎’,’テスト タロウ’,#2014/08/10#) となります。

SQL文のルールですが、テキスト型のフィールドに値を入れる場合、「 ‘ 」(シングルクォーテーション)で値を囲みます。

同様に、日付/時刻型のフィールドに値を入れる場合、「#」(シャープ)で値を囲みます。

最後に、組み立てたSQL文をデーターベースに対して実行します。これで、指定したテーブルにレコードが追加されます。

db.Execute strSQL →指定したデーターベースに対して、変数 strSQL に代入したSQL文を実行せよ、という命令です。

では、次回は追加したレコードに対し、更新クエリを実行してレコードの内容を変更してみましょう。

Access2000、Access2002 ユーザー の設定について

[ツール]-[参照設定]を選択します。

その後、優先順位の上矢印をクリックし、Micosoft DAO 3.6 Object Library の優先順位を上げれるだけ上げます。

以上で、Access2000、Access2002で DAO を使用する準備ができました。

コメントをどうぞ!

  1. A より:

    この説明通りにまったく一緒のものを作成したのですが、テーブルに追加されません。
    どうしてでしょうか。

    • 和休 和休 より:

      Aさん、コメントありがとうございます。
      原因は色々考えられるのですが、すぐに回答は難しいです。
      ですが、私も最初の頃は、思ったように実行されなかった経験があります。
      そこで、私がハマったところを中心にチェックをお願いします。

      コマンドボタンクリック時にイベントプロシージャを設定していますか?
      →ボタンにコードが割り当てられていなくて、そもそも実行されていないことがありました。

      追加ボタンを押すと、何かエラーが表示されますか?もし、されるのであれば、そのメッセージを教えてください。解決の糸口になるかもしれません。

      ここまでがOKであれば、SQL文に問題があるかもしれません。

      テーブルのフィールド名とSQL文のフィールド名は一致していますか?
      →テーブルのフィールド名の前に空白が入っていたりしませんか?シメイは全角のカタカナになっていますか?

      SQL文の空白は、半角になっていますか?

      SQL文中のvaluesの前に半角スペースはありますか?

      テキスト型のフィールドへ追加するときは、値を半角のシングルクォーテーションで囲むルール、日付型のフィールドへ追加するときは、値を半角の#で囲むルールがあります。
      例: ’てすと 太郎’  #2014/08/10#

      これで問題なければ、1項目ずつ追加してみてください。

      フォーム上のtxt_IDに適当な数値を入力した状態で
      strSQL = “insert into 基本情報 (ID) ” & _
      “values(” & Me.txt_ID & “) ”
      db.Execute strSQL

      を実行してみてください。
      このSQL文を実行すると、基本情報テーブルのIDフィールドにtxt_IDに入力した値が入力され、その他のフィールドは空白が入力されます。

      これがうまくできれば、フォーム上のtxt_IDに適当な数値を入力し、txt_氏名に名前を入力した状態で、
      strSQL = “insert into 基本情報 (ID,氏名) ” & _
      “values(” & Me.txt_ID & “,'” & Me.txt_氏名 & “) ”
      db.Execute strSQL

      を実行してみてください。
      このSQL文を実行すると、基本情報テーブルのIDフィールドにtxt_IDに入力した値が入力され、氏名フィールドにtxt_氏名に入力した名前が入力され、その他のフィールドは空白が入力されます。

      このようにして、どこのフィールドを追加しようとしたときにエラーが生じるか検証してみてください。
      よろしくお願いします。

タイトルとURLをコピーしました