Массовая вставка из Excel в SQLite без файла TXT или CSV

У меня проблема, и я надеюсь получить от вас какой-нибудь вклад.

В принципе, мне нужно написать код в VBA, который позволяет мне взять таблицу данных из excel в sqlite.

Мне удалось это сделать, используя этот код:

Sub Scrivi() Dim objConnection As Object, objRecordset As Object Dim strDatabase As String Set objConnection = CreateObject("ADODB.Connection") strDatabase = "DRIVER={SQLite3 ODBC Driver};Database=" & Application.ActiveWorkbook.Path & "\TestDB.db;" Query = "drop table FUND; create table FUND (Fund_Code, Fund_Name, End_Date, PRIMARY KEY('Fund_Code'));" riga = 3 colonna = 1 While Not (IsNull(ActiveSheet.Cells(row, column).Value) Or IsEmpty(ActiveSheet.Cells(row, column).Value)) Query = Query & "insert into FUND values('" & Cells(row, column) & "','" & Cells(row, column + 1) & "','" & Cells(row, column + 2) & "');" row = row + 1 Wend objConnection.Open strDatabase objConnection.Execute Query objConnection.Close End Sub 

Теперь я хотел бы изменить итеративную часть, в которой я говорю row = row + 1 с разновидностью объемной вставки, в которой программа принимает всю таблицу вместо того, чтобы делать это по строке.

Я не хочу создавать файл csv / txt, если это возможно.

Большое спасибо, любой вклад будет оценен.

Решением самого базового уровня может быть первое построение полного запроса для массовой вставки, а затем выполнение запроса за один раз.

Например –

вставить в значения FUND (val1, val2); вставить в значения FUND (val3, val4);

можно заменить на – вставить в значения FUND (val1, val2), (val3, val4)

вы можете добавить все данные из листа. Перейдите в массив (вариант)

 Dim arr as Variant arr = Application.Transpose(range(your_range_of_data).values) 

и затем, используя данные в массиве, постройте строку запроса SQL, используя этот шаблон

 INSERT INTO table (column1, column2, ... ) VALUES (expression1, expression2, ... ), (expression1, expression2, ... ), ...; 

Функция VBA (написана «на колене», поэтому может потребоваться небольшая настройка, извините)

 Function buildQueryFromArray(arr as Variant, table as String, columns as String) as String Dim strSqlQuery as String * 4096 Dim i as Integer strSqlQuery = "INSERT INTO " & table & " (" & columns & ") VALUES" For i=LBound(arr, 1) to UBound(arr, 1) strSqlQuery = strSqlQuery & "(" & arr(i,1) & ", " & arr(i,2) & "etc" & ")," Next i buildQueryFromArray = Left(strSqlQuery, len(strSqlQuery)-1) & ";" End Function 

Причина использования массива вместо захвата данных непосредственно с рабочего листа: намного быстрее. Вы можете прочитать больше здесь: http://www.cpearson.com/excel/ArraysAndRanges.aspx lemme знает, работает ли это для вас:)


РЕДАКТИРОВАТЬ:
Ad1: вы правы, мы фактически не хотим его переносить. однако я привык писать так из-за причин, которые хорошо описаны в статье № 7 в этом разделе: mrexcel.com/forum/ Почему мы используем application.transpose?
Ad2: нет, он не должен функционировать, если это ваш вопрос, но он делает код чистым и более многоразовым. Ниже вы найдете встроенное решение:

 Sub Scrivi() Dim objConnection As Object, objRecordset As Object Dim strDatabase As String, strQuery as String Set objConnection = CreateObject("ADODB.Connection") strDatabase = "DRIVER={SQLite3 ODBC Driver};Database=" & Application.ActiveWorkbook.Path & "\TestDB.db;" strQuery = "drop table FUND; create table FUND (Fund_Code, Fund_Name, End_Date, PRIMARY KEY('Fund_Code')); insert into FUND values" 'determine how many rows of data there is Dim lastRow as Integer lastRow = ActiveSheet.Range("A:A").Find("*", LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 'transfer all data from range to array 'range: from A3 to Cx, where x equals to lastRow Dim arr as Variant arr = ActiveSheet.Range("A3:C" & lastRow).Value 'add all records from arr into single SQL query 'Lbound(xArray, xDimension)/Ubound(xArray, xDimension) - returns integer equal to first/last xArray item in xDimension. Everyday-use function. Google some more to have better insight of whats going on Dim i as Integer For i=Lbound(arr,1) to Ubound(arr,1) strQuery = strQuery & "(" & arr(i,1) & "," & _ arr(i,2) & "," & _ arr(i,3) & ")," Next i 'from the strQuery - swap last comma for semi-colon strQuery = Left(strQuery, len(strQuery)-1) & ";" objConnection.Open strDatabase objConnection.Execute strQuery objConnection.Close 

Лемме знаю, все ли ясно 🙂

  • как импортировать данные из SQLITE в excel с помощью xlsxwriter в python
  • экспортировать данные из базы данных excel в sqlite
  • Язык / каркас для создания электронных таблиц Excel, веб-сайтов
  • При печати дополнительной пустой бумаги отправляется! Зачем?
  • Сохранить результат запроса sqlite в excel с perl
  • Как я могу взять большую часть текста в одной ячейке и вставить каретки, чтобы разбить ее на несколько ячеек?
  • Вставка большого объема данных в базу данных android sqlite?
  • Слияние строк таблицы CSV в соответствии с первым столбцом - sqlite
  • SQLite 3 CSV Import to Table
  • Любая идея, как это можно прочитать как CSV? - Python
  • Как загрузить существующую базу данных (созданную из Excel) с помощью SQLiteAssetHelper в Android-устройство?
  • Interesting Posts

    Excel, как узнать ключевое слово в предложении

    Сильное определенное время до даты ячейки

    Мне нужно сравнить 2 рабочих листа и обновить один рабочий лист с информацией от другого

    Форматирование ячеек Excel с помощью ASP.NET

    Как добавить ExcelPackage в мой проект C # для чтения загруженного файла xls?

    рендерить данные Excel на веб-страницу по строкам (C #)

    Показать ошибку «Число, сохраненное как текст»

    Почему присвоение значения с помощью функции генерирует ошибку?

    Вычислитель VBA и знаменатель с именованными значениями

    Генерация тестовых данных: как автоматизировать?

    Excel Sql вызывает слишком мало ошибок параметров при запуске Sql в режиме чтения только в Excel

    Выбрать ячейки в Excel на основе содержимого ячейки

    Excel в XML: увеличение производительности

    Подсчет праздников в месяц, но не в выходные

    Получить информацию о ячейке из другого столбца в строке

    Давайте будем гением компьютера.