首页 > 解决方案 > Access 将 VBA 中的查询从多个源追加到一个表中,Access 2010

问题描述

我几乎从不发帖寻求帮助并尝试自己解决,但现在我被困住了。我只是想将多个表中的数据附加到一个表中。源表是每个美国州的数据集,每个州的附加查询都是相同的,除了要从每个州表中提取的嵌套选择脚本。所以我想创建一个 VBA 脚本,它为每个状态引用一个较小的脚本,而不是为每个状态引用一个完整的附加脚本。我不确定是否应该执行 SELECT CASE、FOR TO NEXT 或 FOR EACH NEXT 或 DO LOOP 或其他操作。

这是我到目前为止所拥有的:

tblLicenses 是一个包含 LicenseState 字段的表,我可以从中提取状态列表。


Function StateScripts()

    Dim rst As DAO.Recordset
    Dim qryState As String
    Dim StateCode As String
    Set rst = CurrentDb.OpenRecordset("SELECT LicenseState FROM tblLicenses GROUP BY LicenseState;")

'    and I've tried these, but they don't work

'    qryState = DLookup("LicenseState", "tblLicenses")

'    qryState = "SELECT LicenseState INTO Temp FROM tblLicenses GROUP BY LicenseState;"

'    DoCmd.RunSQL qryState


    Select Case qryState
        Case "CT"
            StateCode = "CT"
            StateScripts = " SELECT [LICENSE NO] AS StateLicense, [EXPIRATION DATE] AS dateexpired FROM CT "
        Case "AK"
            StateCode = "AK"
            StateScripts = " SELECT [LICENSE] AS StateLicense, [EXPIRATION] AS dateexpired FROM AK "
        Case "KS"
            StateCode = "KS"
            StateScripts = " SELECT [LicenseNum] AS StateLicense, [ExpDate] AS dateexpired FROM KS "
    End Select

    CurrentDb.Execute " INSERT INTO TEST (  StLicense, OldExpDate, NewExpDate ) " _
         & " SELECT State.StateLicense as StLicense, DateExpire AS OldExpDate, State.dateexpired AS NewExpDate " _
         & " FROM ( " & StateScripts & " ) AS State " _
         & " RIGHT JOIN tblLicenses ON (State.StateLicense = tblLicenses.LicenseNum) " _
         & " GROUP BY  State.StateLicense, DateExpire, State.dateexpired " _
         & " HAVING (((LicenseNum) Like '*" & StateCode & "*') ; " 
End Function

标签: vbams-accessselectappendcase

解决方案


听起来您正在处理对相同信息使用不同列名的输入源,并且您正在努力将其全部合并到一个表中。我将假设您正在处理 50 个每隔一段时间更新一次的文本文件。

这是您可以处理此项目的一种方法...

使用 VBA 构建文件名集合(Dir()在特定文件夹中使用)。然后遍历文件名的集合,执行以下操作:

  1. 使用 VBA 将文件添加为链接表,保留列名。
  2. 遍历TableDef对象中的列并将变量设置为列的实际名称。(见下面的示例代码)
  3. 构建一个简单的 SQL 语句,将链接表插入到列出所有当前许可证到期日期的单个表中。

以下是一些有关如何处理此问题的示例代码:

Public Sub Example()

    Dim dbs As Database
    Dim tdf As TableDef
    Dim fld As Field
    Dim strLic As String
    Dim strExp As String
    Dim strSQL As String

    Set dbs = CurrentDb
    Set tdf = dbs.TableDefs("tblLinked")

    ' Look up field names
    For Each fld In tdf.Fields
        Select Case fld.Name
            Case "LICENSE", "LICENSE NO", "License Num"
                strLic = fld.Name
            Case "EXPIRATION", "EXPIRATION DATE", "EXP"
                strExp = fld.Name
        End Select
    Next fld

    If strLic = "" Or strExp = "" Then
        MsgBox "Could not find field"
        Stop
    Else
        ' Build SQL to import data
        strSQL = "insert into tblCurrent ([State], [License],[Expiration]) " & _
            "select [State], [" & strLic & "], [" & strExp & "] from tblLinked"
        dbs.Execute strSQL, dbFailOnError
    End If

End Sub

现在有了组合了所有新数据的新表,您可以构建更复杂的分组查询来生成最终输出。我喜欢这种方法,因为我更喜欢在可视化构建器中而不是在 VBA 代码中管理更复杂的查询。


推荐阅读