iT邦幫忙

0

Excel for 迴圈怎麼加速資料才會跑快點出來

  • 分享至 

  • xImage

因欄位中的每格儲存格都要設定條件規則,所以用for迴圈跑,但若是10行還可以,400行時間就開始拉長,5000行就…,請問有什麼方式可以讓它不要一行一行的設定條件規則,而是一次跑完。有用application.screenupdating false不顯示更新畫面,但還是跑很慢。麻煩各位大大,謝謝!
https://ithelp.ithome.com.tw/upload/images/20240304/20150851bx7jm8Tk38.png

看更多先前的討論...收起先前的討論...
froce iT邦大師 1 級 ‧ 2024-03-04 10:48:26 檢舉
Range可以選擇整個範圍,你只是要改顏色的話直接 Range("F4:L400")就好。不用迴圈跑
vivianss iT邦新手 5 級 ‧ 2024-03-04 12:07:30 檢舉
每條規則(重複變紅色)是以列的單一條為一規則,如A1:E1跟H1:L1對比,下一行是A2:E2跟H2:L2對比,不是全部都一樣的顏色條件,會再跟其他的對比重複變其他顏色。
VBA的效能低落,所以我都是用C#或PYTHON來處理EXCEL內容
goodnight iT邦研究生 2 級 ‧ 2024-03-05 21:41:10 檢舉
試試看, 參考看看
https://officeguide.cc/excel-vba-speed-up-macro-tips/
vivianss iT邦新手 5 級 ‧ 2024-03-06 05:15:28 檢舉
感謝 goodnight 提供,有試過,但沒有影響他的處理,還是要一定的時間。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
海綿寶寶
iT邦大神 1 級 ‧ 2024-03-04 23:18:29
最佳解答

試試看「不要select,直接設值」

以下範例的時間差是43秒和29秒
https://ithelp.ithome.com.tw/upload/images/20240304/20001787HL3tZU1yUO.png

vivianss iT邦新手 5 級 ‧ 2024-03-05 03:48:01 檢舉

https://ithelp.ithome.com.tw/upload/images/20240305/20150851IaNfNhQ0x6.jpg

https://ithelp.ithome.com.tw/upload/images/20240305/20150851RpyFaOQoVN.jpg

會用到選擇是因為不同段的選擇後加入規則,以上圖1及2是全部的規則,目前加上了判斷沒量產就不執行,暫時有快點,但量只要到72就又跑很慢,治標不治本。
感謝大大提供調用的例子,大概有思路,但我的規則不太一樣的選擇法,有點頭疼。

我不確定你有了解我寫的內容
我寫的只有一點
不要寫 Range("xxx").Select
直接對Range設定屬性

vivianss iT邦新手 5 級 ‧ 2024-03-06 05:43:29 檢舉

若是單跑單一規則的話,真的挺快的,有測試過,下面這是參考Johnstudy所改良的,但還是要些運作時間,可能是因為我的規則很多格,有交替,以及自身的重複還有唯一值,所以整體下來還是得跑一段時間,因此後面我想到另一個解決方式,就是用程式跑完就不要改了,寫死,然後有覆蓋到規則的,就改版面避開被覆蓋規則而要重新跑一次規則,感謝提供思路。
https://ithelp.ithome.com.tw/upload/images/20240306/20150851TuCBdjieex.jpg

0
johnstudy
iT邦新手 5 級 ‧ 2024-03-05 16:34:26

chatgpt 給的答案,vba執行程式真的很慢,樓上有建議使用C#或python真的是很好的選擇
https://ithelp.ithome.com.tw/upload/images/20240305/20102427COtfPuNX70.pnghttps://ithelp.ithome.com.tw/upload/images/20240305/20102427V9axWPWrg5.png

像這種程式我都直接叫chatgpt直接寫出來,還比一個一個打還來的快
當然前提是對程式的敘述及條件要說得很清楚

我建議是更改儲存格條件可以用巨集的方式,當VBA程式觸發再去執行巨集
應該可以避免用VBA去逐條執行來的快

froce iT邦大師 1 級 ‧ 2024-03-05 17:22:27 檢舉

巨集底層不就是VBA?...

其實我會這樣建議啦,先對資料做filter,然後改儲存格background color,不要調用格式化去做。
一次迴圈盡量把選到的範圍最大化,然後一次改,這樣速度才會快。

vivianss iT邦新手 5 級 ‧ 2024-03-06 05:26:09 檢舉

目前有改成圖下這張,但…處理時間還是要很久,可能因我要規則化的1個列儲存格為16格,有三個,就要48,然後48再去跑72列裡面的48小格共3456格格式規則且還有其他自身及別的規則就更多格,所以還是很吃力,感謝提供思路。
https://ithelp.ithome.com.tw/upload/images/20240306/20150851fau0iV7tTH.jpg

froce iT邦大師 1 級 ‧ 2024-03-07 10:42:56 檢舉

我就是說你要快的話,直接捨棄儲存格格式化,用資料篩選選完後設定背景顏色的方式去取代儲存格的格式化。
這樣就是你有幾條規則做幾次而已,你每個儲存格都有格式怎樣都快不起來。

0
JecyLin
iT邦新手 5 級 ‧ 2024-03-05 20:51:52

可以將For資料存入陣列, 然後一次輸出

Sub aaa()
Dim arr() As Variant
arr = Range(Cells(3, 1), Cells(6, 10))
arr(1, 1) = 1
arr(1, 2) = 2
arr(1, 3) = 3
arr(2, 1) = 11
arr(2, 2) = 22
arr(2, 3) = 33
arr(4, 10) = 49
'一次輸出在原本的工作表
Range(Cells(3, 1), Cells(6, 10)) = arr
End Sub

https://ithelp.ithome.com.tw/upload/images/20240305/201642914FYJcTp8Fu.jpg

vivianss iT邦新手 5 級 ‧ 2024-03-06 05:29:16 檢舉

陣列有想過,但想到有72列就…,感謝提供思路。

JecyLin iT邦新手 5 級 ‧ 2024-03-06 14:55:03 檢舉

應該是我誤會你的問題...XD

0
Stacy Lo
iT邦新手 4 級 ‧ 2024-03-07 22:23:40

VBA 用 For 迴圈的速度問題無解,所以我提供一個不需要 For 迴圈,也不用 VBA 的解法。

您的需求應該是從 F 欄 到 L 欄,如果儲存格的值在該列出現過兩次以上,格式化條件上色。


在 M 欄到 S 欄增加公式的輔助,判斷 F 欄 到 L 欄的格子是否要上色。

M1 下公式 =COUNTIF($F1:$L1,F1)
如果 M1 > 1 代表 F1 的值在 F1 到 L1 出現超過一次,需要上色。
將 M1 到 S5000 都複製貼上此公式。
https://ithelp.ithome.com.tw/upload/images/20240307/20159575bLTpJhGLGD.png

接下來,設定格式化條件:使用公式決定是否套用格式
公式為 =M1>1
這裡請注意如果您是用點選 M1 儲存格的方式設定公式,必須移除 $ 符號,這樣套用在其他儲存格時,才會使用相對範圍。
https://ithelp.ithome.com.tw/upload/images/20240307/20159575dlnZKloGhY.png

這個格式化條件可以一次套用到整個範圍 =$F$1:$L$5000
https://ithelp.ithome.com.tw/upload/images/20240307/20159575qTjcVC9alP.png

您可以驗證一下結果是否正確。

這個方法不算很漂亮,因為要設定多餘的公式,但應該可以達到你的的需求,速度也沒問題。

vivianss iT邦新手 5 級 ‧ 2024-03-07 23:46:14 檢舉

這方式不錯用,適用單一重複的,但我的是有多重交疊,給你看我的原意圖就知道了,最終要呈現的就是那樣的結果,簡單說就是交叉比對顯示新舊的數字,讓人一看就知道哪些是要更新的、不變的、及不良的。
設定的都是單一橫列比對到另一個單一橫列
https://ithelp.ithome.com.tw/upload/images/20240308/20150851O8bD8QylPs.png

Stacy Lo iT邦新手 4 級 ‧ 2024-03-08 21:46:27 檢舉

多重條件也是同樣的做法,用公式判斷要如何上色,再設定四個格式化條件,1=藍色,2=綠色,3=紅色,4=黃色。

我要發表回答

立即登入回答