返回列表 上一主題 發帖

[發問] excel vba (插入資料)insert 進 sqlite 緩慢問題

回復 5# joey0415


小弟用EXCEL寫入mysql 和 mssql 以前也遇到相同的問題
但小弟解決的方式不是挺優,您不嫌棄的話可以試試看

用連接符號=";"  
把語法連接起來,EXCUTE的動作等迴圈跑完之後,再給他一次EXCUTE就好了

您的語法主要是慢在數量多,你每一列都打開資料庫連結一次,因此速度慢了
連接在一起就只要打開資料庫一次,一次放入五百筆資料,就非常快了!
  1. Sub WRITE_SQL() '寫入資料
  2. conn_connect'這是呼叫開啟SQL
  3. For i = 1 To 10000
  4.     strSQL = "INSERT INTO customer VALUES ('Bob','SHIT','TWN','SHIT2','SHIT3',2016-01-01," & 100 + i & ")"'每一列的語法
  5.     If i = 1 Then strSQL2 = strSQL Else strSQL2 = strSQL2 & ";" & strSQL'將語法連接
  6. Next
  7. Conn.Execute (strSQL2)'執行SQL
  8. End Sub
複製代碼
PKKO

TOP

本帖最後由 PKKO 於 2016-12-28 21:48 編輯

回復 9# koshi0413


   excel 不會慢到哪邊去哦
我的都是一秒多就結束了(一秒是因為要開啟和關閉資料庫)
您的速度慢是因為妳用了ZA=CELLS(I,J)

excel要快最基本的要件就是先轉為陣列
例如
RNG=[A1].RESIZE(100,10).VALUE'取出100列*10欄位的資料
接著把妳的cells換成RNG就可以了
excel讀取儲存格是非常慢的速度
讀取陣列是非常快的,放資料的時候也一樣哦,不能一個一個放,要一次放一整個陣列進去哦!

以及上方先放入運算的程式,避免每一個if都要執行一次SPLIT
PKKO

TOP

回復 12# koshi0413


    ZA=cells(i,j)

先把CELLS換成陣列
後面的ZA都不用動,就已經快很多了
意思是一樣的

VBA強制轉換文字的指令是CSTR(XXX)
100多個儲存格也是一樣
先一次性轉為陣列
然後跑回圈
妳如果沒有轉陣列用range("A" & i) 大概會慢到想要打人吧!
PKKO

TOP

回復 17# koshi0413


    用法錯囉,你一樣是讀取了cells的值

rng=[a1].resize(r,c).value'r=列數,C=欄位數量
之後把CELLS的部分取代為rng就可以用陣列了

例如原本要取用cells(2,1) 就變成 rng(2,1)
意思完全相同,但不是取用儲存格而是取用陣列,速度直接大增哦!
PKKO

TOP

回復 20# koshi0413


  我沒有很深入的看您細節的程式碼
但目前只有看到兩個地方可以稍微快一點,你可以試試看這個部分

第一:za=RNG(J,I)  =>這個部分可以不用,只接把所有的za取代為RNG(J,I)即可=>但這個地方影響不大
第二:您的迴圈之內使用了大量的SPLIT,應該在迴圈開始的時候直接將AR=Split(za, "/")
然後IF AR(0)=1 OR LEN(AR(1))=1 THEN
這樣的話程式就不用每一行都執行一次拆開的動作
以上您試試看
PKKO

TOP

        靜思自在 : 多做多得。少做多失。
返回列表 上一主題