Запуск запросов к базе данных 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!