この課題は、今までに学習してきたプログラムを、組み合わせるだけで作ることができます。各ステップごとの要点を理解している人は、多分できたと思います。
プログラムはいろんな書き方ができるので、答えは一つではありません。あなたなりの方法でできたのなら、それも正解です。
できなかった人も大丈夫です。以下の回答例を読んで、理解を深めてください。答えを見ると、「なーんだ」と簡単に思うかもしれません。
【1】Accessのファイル「SampleDB020.mdb」を起動し、更新前の「T01Prefecture2」を用意します。
【2】以下のように、標準モジュール「test7」の editDataTest() を完成させます。
Sub editDataTest()
Dim db As DAO.Database
Set db = CurrentDb
Dim rs As DAO.Recordset
Set rs = db.OpenRecordset("T01Prefecture2")
Do Until rs.EOF
If rs!PREF_CD >= 40 Then
rs.Edit
rs!PREF_NAME = "*" & rs!PREF_NAME & "*"
rs.Update
End If
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
db.Close
Set db = Nothing
Debug.Print "レコードを更新しました。"
dispDataTest
End Sub
*赤枠の部分が、前回の課題だったところです。
【3】イミディエイト ウィンドウから editDataTest() を実行してください。
editDataTest
*この Subプロシージャは引数が無いので、 Call と ()カッコ は省略できます。
【4】更新のメッセージと、レコードの一覧が表示されました。
【5】イミディエイト ウィンドウをスクロールすると、特定のレコードだけが更新されています。
【6】テーブル「T01Prefecture2」側でも、レコードが更新されていることを確認してください。
【7】editDataTest() を繰り返し実行すると、「*」アスタリスクがどんどん増えますが・・・
【8】何度も実行すると、文字数がオーバーしてエラーが出ます。
エラーの原因は、PREF_NAME のフィールドサイズが「10文字」までだからです。「T01Prefecture2」を新しくコピーし直すと、再び実行できます。
【解説】
基本的な考え方は、レコードを1件ずつ取り出して、条件に合うレコードの場合だけ、更新処理を行なえばできるはずです。
それでは今回追加したプログラムを分解して説明します。
(1)レコードの終端になるまで、1件ずつ処理を繰り返している部分です。
Do Until rs.EOF
ここに処理
rs.MoveNext
Loop
(2)PREF_CD が 40 以上の場合だけ、処理を行なっている部分です。
If rs!PREF_CD >= 40 Then
ここに処理
End If
*条件に満たないレコードは何もしません。
(3)実際に PREF_NAME を更新している部分です。
rs.Edit
rs!PREF_NAME = "*" & rs!PREF_NAME & "*"
rs.Update
PREF_NAME の値を取得して、前後に「*」を加え、また PREF_NAME に代入しています。
とりあえずこれで目的は達成できました。
プログラミングで大事なことは、どんな方法でもよいので、まず目的の処理が行なえることです。一つの方法ができてから、次はもっと効率が良い方法がないか考えます。
初心者のうちは、最初から効率の良いプログラムを書こうとすると、難しくなります。まずは「とりあえずできること」が大切です。改良は後からいくらでもできます。