Теперь ошибки вроди нет. Теперь пробую из настройки копировать даный лист и вставлять в активный файл. Лист добавляется но он пустой, а на том листе который я делал я имел текст.
Андрей VG написал: В редакторе VBA? Там пункт File/Save LTE.xlam - должен быть.
В меню ексель для смены формата файла
Цитата
Андрей VG написал: Вы уверены, что в вашей надстройке нет листа с именем "Лист1"?
В надстройке? Запускаю файл Книга1.xlsx, делаю в ВБА функцию, запускаю. Функция из файла Книга1.xlsx копирует Лист1 в LTE.xlam на место 3 листа. Как то так. В надстройке есть 3 листа. 1 используется для хранения некоторых данных.
Всем добрый день. Скорее проблема, не "супер умная", но я не гуру в Екселе. Когда-то сделал надстройку, теперь буду добавлять в надстройку еще одну функцию. Функция запускает форму в которую пользователь вводит некоторые значения, потом идет вычисления и после этого нужно сделать отчет на лист в таблицу. Я хочу шаблон листа сделать в надстройке. То есть шаблон копируется, создается новый лист, потом в нужные места кидаются данные из формы. Подскажите пожалуйста как вставить лист в файл формата xlam, потому что при открытие файла они не видимы, а пункт меню сохранить как... не активен.
Sub QueryToSQLite()
Dim driver As String
Dim provider As String
Dim pathToDB As String
Dim query As String
Dim connection As ADODB.connection
Dim recordset As ADODB.recordset
Dim col As Integer
Dim row As Integer
driver = "SQLite3 ODBC Driver"
provider = "SQLITEDB"
pathToDB = "C:\test.db"
query = "SELECT * FROM electric;"
Set connection = New ADODB.connection
connection.ConnectionString = "DRIVER=" & driver & ";Database=" & pathToDB & ""
'connection.ConnectionString = "Provider=" & provider & ";Data Source=" & pathToDB & ""
connection.ConnectionTimeout = 3
connection.CommandTimeout = 3
connection.Open
'connection.Execute ("INSERT INTO electric (amount, finally) VALUES (6666, 0);")
Set recordset = connection.Execute(query)
For col = 0 To recordset.Fields.Count - 1
Range("A1").Offset(0, col).Value = recordset.Fields(col).Name
Next
Do While Not recordset.EOF
For col = 0 To recordset.Fields.Count - 1
Range("A2").Offset(row, col).Value = recordset.Fields(col).Value
Next
row = row + 1
recordset.MoveNext
Loop
'Range("A1").Offset(1, 0).CopyFromRecordset recordset
connection.Close
Set connection = Nothing
Set recordset = Nothing
End Sub
Теперь остался только OLE DB Provider, он все равно "не реагирует" на изменения.
А, Вы напрямую в умную таблицу. Хотя все же проблема не в драйвере. Потому что в умную таблицу он хоть текст выводит. А вот моим макросом, того не делает. Драйвер ODBC, я качал с того же сайта.
Пробовал делать другую таблицу, проблема не так в ДАТЕ, как в типе TEXT. Если колонка имеет тип TEXT, тогда Excel выводит пустоту. И не важно какое значени: латиница, кирилица или цифры. Всё трансформируется в пустоту
Спасибо Андрей VG, буду пробовать. Проблема что в SQLite, тип данных только: INTEGER, REAL, TEXT, BLOB, NULL. Дату предлагают сохранять:
Цитата
TEXT as ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS"). REAL as Julian day numbers, the number of days since noon in Greenwich on November 24, 4714 B.C. according to the proleptic Gregorian calendar. INTEGER as Unix Time, the number of seconds since 1970-01-01 00:00:00 UTC.
P.S. К сожалению, так можно только получать данные. А вносить данные в таблицу всеравно нужно через ADO
Всем добрый день. Делаю макрос, запрос к БД SQLite. Использую Microsoft ActiveX Data Objects 2.8 Library. Пробую два варианта: драйвер ODBC SQLite3 ODBC Driver и OLE DB Provider. Вариант с драйвером ODBC. Вроде все гуд но почему-то не отображаются данные колонки где записана ДАТА.:
Вариант с OLE DB Provider. Только название колонок таблицы и все:
Код
Sub QueryToSQLite()
Dim driver As String
Dim provider As String
Dim pathToDB As String
Dim connection As ADODB.connection
Dim recordset As ADODB.recordset
Dim query As String
Dim i As Integer
driver = "SQLite3 ODBC Driver"
provider = "SQLITEDB"
pathToDB = "C:\test.db"
query = "SELECT * FROM electric;"
Set connection = New ADODB.connection
'connection.ConnectionString = "DRIVER=" & driver & ";Database=" & pathToDB & ";"
connection.ConnectionString = "Provider=" & provider & ";Data Source=" & pathToDB & ""
connection.ConnectionTimeout = 3
connection.CommandTimeout = 3
connection.Open
connection.Execute ("INSERT INTO electric (amount, finally) VALUES (6666, 0);")
Set recordset = connection.Execute(query)
For i = 0 To recordset.Fields.Count - 1
Range("A1").Offset(0, i).Value = recordset.Fields(i).Name
Next
Range("A1").Offset(1, 0).CopyFromRecordset recordset
connection.Close
Set connection = Nothing
Set recordset = Nothing
End Sub
Всем спасибо за советы. The Prist, была такая мысль, но почему то засомневался. Просто я хочу сделать надстройук (xlam), и не знаю можна ли в ней сохранять/изменять на листе в ячейках значения.
Опа Если запускаю через: Разработчик-Макросы-Выполнить - все гуд. Это конечно хорошо, проблемы нет, но все же интересно, а почему когда запускаю из ВБА не происходит инициализация?
Всем добрый день! Делаю окошко для отправки запросов к БД. Все гуд, решил сделать глобальные переменные чтобы пользователь один раз вводил свои установки (пароль, драйвер,..) а програма до закрытия ексель-файла их запоминала и тут вылезла проблемка. Когда запускаю диалоговое окно через процедуру, глобальные переменные не прописвываються, а когда запускаю "напрямую" из ВБА все нормально. Подскажите пожалуйста что я делаю не правильно:
Инициализация переменных:
Код
Private Sub Workbook_Open()
driverFormMySQL = "MySQL ODBC 5.3 Unicode Driver"
ipFormMySQL = "127.0.0.1"
databaseFormMySQL = "database1"
userFormMySQL = "root"
passwordFormMySQL = "1111"
queryFormMySQL = ""
End Sub
Module1: (Обявление переменных и процедура вызова окна)
Код
Option Explicit
Public driverFormMySQL As String
Public ipFormMySQL As String
Public databaseFormMySQL As String
Public userFormMySQL As String
Public passwordFormMySQL As String
Public queryFormMySQL As String
Sub Start()
FormMySQL.Show
End Sub
FormMySQL:
Код
Private Sub ButExecute_Click()
Const title = "Ðåçóëüòàò çàïèòó"
connection = "ODBC;DRIVER={" & Trim(TxtDriver.text) & "};SERVER=" & Trim(TxtIP.text) & ";DATABASE=" & Trim(TxtDatabase.text) & ";USER=" & Trim(TxtUser.text) & ";PASSWORD=" & Trim(TxtPassword.text) & ";"
Dim table As ListObject
Dim x As Range
Worksheets.Add
On Error GoTo Errhandler
Set table = ActiveSheet.ListObjects.Add(xlSrcExternal, connection, True, xlYes, Range("A2"))
With table.QueryTable
.CommandType = xlCmdSql
.CommandText = TxtQuery.text
.Refresh False
.Delete
End With
Set x = Range(Cells(1, 1), Cells(1, (Cells(2, Columns.Count).End(xlToLeft).Column)))
With x
.Merge
.HorizontalAlignment = xlCenter
.Font.Bold = True
.Value = title
End With
Range("A1").AddComment TxtQuery.text
Range("A1").Comment.Visible = False
Unload FormMySQL
Exit Sub
Errhandler:
Application.DisplayAlerts = False
ActiveSheet.Delete
Application.DisplayAlerts = True
MsgBox "Íà æàëü, òðàïèëàñÿ ïîìèëêà - " & Err & vbNewLine & Err.Description, vbOKOnly, "Ïîìèëêà"
End Sub
Private Sub UserForm_Initialize()
TxtDriver.text = driverFormMySQL
TxtIP.text = ipFormMySQL
TxtDatabase.text = databaseFormMySQL
TxtUser.text = userFormMySQL
TxtPassword.text = passwordFormMySQL
TxtQuery.text = queryFormMySQL
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
driverFormMySQL = Trim(TxtDriver.text)
ipFormMySQL = Trim(TxtIP.text)
databaseFormMySQL = Trim(TxtDatabase.text)
userFormMySQL = Trim(TxtUser.text)
passwordFormMySQL = Trim(TxtPassword.text)
queryFormMySQL = Trim(TxtQuery.text)
End Sub
Ура, сделал. Разделил на два макроса. Если что не так, буду рад услышать:
Код
Sub Query1()
Const title = "Все данные из таблицы"
Const query = "SELECT * FROM table1;"
Call CreateTableFromMySQL(title, query)
End Sub
Код
Public Sub CreateTableFromMySQL(title As String, query As String)
Const driver = "{MySQL ODBC 5.2 Unicode Driver}"
Const server = "192.168.1.4"
Const database = "lte_energo"
Const user = "wges"
Const password = "1111"
Const connection = "ODBC;DRIVER=" & driver & ";SERVER=" & server & ";DATABASE=" & database & ";USER=" & user & ";PASSWORD=" & password & ";"
Dim table As ListObject
Dim x As range
Worksheets.Add
Set table = ActiveSheet.ListObjects.Add(xlSrcExternal, connection, True, xlYes, range("A2"))
With table.QueryTable
.CommandType = xlCmdSql
.CommandText = query
.Refresh False
.Delete
End With
Set x = range(Cells(1, 1), Cells(1, (Cells(2, Columns.Count).End(xlToLeft).Column)))
With x
.Merge
.HorizontalAlignment = xlCenter
.Font.Bold = True
.Value = title
End With
range("A1").AddComment query
End Sub
P.S. Подскажите, пожалуйста, можна ли в комментариях отображать запрос SQL с подсветкой синтаксиса. То есть, можна где-то найти готовый макрос для подсветки синтаксиса SQL?
Файл испортить не страшно, страшно что через какое-то время баг может появится. Мне нужно просто умная таблица, а вот эти все настройки неизвестно что настраивают:
все что я понимаю это диапазон, все остальные значения я не знаю что означают, боюсь что-то не то сделать. P.S. Да и диапазон, как правильно обозначить с 0 до recordset.Fields.Count - 1, а как с буковками?
Всем добрый день. Делаю макрос для получения данных из БД. Разбил задачу на несколько пунктов: 1. Соединение с БД. 2. Запрос к БД 3. Вставка данных из результата запроса: 3а Создания нового листа 3б Вставка данных на новый лист 3в Сделать из результата "умную таблицу" 4. Закрыть соединение с БД. И вот пункт 3в не могу осилить. Подскажите, пожалуйста как весь этот диапазон преобразовать в умную таблицу.
Код
Sub DataFromMySQL()
Const driver = "{MySQL ODBC 5.2 Unicode Driver}"
Const server = "ХХХХ"
Const database = "ХХХХ"
Const user = "ХХХХ"
Const password = "ХХХХ"
Const query = "SELECT address , SUM(motors_lte.power) FROM objects JOIN motors_lte USING(idObject) GROUP BY address"
Set connection = CreateObject("ADODB.Connection")
Set recordset = CreateObject("ADODB.Recordset")
connection.Open "Driver=" & driver & ";Server=" & server & ";Database=" & database & ";User=" & user & ";Password=" & password & ";"
recordset.Open query, connection
Sheets.Add.Name = "Лист " & Worksheets.Count + 1 & " sql"
With recordset
For i = 0 To recordset.Fields.Count - 1
ActiveCell.Offset(0, i).Value = recordset.Fields(i).Name
Next
ActiveCell.Offset(1, 0).CopyFromRecordset recordset
End With
recordset.Close
Set recordset = Nothing
connection.Close
Set connection = Nothing
End Sub