- 帖子
- 406
- 主題
- 8
- 精華
- 0
- 積分
- 453
- 點名
- 0
- 作業系統
- WINDOWS 7
- 軟體版本
- 2007
- 閱讀權限
- 20
- 性別
- 男
- 來自
- 台灣
- 註冊時間
- 2015-2-7
- 最後登錄
- 2021-7-31
|
3#
發表於 2020-8-22 13:45
| 只看該作者
本帖最後由 n7822123 於 2020-8-22 13:48 編輯
回復 2# b9208
用Cell儲存格一個一個傳值會很慢
因為Cell是個物件,佔不少儲存位元空間,裡面包含了欄寬、列高、顏色、格式、位置.....一連串的資料
所以先把儲存格的"值"丟給記憶體(陣列),然後做處理
處理完再一次丟回給儲存格,這方式效率比較高 (記憶體處理位元速度也會比轉盤式磁碟快)
第2段程式已經是高效的寫法,我是想不到如何可優化效率了,只幫你簡化程式碼
然後你給的資料頁,A欄沒東西,所以前半段沒法執行到~ 我自己添加流水號測試
程式如下
Sub main()
Application.ScreenUpdating = False
Worksheets("輸出").Activate
Ci = Array(, 2, 3, 4, 5, 6, 7, 8, 18, 19, 20, 22, 22, 23, 23)
Set Rg = [資料!A1048576].End(xlUp)
If Rg.Row = 1 Then Exit Sub
Arr = Range([資料!AD6], Rg)
Brr = [A5].Resize(UBound(Arr), 15)
[A2] = [資料!A2]
For R = 1 To UBound(Brr): For C = 1 To 14
If C <= 10 Then Brr(R, C) = Arr(R, Ci(C))
If C = 11 Or C = 13 Then Brr(R, C) = Left(Arr(R, Ci(C)), 8)
If C = 12 Or C = 14 Then Brr(R, C) = Right(Arr(R, Ci(C)), 5)
Next C: Next R
With [A5].Resize(UBound(Brr), 15) 'A~O欄填值+劃框線
.Value = Brr
.Borders.LineStyle = xlContinuous
End With
With [A5].Resize(UBound(Brr), 10) 'A~J欄做排序
.Sort key1:=.Item(2), key2:=.Item(10), Header:=xlNo
End With
With [H5].Resize(UBound(Brr), 2) 'H、I欄做取代
.Replace "*AA*", "AAA"
.Replace "*BBB*", "BBB"
.Replace "*CC*", "CCC"
.Replace "*DDD*", "DDD"
.Replace "*EEE*", "DDD"
.Replace "*FFF*", "FFF"
.Replace "*GGG*", "GGG"
.Replace "*HH*", "GGG"
.Replace "*MM*", "MMM"
.Replace "*LLL*", "LLL"
.Replace "*QQQ*", "LLL"
.Replace "*NNN*", "NNN"
.Replace "*TTT*", "NNN"
End With
End Sub
測試檔案如下
q1+.rar (21.58 KB)
|
|