私の質問はTable_1とTable_2という名前の次の2つのアクセステーブルに関連しています。アクセスVBA:動的列を連結してループ内で実行
以下のコードは、同じテーブルの他の二つの列を連結することによって、[Table_2.CombinedField]列を更新することを目的とします。 2つの列の1つは[Table_2.BookName]でなければならず、もう1つの列はTable_1で定義されています。
たとえば、Table_1で見られるように、新規BookTypeはAuthorを使用してBookNameと連結し、Research BookTypeはPublishYearなどを使用する必要があります。つまり、Table_2の連結に使用する列はTable_1に基づいています。 理想的には、以下のコードのターゲット結果は次のようになります。
CombinedField
トム - titleA
ジョン - titleB
2010 - titleC
2011から
company5題し - titleE
しかし、上記のTable_2のTable_2.CombinedFieldを参照してください。コードはTable_1(Author)の最初の行のみを使用し、Table_2のすべての行に適用されます。
Function CombineVariableFields_NoLoop()
On Error Resume Next
Dim ws As Workspace
Dim strSQL As String
Dim fieldname As String
fieldname = DLookup("[SelectCombineField]", "Table_1")
Set ws = DBEngine.Workspaces(0)
Set db = CurrentDb()
On Error GoTo Proc_Err
ws.BeginTrans
strSQL = "UPDATE Table_2 INNER JOIN Table_1 ON Table_2.BookType = Table_1.BookType SET Table_2.CombinedField = [Table_2]![" & fieldname & "] & ' - ' & [Table_2]![BookName]"
db.Execute strSQL, dbFailOnError
ws.CommitTrans
Proc_Exit:
Set ws = Nothing
Exit Function
Proc_Err:
ws.Rollback
MsgBox "Error updating: " & Err.Description
Resume Proc_Exit
End Function
私の質問
私はループのようなものを使用する必要がありますね。しかし、私はこのシナリオでどのようにコードにループを適用すべきか分かりません。 (申し訳ありません、私はVBAを初めて使っています)。以下のコードはTable_2.CombinedFieldのターゲット結果を生成するために正確なコードが何であるべきかを指摘してくれる人が助けてくれれば幸いです。どうもありがとう。
次のコードこれはBESTの方法ではないかもしれないが、それは動作するはず
Function CombineVariableFields_Loop()
On Error Resume Next
Dim ws As Workspace
Dim strSQL As String
Dim fieldname As String
Set ws = DBEngine.Workspaces(0)
Set db = CurrentDb()
On Error GoTo Proc_Err
ws.BeginTrans
Set rst = db.OpenRecordset("Select distinct SelectCombineField FROM Table_1", dbOpenDynaset)
With rst
Do While Not .EOF
fieldname = DLookup("[SelectCombineField]", "Table_1", "BookType = " & DLookup("BookType", "Table_2"))
strSQL = "UPDATE Table_2 INNER JOIN Table_1 ON Table_2.BookType = Table_1.BookType SET Table_2.CombinedField = [Table_2]![" & fieldname & "] & ' - ' & [Table_2]![BookName]"
db.Execute strSQL, dbFailOnError
.MoveNext
Loop
End With
ws.CommitTrans
Proc_Exit:
Set ws = Nothing
Exit Function
Proc_Err:
ws.Rollback
MsgBox "Error updating: " & Err.Description
Resume Proc_Exit
End Function
それは動作します!どうもありがとう!! – Will