Как запустить запрос к базе данных MySQL с использованием VBA?

Привет! Я новичок в области макросов. У меня есть база данных MySQL, из которой Excel каким-то образом берет и загружает данные. Я хочу написать свой макрос, который будет извлекать таблицу из SQL. Подключение к базе данных работает, но я не могу найти визуальные примеры или инструкции, которые бы подробно объясняли, как загружать данные. Можешь подсказать, как пошагово это сделать? 

Вот мой код:

<pre><code class="vbscript">Private Sub ConnectionDB()

    Dim oConn As Object
    Set oConn = New ADODB.Connection
    
    oConn.Open "DRIVER={MySQL ODBC 8.0 Unicode Driver};Server=tipwindows;Database=tabse;User=tuser;Password=tpassword;PORT:3306;Option=3"
   
    If oConn.State = adStateOpen Then
        MsgBox "Connected! =)"
    Else
        MsgBox "?an not connect... =("
    End If
    
    Dim cmd As ADODB.Command  'переменная в которой будет запрос
    Set cmd = New ADODB.Command
    
    Dim rec As ADODB.Recordset 'переменная в которой будет результат запроса
    Set rec = New ADODB.Recordset
    
    Set cmd.ActiveConnection = oConn
    cmd.CommandText = "SELECT * FROM bss_2g_nokia" 'собственно, запрос
    cmd.CommandType = adCmdText
    cmd.Execute
    
    Set rec.ActiveConnection = oConn
    rec.Open cmd
    
    oConn.Close
    
End Sub</code></pre> 

Но при запуске этого кода возникает ошибка:

<pre><code>Run-time error '-2147217865 (80040e37)'
Automation error</code></pre>

P.S. В Python данные отображаются без проблем, но начальство требует использования VBA.
  • 28 октября 2024 г. 5:42
Ответы на вопрос 2
Запуск запросов к базе данных MySQL с помощью VBA может быть немного запутанным, особенно для новичка. Ваш код выглядит хорошо, но есть несколько моментов, на которые стоит обратить внимание.

Ваша ошибка `Run-time error '-2147217865 (80040e37)'` обычно возникает, если запрос возвращает пустой результат или если таблица не существует. Вам стоит убедиться, что таблица `bss_2g_nokia` действительно существует в базе данных, и что вы правильно указали название базы данных и таблицы.

Вот как можно переписать ваш код и добавить обработку данных из `Recordset`. Кроме того, я предложу оптимизировать вашу процедуру:

```vba
Private Sub ConnectionDB()
    Dim oConn As Object
    Set oConn = New ADODB.Connection
    Dim cmd As ADODB.Command
    Dim rec As ADODB.Recordset

    ' Подключение к базе данных
    On Error GoTo ErrHandler
    oConn.Open "DRIVER={MySQL ODBC 8.0 Unicode Driver};Server=tipwindows;Database=tabse;User=tuser;Password=tpassword;PORT=3306;Option=3"

    If oConn.State = adStateOpen Then
        MsgBox "Connected! =)"
    Else
        MsgBox "Cannot connect... =("
        Exit Sub
    End If
    
    Set cmd = New ADODB.Command
    Set rec = New ADODB.Recordset
    
    ' Выполнение запроса
    Set cmd.ActiveConnection = oConn
    cmd.CommandText = "SELECT * FROM bss_2g_nokia" ' Запрос
    cmd.CommandType = adCmdText
    
    ' Открываем Recordset
    rec.Open cmd

    ' Проверка на наличие записей
    If Not rec.EOF Then
        ' Загружаем данные в Excel
        Dim row As Integer
        row = 1 ' Начальная строка в Excel
        
        ' Сбрасываем Excel для отсутствия данных
        Sheets(1).Cells.Clear
        
        ' Загружаем заголовки
        For i = 0 To rec.Fields.Count - 1
            Sheets(1).Cells(row, i + 1).Value = rec.Fields(i).Name
        Next i
        row = row + 1
        
        ' Загружаем записи
        Do While Not rec.EOF
            For i = 0 To rec.Fields.Count - 1
                Sheets(1).Cells(row, i + 1).Value = rec.Fields(i).Value
            Next i
            rec.MoveNext
            row = row + 1
        Loop
    Else
        MsgBox "No records found."
    End If

Cleanup:
    ' Закрываем Recordset и соединение
    If rec.State = adStateOpen Then rec.Close
    If oConn.State = adStateOpen Then oConn.Close
    Exit Sub

ErrHandler:
    MsgBox "Error: " & Err.Description
    Resume Cleanup
End Sub
```

### Объяснение внесенных изменений:
1. **Ошибка обрабатывается:** Добавлен обработчик ошибок (On Error GoTo ErrHandler), чтобы вы могли делать более информативные сообщения об ошибках.
2. **Проверка на пустой Recordset:** Перед тем как извлекать данные, мы проверяем, не пуст ли `Recordset`.
3. **Загрузка данных в Excel:** Код загружает данные из `Recordset` в Excel, начиная с первой строки и помещая заголовки в верхнюю строку.
4. **Закрытие объектов:** Добавлен код, закрывающий `Recordset` и соединение после завершения, чтобы избежать утечек ресурсов.

Убедитесь, что ваша таблица существует и данные в ней действительно есть. Также проверьте, правильно ли указаны все параметры соединения с базой данных. Удачи вам в работе с VBA и SQL!
Баловался как-то с SQL в Экселе. 
Скрипт создаёт TestDB.mdb. Кроме того там ещё парочка полезных функций. Как работает - уже не помню, но там имена говорящие сами за себя.

Сама табличка лежит тут:
https://disk.yandex.ru/i/qqjQRHnOMWJUPA

База данных тут:
https://disk.yandex.ru/d/-4CckpBkvwle8g

Похожие вопросы