請教一下VBA有沒有什麼方法可以在不同工作表內快速抓取資料至同一工作表?

假設A工作表為目的表
B、C、D工作表內分別有A工作表需要的不同資料
我的做法是取A工作表的A欄員工代號
然後再分別用回圈去找B、C、D工作表內有無該員工代號,
若有,則可能會將B工作表內的C:D欄資料丟回至A工作表的相對位址
同樣的,若C、D工作表內也有A工作表內目的員工編號,則再視情況去抓對應的欄位的資料,然後再貼到A工作表的相對位址

一開始是還好,主要是只有A、B兩份工作表的比對與抓取

但後來加入C、D工作表後,效率就變得奇慢了..
想請教神人們,我該如何能快速達到目的...謝謝您們Orz
2023-04-25 3:23 發佈
用a去抓bcd是對的
速度慢要看你工作表資料和vba是否有優化、pc規格、excel版本
程式碼可以問各種gpt,會比你寫的有效率
office有些眉角:office是吃ram怪物,資料越多、工作表抓的範圍越大,越吃ram,cpu的話會吃整數運算,資料格式如果有小數點,還會吃浮點運算,一般來說,用intel cpu會比amd cpu來的有優勢,另外excel版本太舊,只能跑cpu單核,最好升級到可以跑多核的版本。

你ram多的話,可以先把檔案都丟到ramdisk去跑,速度應該會快一點。
看你能不能給示範資料,還有你抓資料的邏輯.

用迴圈不是不好,只是幾個工作表就"幾倍"的迴圈數,當工作表愈多,它也會以倍數成長,對效能當然會有影响.
當資料量大,會更可怕.
或許除了迴圈,還有其它更直接簡單的方法來取得.
MaverickRay
MaverickRay 樓主

其實不是我不想給範例,只是那是初時寫的,所以寫的很囉哩囉唆,但要重寫我又懶,加功力也沒增那去,所以後來的C、D工作表就一塊給它丟到當時A抓B的回圈裡,可想而知,那截出來的片段程序,我自己都看得很累了呢

2023-04-26 0:53
jeff-yeh

所以需求及環境不明確的情況下,大家也幫不上忙,只能猜猜看,加上依你的情況來看,似乎也懂的不多,有些方法太難,說了也幫不了.

2023-04-26 14:05
可以把需求告訴ChatGPT,他會協助你
MaverickRay
MaverickRay 樓主

問題是我不會用GPT啊= =...有什麼地方可介紹一下如何使用的嗎?哈哈

2023-04-26 0:55
亮晶晶賓館

請照本宣科https://www.youtube.com/watch?v=svwzjVq09es&t=133s

2023-04-26 11:46
這在DB就是JOIN的觀念,但我不知道VBA有沒有這概念
MaverickRay
MaverickRay 樓主

這個DB=是指database嗎?倘若,恩..我沒去學過啊TT

2023-04-26 0:55
MaverickRay
MaverickRay 樓主

謝謝回覆,感覺這是高級進階班..TT..

2023-04-26 0:56
小小尉

有設定application.screenupdating = false嗎? 有的話也會快一點~

2023-04-26 11:58
Vlookup 應該可以
MaverickRay
MaverickRay 樓主

不行啦,若用vlookup丟入,電腦用久了會被拖的很想砸的說

2023-04-26 0:57
Jack4444

如果Vlookup 都要很久,那就考慮放到資料庫中,然後建index才會快。sql express 免費,快去下載吧

2023-04-28 22:16
不是電腦太慢 就是連結太多
先把 自動重算 的選項 取消
再執行巨集
MaverickRay
MaverickRay 樓主

有可能,只是我後來因一堆雜事也忘了是哪個檔案得重改,先謝謝您的寶貴抽空回覆,祝褔您們都有美好的一日^^

2025-01-13 15:55
Sub check_file()
Dim arr
arr = array(“sheetB”,“sheet C”,“sheetD”)
For a = 2 to sheetA.usedrange.rows.count
For each sheet in arr
Set target = sheet.usedrange.find(sheetA.cells(a,1),lookin:=Xlvalous , lookat:=Xlwhole)
If not target is nothing then
name1 = sheet.cells(1,”C”)
name2 = sheet.cells(1,”D”)
Set target2 = sheetA.rows(1).find(name1)
If not target2 is nothing then
Cells(a,target2.column) = _sheet.cells(target.row,”C”)
End if
Set target3 = sheetA.rows(1).find(name2)
If not target3 is nothing then
Cells(a,target3.column) = _sheet.cells(target.row,”D”)
End if
End if
Next sheet
Next a
End sub
——————————————————————
因為不知道表格格式,所以默認第一欄是標題。
因為不知道寫入資料的欄位是否相同,所以用find確定資料欄位,這部分需確保欄位標題一致。
程式碼中的sheetA到sheetD,需改成實際工作表名稱。
MaverickRay
MaverickRay 樓主

感謝您的寶貴回覆,這問題我應該是有解決,只是不知道與您提供的方法是否有差異,待有空時我再來好好研究,自去看病後已有好段時日沒去修改了,加上後來仰賴GPT居多,不論如何您的分享深深感謝,祝您有美好的一日

2025-01-13 15:53
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?