将导出子窗体访问到excel

问题描述 投票:0回答:1

我正在尝试编写一些VBA,以从子表单中导出过滤的记录。我发现了许多与此问题相关的帖子,并且从这些帖子中整理了下面的代码。

运行时,我收到运行时错误消息:

对象'__temp'已经存在。

当我单击调试时,它会突出显示该行

Set qrydef = db.CreateQueryDef(strTempQryDef, strSQL)

谢谢您的帮助。

Private Sub ExportSubform()

    Dim db As dao.Database
    Dim qrydef As dao.QueryDef

    Dim strSQL As String
    Dim bolWithFilterOn As Boolean
    Dim strTempQryDef As String
    Dim strRecordSource As String

    strTempQryDef = "__temp"

    bolWithFilterOn = me.subsearch_frm.Form.FilterOn

    strRecordSource = me.subsearch_frm.Form.RecordSource

    If InStr(strRecordSource, "SELECT ") <> 0 Then
        strSQL = strRecordSource
    Else
        strSQL = "SELECT * FROM [" & strRecordSource & "]"
    End If

    ' just in case our sql string ends with ";"
    strSQL = Replace(strSQL, ";", "")

    If bolWithFilterOn Then
        strSQL = strSQL & _
        IIf(InStr(strSQL, "WHERE ") <> 0, " And ", " Where ") & _
        me.subsearch_frm.Form.Filter
    End If

    Set db = CurrentDb

    'create temporary query
    Set qrydef = db.CreateQueryDef(strTempQryDef, strSQL)
    db.QueryDefs.Append qrydef
    Set qrydef = Nothing

    DoCmd.TransferSpreadsheet TransferType:=acExport, _
    SpreadsheetType:=acSpreadsheetTypeExcel12Xml, _
    TableName:=strTempQryDef, _
    FileName:=Replace(CurrentProject.Path & "\", "\\", "\") & strTempQryDef & ".xlsx"

    ' Delete the temporary query
    db.QueryDefs.Delete strTempQryDef

    Set db = Nothing

End Sub
vba forms ms-access export-to-excel
1个回答
0
投票

documentation

如果通过名称指定的对象已经是QueryDefs集合的成员,则会发生运行时错误。

因此,您应在尝试创建临时查询之前将其删除。为此,您可以按照以下方式使用代码:

On Error Resume Next
DoCmd.DeleteObject acQuery, strTempQryDef
On Error GoTo 0

也根据documentation

在Microsoft Access工作区中,如果您提供名称的长度不为零的字符串以外的其他内容,当您创建QueryDef时,结果QueryDef对象将自动追加到QueryDefs集合中。

因此,您不需要此行:

db.QueryDefs.Append qrydef
© www.soinside.com 2019 - 2024. All rights reserved.