Код доступа с использованием объекта Excel, ошибка: 462 Удаленный сервер не существует или недоступен - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь создать списки в Excel на основе созданного мной запроса. Я получаю множество ошибок, несовместимых с одним и тем же кодом. Мое исследование указывает на эту статью, которая очень хорошо описывает проблему. Статья поддержки Microsoft

В коде приведены различные ошибки, описанные в статье в строке «With wkb.ActiveSheet.ListObjects.Add»

        wkb.Queries.Add Name:="qry" & strProcedure, Formula:= _
        "let" & Chr(13) & "" & Chr(10) & "    Source = Odbc.Query(""dsn=" & strDSN & """, ""select * from " & strProcedure & "()"")" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "    Source"


    With wkb.ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
        "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=qry" & strProcedure & ";Extended Properties=""""" _
        , Destination:=Range("$A$1")).QueryTable
        .CommandType = xlCmdSql
        .CommandText = Array("SELECT * FROM [" & "qry" & strProcedure & "]")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .ListObject.DisplayName = "qry" & strProcedure
'        .Refresh BackgroundQuery:=False
    End With

В статье приведен пример того, как воспроизвести проблему и как ее исправить. Но из их примера непросто увидеть, как мне следует изменить код, чтобы избежать ошибки.

Из статьи:

Примечание. Сообщение об ошибке возникает из-за того, что код ссылается на метод ячейки без предшествующего вызова с переменной объекта xlSheet.

Остановите проект и измените следующую строку кода: xlSheet.Range (Cells (1,1), Cells (10,2)). Value = "Hello"

Измените строку кода, чтобы она напоминала следующую строку кода. xlSheet.Range (xlSheet.Cells (1,1), xlSheet.Cells (10,2)). Value = "Hello"

Запустить программу еще раз. Обратите внимание, что вы можете запускать код несколько раз, не получая сообщения об ошибке.

Редактировать: полный код очищен. Я запускаю это из Access 2019 (365). Примечание. Файл excel.quit заставляет меня ввести имя файла, сохранить и закрыть электронную таблицу. Даже после этого, когда Excel windows не открывается, Excel остается в диспетчере задач до тех пор, пока я не закрою Access.

Редактировать 2: Как и в статье, этот код работает в первый раз, но в последующем происходит сбой запускается с противоречивым сообщением об ошибке.

Public Sub CreateExcelQueryTest()

Dim AppExcel As Excel.Application

Dim wkb As Excel.Workbook
Dim qry As Excel.WorkbookQuery
Dim strProcedure As String
Dim strDSN As String

Set AppExcel = New Excel.Application

strDSN = "INSPIRE33"
strProcedure = "wwcustomers_addresses"

Set wkb = AppExcel.Workbooks.Add

wkb.Queries.Add Name:="qry" & strProcedure, Formula:= _
    "let" & Chr(13) & "" & Chr(10) & "    Source = Odbc.Query(""dsn=" & strDSN & """, ""select * from " & strProcedure & "()"")" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "    Source"

wkb.Worksheets.Add.Name = strProcedure

With wkb.ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
    "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=qrywwcustomers_addresses;Extended Properties=""""" _
    , Destination:=Range("wwcustomers_addresses!$A$1")).QueryTable
    .CommandType = xlCmdSql
    .CommandText = Array("SELECT * FROM [" & "qry" & strProcedure & "]")
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .BackgroundQuery = True
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .PreserveColumnInfo = True
    .ListObject.DisplayName = "qry" & strProcedure
    .Refresh BackgroundQuery:=False
End With

AppExcel.Visible = True

AppExcel.Quit

End Sub

Когда это работает, я вижу это: Screenshot of results when it works

Только сейчас я получил сообщение об ошибке из Excel при тестировании эта функция. Излишне говорить, что я послал MS «хмуриться».

Feedback Type:

Хмуриться (ошибка)

Сообщение об ошибке: Попытка чтения или записи в защищенную память. Это часто указывает на повреждение другой памяти.

Трассировка стека: в Microsoft.Mashup.Client.Excel.NativeExcelFunctionsC2RBase.Microsoft.Mashup.Client.Excel.INativeExcelFunctions.SaveMashupData (IntPtr workbookPointer, String data) Microsoft. .Microsoft. Client.Excel.Shim.NativeCoAuthServices.InvokeCoauthAction (IWorkbookIdentity workbookIdentity, UndoableActionType actionType, Action action) в Microsoft.Mashup.C lient.Excel.Fill. Mashup.Host.Document.ExceptionHandlerExtensions.HandleExceptions (IExceptionHandler exceptionHandler, действие Action)

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

Трассировка стека вызовов: в Microsoft.Mashup.Host.Document.ExceptionExtensions.GetCurrentInvocationStackTrace () в Microsoft.Mashup.Client.UI.Shared.StackTraceInfo..ctor (String exceptionStackTrace, String invocationStackTrace, String exceptionMessage) в Microsoft.Mashup.Client.UI.Shared.FeedbackErrorInfo..ctor (Строковое сообщение, Исключение исключения, Nullable`1 stackTraceInfo, String messageDetail) в Microsoft.Mashup.Nliative.cel .NativeUserFeedbackServices. RaiseErrorDialog (IWindowHandle activeWindow, IUIHost uiHost, FeedbackPackageInfo feedbackPackageInfo, Исключение e, LocalizedString dialogTitle, LocalizedString dialogMessage, логическое использование GDICapture) в Microsoft.Mashup.Client. Boolean useGDICapture) в Microsoft.Mashup.Client.UI.Shared.UnexpectedExceptionHandler. <> C__DisplayClass14_0.b__0 () в Microsoft.Mashup.Host.Document.SynchronizationContextExtensions.SendAndMarshalExceptions (Synchronizationbackuplient.text). .Shared.UnexpectedExceptionHandler.HandleException (Exception e) в Microsoft.Mashup.Host.Document.ExceptionHandlerExtensions.HandleExceptions (IExceptionHandler exceptionHandler, действие Action) в Microsoft.Mashup.Client.Excel.Fill.PassiveFillManager.OgnateArgSigner EventUr в системе. Windows .Forms.Time r.OnTick (EventArgs e) в System. Windows .Forms.Timer.TimerNativeWindow.WndPro c (Message & m) в System. Windows .Forms.NativeWindow.Callback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Поддерживает премиум-контент: False

Обновление ОК, я вызываю эту подпрограмму из ближайшего окна. Это работает с первой попытки, я знаю, что доходит до конца, потому что теперь у меня есть окно сообщения с надписью «сделано», но процесс Excel не заканчивается. Если я нажму кнопку «Стоп» (синий квадрат), процесс Excel завершится, и вторая попытка не завершится неудачей. Код не должен все еще выполняться в этой точке. Никогда раньше такого не видел.

1 Ответ

1 голос
/ 30 марта 2020

Рассмотрим несколько исправлений:

  • Как указывают ваши цитируемые документы , укажите Range для пункта назначения вашей ячейки, который будет рабочим листом.

    Строка кода, которая вызывает объект, метод или свойство Excel без указания элемента с переменной объекта Excel

  • Избегайте использования ActiveCell / ActiveSheet / ActiveWorkbook. Вместо этого используйте назначенный объект, например, только что добавленную рабочую таблицу, strProcedure;

  • Правильно закройте рабочую книгу с помощью Workbook.Close , как вы делаете это в пользовательском интерфейсе: Workbook Close> Выход из приложения;

  • Как рекомендуется в VBA, освобождайте любой объект Set с Set object = Nothing, а не просто закрывайте фоновый процесс.

См. Регулировку:

With wkb.Worksheets(strProcedure).ListObjects.Add(SourceType:=0, Source:= _ 
        "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=qry" & strProcedure & ";Extended Properties=""""" _
        , Destination:=wkb.Worksheets(strProcedure).Range("$A$1")).QueryTable
        ...
End With

' NO NEED TO SHOW IF YOU IMMEDIATELY QUIT
AppExcel.Visible = True   

' CLOSE WORKBOOK AND EXIT APP
wkb.Close SaveChanges:=True
AppExcel.Quit 

' RELEASE RESOURCES
Set wkb  = Nothing
Set AppExcel = Nothing    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...