Я пытаюсь создать списки в 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
Когда это работает, я вижу это:
Только сейчас я получил сообщение об ошибке из 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 завершится, и вторая попытка не завершится неудачей. Код не должен все еще выполняться в этой точке. Никогда раньше такого не видел.