MS Access: сбой базы данных при попытке удалить электронную таблицу

У меня есть кнопка, которая экспортирует файл, но сначала она проверяет, существует ли этот файл. Если это так, то он удаляет файл и записывает на его место новый. Проблема в том, что при нажатии на эту кнопку сразу происходит сбой базы данных. Есть идеи, почему? Эта проблема обнаружилась совсем недавно — раньше она работала нормально как на Acess 2013, так и на Access 2016. Среда — это бизнес-настройка (ноутбуки компании, а не личные), где большая часть всего, что мы делаем, управляется ИТ-специалистом. админ.

Код:

Private Sub Command370_Click()

    Dim myQueryName As String
    Dim myExportFileName As String

    myQueryName = "qry_SAP_FGCheck"
    myExportFileName = "J:\2017\SAP\SAPExports\DailyFGCheck_Export.xlsx"
    If Len(myExportFileName) > 0 Then
        On Error GoTo Err_Msg
        Kill myExportFileName
    End If
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, myQueryName, myExportFileName
    Application.FollowHyperlink myExportFileName

Err_Msg: If (Err.Number = 70) Then MsgBox "Error: (" & Err.Number & ")" & Err.description & ". You must close the spreadsheet in order to export.", vbOKOnly Else Resume Next


End Sub

person loltospoon    schedule 14.04.2017    source источник


Ответы (1)


Возможно, на машине, вызываемой при нажатии кнопки, такого каталога нет. Вы используете букву диска J:\, предложенную пользователем сопоставленный путь к сетевому каталогу. Пользователи могли сопоставить разные буквы дисков. Попробуйте полный UNC, который можно найти в строке cmd net use:

myExportFileName = "\\SomeNetwork\Path\2017\SAP\SAPExports\DailyFGCheck_Export.xlsx"

Фактически, прямо сейчас файл всегда удаляется, поскольку вы проверяете длину строки VBA (которая всегда не равна нулю), поскольку вы назначаете ее непосредственно перед, а не фактический объект файловой системы.

Рассмотрите возможность создания условия, если такой путь к файлу каталога существует перед удалением или экспортом:

If Len(Dir(myExportFileName, vbDirectory)) > 0 Then
    On Error GoTo Err_Msg
    Kill myExportFileName

    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, _
                              myQueryName, myExportFileName
    Application.FollowHyperlink myExportFileName
End If

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

myExportFileName = Application.CurrentProject.Path & "\DailyFGCheck_Export.xlsx"

If Len(Dir(myExportFileName, vbDirectory)) > 0 Then
    On Error GoTo Err_Msg
    Kill myExportFileName

    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, _
                              myQueryName, myExportFileName
    Application.FollowHyperlink myExportFileName
End If

И в идеале каждый пользователь использует свой собственный интерфейс на локальных процессорах (т. е. C:\ дисков).

person Parfait    schedule 14.04.2017