Доступ к экспортной субформе - PullRequest
1 голос
/ 26 января 2020

Я пытаюсь написать 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

1 Ответ

2 голосов
/ 26 января 2020

Согласно документации :

Если объект, указанный именем, уже является членом коллекции QueryDefs, возникает ошибка времени выполнения.

Таким образом, вы должны удалить временный запрос, прежде чем пытаться его создать. Для этого вы можете использовать код в следующих строках:

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

Кроме того, согласно документации :

В рабочем пространстве Microsoft Access , если вы предоставляете что-либо кроме строки нулевой длины для имени при создании QueryDef, результирующий объект QueryDef автоматически добавляется в коллекцию QueryDefs.

Как таковая, вам не нужна эта строка:

db.QueryDefs.Append qrydef
...