そのため先にレコードを検索する方法を学びました。あとは少しプログラムを変更するだけで、簡単にレコードを更新できます。
【1】Accessのファイル「SampleDB020.mdb」を起動し、テーブル「T01Prefecture」を開きます。
【2】最後のレコードが、「99 ハワイ」になっていることを、確認しておいてください。
これからこのレコードを、練習で更新しますので、無い場合は作成しておいてください。
レコードを確認したらテーブルを閉じます。
【3】続いて VBE を起動し、標準モジュールの test6 を表示します。
*VBEは「Altキー」+「F11キー」で起動できます。
【4】「test6」に以下のように、Subプロシージャ editData() を追加します。
Sub editData(pCd As Integer, pName As String)
Dim db As DAO.Database
Set db = CurrentDb
Dim rs As DAO.Recordset
Set rs = db.OpenRecordset("T01Prefecture")
rs.Index = "Primarykey"
rs.Seek "=", pCd
If rs.NoMatch Then
Debug.Print "該当するレコードは見つかりませんでした。"
Else
rs.Edit
rs!PREF_NAME = pName
rs.Update
Debug.Print "レコードを更新しました。"
dispData
End If
rs.Close
Set rs = Nothing
db.Close
Set db = Nothing
End Sub
プログラムの準備ができたら、実行してみましょう。
【5】イミディエイト ウィンドウから editData() を実行してください。
call editData(99, "グアム")
*1番目の引数には、テーブルに存在する PREF_CD を指定します。
【6】更新のメッセージと、レコードが表示されました。
・PREF_CD が 99 の場合
・PREF_CD が 100 の場合(存在しない)
【7】イミディエイト ウィンドウをスクロールすると、レコードが更新されていることが確認できます。
【8】テーブル「T01Prefecture」を開き、レコードが更新されていることを確認してください。
【9】editData()を使って、レコードを更新する練習をしてください。
PREF_CD が 1~47 までは今後も使いますので、更新しないでください。あらかじめ練習用に、addData() で新しいレコードを追加しておくとよいと思います。
【解説】
(1)前回の seekData() とほとんど同じです。変更箇所を赤枠で囲んでみました。
(2)イミディエイト ウィンドウから、editData() を引数を指定して呼び出しています。
call editData(99, "グアム")
1番目の引数は整数型です。PREF_CD はテーブルに存在する値を使います。2番目の引数は文字列型なので、半角の「"」ダブルクォーテーションで囲みます。
(3)整数型(Integer)と文字列型(String)の引数を、2つ受け取ります。
Sub editData(pCd As Integer, pName As String)
(4)前回とまったく同じですが、インデックスにプライマリーキーを指定し、レコードを検索しています。1番目の引数を検索条件として使っています。
rs.Index = "Primarykey"
rs.Seek "=", pCd
重要なことは、この時点で「対象となるレコードに移動済み」だということです。しかも主キーのフィールドで検索しているので、見つかるレコードは必ず1件だけです。
(5)実際にレコードを更新している部分です。
If rs.NoMatch Then
Debug.Print "該当するレコードは見つかりませんでした。"
Else
rs.Edit
rs!PREF_NAME = pName
rs.Update
Debug.Print "レコードを更新しました。"
dispData
End If
レコードが見つからなかった時に、条件式の rs.NoMatch が 真 (True) になります。
もしレコードが見つからなかったらメッセージを表示して、見つかったら都道府県名を更新するという処理です。
Recordsetオブジェクトに対して操作を行なっています。Edit から Updatete までをセットで覚えてください。
rs.Edit で編集を開始して、rs.Update で保存します。Updateを忘れると、テーブルに反映されませんのでご注意ください。
2番目の引数で、レコードのデータを更新しています。そして最後に確認のため、dispData でレコードを表示しています。
【ワンポイント】
新旧の番号を引数で渡すように改良すれば、PREF_CD も更新できますが、主キーのフィールドを更新するのはあまり良くないので、PREF_NAMEだけ更新しています。