访问 VBA:连接动态列并循环执行

Posted

技术标签:

【中文标题】访问 VBA:连接动态列并循环执行【英文标题】:Access VBA: Concatenate dynamic columns and execute in loop 【发布时间】:2016-04-12 18:17:52 【问题描述】:

我的问题与以下两个 Access 表有关,分别命名为 Table_1 和 Table_2。

以下代码旨在通过连接同一个表的其他两个列来更新 [Table_2.CombinedField] 列。两列之一必须是 [Table_2.BookName],另一列在 Table_1 中定义。 例如,在Table_1 中可以看到,小说BookType 应该使用Author 与BookName 连接,研究BookType 应该使用PublishYear 等。这意味着Table_2 中用于连接的列基于Table_1。 理想情况下,以下代码的目标结果应该是:

组合字段 汤姆 - 标题A 约翰 - 标题B 2010 - 标题C 2011 - 标题D company5 - 标题E

但是,正如您在上面的 Table_2 屏幕截图中看到的 Table_2.CombinedField。该代码仅使用了 Table_1(作者)的第一行,并适用于 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 生成我的目标结果,我将不胜感激。非常感谢。 以下代码只是我的猜测

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

【问题讨论】:

【参考方案1】:

试试这个:

Set rst = db.OpenRecordset("Select SelectCombineField, BookType FROM Table_1 Where BookType In(Select Distinct BookType From Table_2)", dbOpenDynaset)
With rst
Do While Not .EOF
   strSQL = "UPDATE Table_2 SET Table_2.CombinedField =  [Table_2].[" & !SelectCombineField & "] & ' - ' & [Table_2].[BookName] Where BookType = '" & !BookType & "'"
   db.Execute strSQL, dbFailOnError
   .MoveNext
Loop
End With

【讨论】:

【参考方案2】:

这可能不是最好的方式,但应该可以:

 "UPDATE Table_2 a INNER JOIN Table_1 b ON a.BookType = b.BookType" _
      & "SET Table_2.CombinedField = " _
           & "Iif(b.[SelectCombinedField = 'Author', a.[Author], " _
               & " Iif(b.[SelectCombinedField = 'PublishYear', a.[PublishYear], " _
                    & "a.[Publisher])) & ' - ' & a.[BookName]"

【讨论】:

对于这个例子来说,比Iif更好的是Switch,但是两者都需要在条件下使用table_1中的值......,代码会做几个简单的更新并且不需要写字段的名称.

以上是关于访问 VBA:连接动态列并循环执行的主要内容,如果未能解决你的问题,请参考以下文章

如何在数据表中动态创建列并为其赋值?

翻转具有动态列并修复行的表 sql 服务器

WPF:动态隐藏网格列并不总是使用 Styles 或 IValueConverter 正常工作

WPF Datagrid 动态生成列 并绑定数据

在jquery数据表中动态添加列并插入数据

VBA选择某些列并应用公式