[算表] 請問vba的效能問題

看板Office作者 (marki)時間9年前 (2017/01/26 09:57), 編輯推噓2(206)
留言8則, 4人參與, 最新討論串1/1
軟體: Excel 版本: Mac Office 365 各位大大好 小弟剛開始摸索vba 在網路上看到這樣一篇文章 http://m.wangchao.net.cn/it/tcdetail_57466.html 大約在文章的1/5位置 有提到 ======================================= 本技巧用于優化在Excel和代碼之間轉換數據的次數。使用數組變量存儲所需要的值並執行取值或賦值操作,而不是一次遍曆單個單元格並獲取或設置單個值。   例如,下面的代碼在單元格區域A1:C10000中放置隨機數。   代碼段一:運行速度較慢的代碼   Sub testSlow()   Dim DataRange As Range   Dim Irow As Long   Dim Icol As Integer   Dim MyVar As Double   Set DataRange = Range("A1:C10000")   For Irow = 1 To 10000   For Icol = 1 To 3   MyVar = DataRange(Irow, Icol) '從Excel單元格中讀取值30K次   If MyVar > 0 Then   MyVar = MyVar * MyVar ' 改變值   DataRange(Irow, Icol) = MyVar '將值寫入Excel單元格中30000次   End If   Next Icol   Next Irow   End Sub   代碼段二:運行速度更快的代碼   Sub testFast()   Dim DataRange As Variant   Dim Irow As Long   Dim Icol As Integer   Dim MyVar As Double   DataRange = Range("A1:C10000").Value '一次從Excel單元格中讀取所有的值,將其放入數組   For Irow = 1 To 10000   For Icol = 1 To 3   MyVar = DataRange(Irow, Icol)   If MyVar > 0 Then   MyVar = MyVar * MyVar ' 改變數組中的值   DataRange(Irow, Icol) = MyVar   End If   Next Icol   Next Irow   Range("A1:C10000").Value = DataRange '一次將所有結果寫回單元格   End Sub ======================================= 簡單的summary一下我的觀察 第一段的程式碼就是讓電腦讀進每一儲存格的數據 計算後直接寫進儲存格 第二段的程式碼是讓電腦讀進每一儲存格的數據 先存於陣列(應該就是中國 所稱的數組吧)。於陣列中計算後再存進儲存格。 我的疑問是這樣看起來。不論是第一段或是第二段的程式碼應該都需要把儲存 格的內容讀進記憶體。而第二段程式碼還需要多增加一個陣列變數的記憶體。 這樣為什麼會比較快啊? 謝謝大家 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.239.223.196 ※ 文章網址: https://www.ptt.cc/bbs/Office/M.1485395842.A.158.html

01/26 15:01, , 1F
因為"寫入儲存格"這個動作很花時間
01/26 15:01, 1F

01/26 19:42, , 2F
讀資料都很快,但是寫資料....超級久
01/26 19:42, 2F

01/26 19:43, , 3F
而且一次貼上10000個資料跟一次貼上一個資料做10000次
01/26 19:43, 3F

01/26 19:43, , 4F
時間後者又更長到誇張,前者可能5秒,後者可能3000秒
01/26 19:43, 4F

01/26 19:44, , 5F
所以超過1000列的資料,基本上都改用陣列,在一次貼上最
01/26 19:44, 5F

01/26 19:44, , 6F
01/26 19:44, 6F

01/26 21:50, , 7F
謝謝
01/26 21:50, 7F

03/08 23:07, , 8F
太神了
03/08 23:07, 8F
文章代碼(AID): #1OYLU25O (Office)
文章代碼(AID): #1OYLU25O (Office)