返回列表 上一主題 發帖

[發問] 依條件複製不同欄位資料與尋找取代

回復 3# n7822123
請問下述句子 Arr = Range([資料!AD6], Rg) 中〞AD6〞是指什麼?資料工作表AD6是空白。感謝指導。
Set Rg = [資料!A1048576].End(xlUp)
If Rg.Row = 1 Then Exit Sub
Arr = Range([資料!AD6], Rg)
Brr = [A5].Resize(UBound(Arr), 15)
100 字節以內
不支持自定義 Discuz! 代碼

TOP

本帖最後由 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)
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

回復 1# b9208
非常抱歉
由於產生亂碼,所以重新以檔案上傳。
程序由錄製修改,資料幾千筆,執行時間需要幾分鐘,請教是否有精進程展式可以縮短執行時間?
程式碼請看附檔模組
q1.rar (21.01 KB)
100 字節以內
不支持自定義 Discuz! 代碼

TOP

        靜思自在 : 一個人的快樂.不是因為他擁有得多,而是因為他計較得少。
返回列表 上一主題