You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Access中VBA代码执行后无结果,未生成表或查询求助

解决Access VBA代码执行后无可见表/查询的问题

你的代码其实已经成功执行了交叉查询逻辑,但问题在于OpenRecordset只是在内存中创建了一个临时的记录集对象——它不会自动在Access的导航窗格里生成可查看的表或保存的查询,这就是你看不到结果的核心原因。

下面给你两种实用的解决方案,按需选择:

方案1:创建保存的交叉查询(导航窗格可见)

修改代码,用CreateQueryDef把交叉查询保存成一个命名查询,这样你就能在Access里直接查看、编辑或复用这个查询了:

Option Compare Database
Sub TransformX1()
    Dim strSQL As String
    Dim dbs As DAO.Database
    Set dbs = CurrentDb
    
    strSQL = ""
    strSQL = strSQL & "TRANSFORM Sum(BAR1.[TON]) AS SumOfTON " & vbCrLf
    strSQL = strSQL & "SELECT BAR1.[MABD], Sum(BAR1.[TON]) AS [Total Of TON] " & vbCrLf
    strSQL = strSQL & "FROM BAR1 " & vbCrLf
    strSQL = strSQL & "WHERE (((BAR1.[MABD])<1300) AND ((BAR1.[MAGH])<1300) AND ((BAR1.G)=1)) " & vbCrLf
    strSQL = strSQL & "GROUP BY BAR1.[MABD] " & vbCrLf
    strSQL = strSQL & "PIVOT BAR1.[MAGH];"
    
    ' 先删除已存在的同名查询(避免报错)
    On Error Resume Next
    dbs.QueryDefs.Delete "CrossQuery_BAR1"
    On Error GoTo 0
    
    ' 创建并保存查询
    dbs.CreateQueryDef "CrossQuery_BAR1", strSQL
    
    MsgBox "交叉查询已创建完成,可在导航窗格中找到!"
End Sub

方案2:将查询结果生成新表

如果需要把结果永久保存成数据表,可修改SQL为SELECT...INTO格式,直接生成新表:

Option Compare Database
Sub TransformX1_ToTable()
    Dim strSQL As String
    Dim dbs As DAO.Database
    Set dbs = CurrentDb
    
    strSQL = ""
    strSQL = strSQL & "SELECT * INTO CrossTable_BAR1 " & vbCrLf
    strSQL = strSQL & "FROM (" & vbCrLf
    strSQL = strSQL & "    TRANSFORM Sum(BAR1.[TON]) AS SumOfTON " & vbCrLf
    strSQL = strSQL & "    SELECT BAR1.[MABD], Sum(BAR1.[TON]) AS [Total Of TON] " & vbCrLf
    strSQL = strSQL & "    FROM BAR1 " & vbCrLf
    strSQL = strSQL & "    WHERE (((BAR1.[MABD])<1300) AND ((BAR1.[MAGH])<1300) AND ((BAR1.G)=1)) " & vbCrLf
    strSQL = strSQL & "    GROUP BY BAR1.[MABD] " & vbCrLf
    strSQL = strSQL & "    PIVOT BAR1.[MAGH]" & vbCrLf
    strSQL = strSQL & ");"
    
    ' 执行SQL创建表,出错时抛出提示
    dbs.Execute strSQL, dbFailOnError
    
    MsgBox "结果表已创建完成,可在导航窗格中找到!"
End Sub

额外调试小技巧

如果你只是想临时查看记录集内容,不需要保存成对象,可以在Set rst = dbs.OpenRecordset(strSQL)后添加这段代码,然后打开VBA编辑器的立即窗口(Ctrl+G)查看输出:

If Not rst.EOF Then
    rst.MoveFirst
    Do Until rst.EOF
        Debug.Print rst!MABD, rst![Total Of TON]
        rst.MoveNext
    Loop
End If
rst.Close
Set rst = Nothing

内容的提问来源于stack exchange,提问作者Mojtaba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:24:56