使いやすいように設計された Microsoft リレーショナル データベース管理システムのファミリ。
> 一旦、インポートデータを「取込テーブル」いれ、その後、> vbaにクエリを作成して「登録テーブル」を上書きする
(標準モジュール)
Public Sub T更新()
On Error GoTo Err_T更新
Dim ws As DAO.Workspace
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim mysql As String
Set ws = DBEngine.Workspaces(0)
Set db = CurrentDb
mysql = "SELECT [登録].[text1] AS [登録テキスト], [取込].[text1] AS [取込テキスト]" & _
" FROM [登録] INNER JOIN [取込] ON [登録].[ID] = [取込].[ID];"
Set rs = db.OpenRecordset(mysql, dbOpenDynaset)
If rs.EOF = True Then
Debug.Print "更新対象となるレコードはありません。"
rs.Close
Set rs = Nothing
db.Close
Set db = Nothing
Set ws = Nothing
Exit Sub
End If
ws.BeginTrans
On Error GoTo ErrOnTrans_T更新
Debug.Print "トランザクション処理を開始します。"
Do Until rs.EOF = True
rs.Edit
rs![登録テキスト] = rs![取込テキスト]
rs.Update
rs.MoveNext
Loop
ws.CommitTrans
On Error GoTo Err_T更新
Debug.Print "コミットしました。"
Exit_T更新:
On Error Resume Next
rs.Close
Set rs = Nothing
db.Close
Set db = Nothing
Set ws = Nothing
Exit Sub
ErrOnTrans_T更新:
ws.Rollback
Debug.Print "更新中に実行時エラーが発生したため、ロールバックしました。"
Err_T更新:
MsgBox Err.Number & ": " & Err.Description, vbCritical, "実行時エラー(T更新)"
Resume Exit_T更新
End Sub
> Dim rs As DAO.Recordset> 9行目の「 rs.text1 = 取込.text1」 で「メソッドまたはデータメンバーが見つかりません」と表示されます。
・DAO.Recordset オブジェクトに text1 という名前のメンバーは存在しない。
・ . 演算子だけでは Fields コレクションのアイテムにアクセスすることは出来ない。
(記述例 1 )
rs.Fields("text1") = "A"
(記述例 2 )
rs![text1] = "B"
> rs.text1 = 取込.text1
・[取込]という変数は(少なくともプロシージャレベルの)どこにも宣言されていない。
・[取込]という(暗黙的な)変数はどのレコードセットも参照していない。
> mysql = "select * from 登録 INNER JOIN 取込 ON 登録.ID = 取込.ID;"> rs.text1 = 取込.text1
・rs が返すレコードセットにおいて、[text1]という名前のフィールドが
選択対象として競合しているため、[text1]とだけ指定しても
両者の区別がつかず、テーブル名も含めなければ参照することができない。
(記述例 3 )
rs![登録.text1] = rs![取込.text1]
(但し上記のような書き方はあまり推奨しない。SELECT 文の中において、
それぞれの[text1]に別名をつけて明確に区別するようにした方がよい)
まあ今回のようなケースであれば、単純に UPDATE 文(更新クエリ)を
1 回実行すれば充分でしょう。
(別解)
Public Sub T更新2()
Dim db As DAO.Database
Dim mysql As String
Set db = CurrentDb
mysql = "UPDATE [登録] INNER JOIN [取込] ON [登録].[ID] = [取込].[ID]" & _
" SET [登録].[text1]=[取込].[text1];"
db.Execute mysql, dbFailOnError
Debug.Print db.RecordsAffected & " 件のレコードを更新しました。"
db.Close
Set db = Nothing
End Sub