简体   繁体   中英

Access Export Subform to excel

I'm trying to write some VBA to export filtered records from a subform. I've found a number of post related to this issue and I've cobbled the code below from those post.

When I run it I get a run-time error saying:

the Object '__temp' already exist.

When I click debug it highlights the line

Set qrydef = db.CreateQueryDef(strTempQryDef, strSQL)

Thank you for you help.

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

Per the documentation :

If the object specified by name is already a member of the QueryDefs collection, a run-time error occurs.

As such, you should delete the temporary query before attempting to create it. To do this, you could use code along the lines of the following:

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

Also, per the documentation :

In a Microsoft Access workspace, if you provide anything other than a zero-length string for the name when you create a QueryDef, the resulting QueryDef object is automatically appended to the QueryDefs collection.

As such, you don't need this line:

db.QueryDefs.Append qrydef

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM