Создание «Workbook.Connections (« MyDBx »). ODBCConnection» из файла UserDSN или ODBC - PullRequest
1 голос
/ 11 июня 2019

Excel 2016 на компьютере с Windows 10 Pro: я могу открыть книгу и из

ДАННЫЕ / Из других источников / Мастер подключения к данным / odbc DSN

, где я выбираю свой пользовательский DSN и предоставляю дополнительную информацию.

Затем создается код VBA для установки соединения между моим компьютером и внешней базой данных SQL. Ранее я определил UserDSN для этого соединения.

Если я запишу этот процесс, я получу что-то вроде этого:

With ActiveWorkbook.Connections("MyDBx").ODBCConnection
  .BackgroundQuery = True
  .CommandType = xlCmdSql
  .Connection = "ODBC;DSN=SQL2;"
  .RefreshOnFileOpen = False
  .SavePassword = False
  .SourceConnectionFile = "D:\MyDocs\My Data Sources\Mydbx.odc"
  .SourceDataFile = ""
  .ServerCredentialsMethod = xlCredentialsMethodIntegrated
  .AlwaysUseConnectionFile = False
End With
ActiveWorkbook.Worksheets.Add
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:="ODBC;DSN=SQL2;" _
, Destination:=Range("$A$1")).QueryTable
  .CommandText = Array("SELECT * FROM `MyDBx`.`tablea`")
  .RowNumbers = False
  .FillAdjacentFormulas = False
  .PreserveFormatting = True
  .RefreshOnFileOpen = False
  .BackgroundQuery = True
  .RefreshStyle = xlInsertDeleteCells
  .SavePassword = False
  .SaveData = True
  .AdjustColumnWidth = True
  .RefreshPeriod = 0
  .PreserveColumnInfo = True
  .SourceConnectionFile = "D:\MyDocs\My Data Sources\MyDBx.odc"
  .Refresh BackgroundQuery:=False
End With

Это работает, и я могу использовать код VBA для анализа и построения графиков данных. Однако если я удалю созданный выше лист и затем попытаюсь перезапустить макрос, произойдет сбой в операторе

С ActiveWorkbook.Connections («MyDBx»). ODBCConnection

При удалении указанного листа появляется также предупреждение о том, что удаляемый лист содержит запрос.

Как захватить / создать код в макросе, который позволит моему макросу запускаться в новой / пустой книге с использованием вышеуказанного подключения к данным.

Очевидно, что я могу сохранить лист и всегда запускать макрос в этой книге, но не в другой книге.

1 Ответ

1 голос
/ 11 июня 2019

Пожалуйста, попробуйте построить его объект за объектом, как это:

Private Sub NewWorkbookWithODBCConnection()
    Dim myWorkBook As Workbook
    Dim myWorkbookConnection As WorkbookConnection
    Dim myWorksheet As Worksheet
    Dim myQuerytable As QueryTable

    Set myWorkBook = Workbooks.Add

    Set myWorkbookConnection = myWorkBook.Connections.Add2( _
        Name:="MyDBx", _
        Description:="Whatever", _
        ConnectionString:="ODBC;DSN=SQL2;", _
        CommandText:="")

    With myWorkbookConnection.ODBCConnection
      .BackgroundQuery = True
      .CommandType = xlCmdSql
      .Connection = "ODBC;DSN=SQL2;"
      .RefreshOnFileOpen = False
      .SavePassword = False
      .SourceConnectionFile = "D:\MyDocs\My Data Sources\Mydbx.odc"
      .SourceDataFile = ""
      .ServerCredentialsMethod = xlCredentialsMethodIntegrated
      .AlwaysUseConnectionFile = False
    End With

    Set myWorksheet = myWorkBook.Worksheets.Add

    Set myQuerytable = myWorksheet.ListObjects.Add( _
        SourceType:=0, _
        Source:="ODBC;DSN=SQL2;", _
        Destination:=Range("$A$1")).QueryTable

    With myQuerytable
      .CommandText = Array("SELECT * FROM `MyDBx`.`tablea`")
      .RowNumbers = False
      .FillAdjacentFormulas = False
      .PreserveFormatting = True
      .RefreshOnFileOpen = False
      .BackgroundQuery = True
      .RefreshStyle = xlInsertDeleteCells
      .SavePassword = False
      .SaveData = True
      .AdjustColumnWidth = True
      .RefreshPeriod = 0
      .PreserveColumnInfo = True
      .SourceConnectionFile = "D:\MyDocs\My Data Sources\MyDBx.odc"
      .Refresh BackgroundQuery:=False
    End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...