Chạy song song các Sub trong VBA

Liên hệ QC

LeCang99

Thành viên mới
Tham gia
30/8/19
Bài viết
4
Được thích
0
Xin chào toàn thể các Anh/Chị trong diễn đàn.
Xin các Anh/Chị giúp đỡ em về việc chạy song song các Sub trong VBA để tiết kiệm thời gian
Trường hợp như sau ạ:

Sub Run_all ()
Sub1
Sub2
End Sub

Hiện tại khi chạy Run_all() thì Sub1 chạy rồi sau đó Sub2 mới chạy
Câu hỏi cần giúp đỡ:
Có cách nào chạy song song 2 sub mà không đợi Sub trước chạy xong không ạ?
Mong Anh/Chị giúp đỡ.
Cảm ơn các Anh/Chị rất nhiều!
 
Xin chào toàn thể các Anh/Chị trong diễn đàn.
Xin các Anh/Chị giúp đỡ em về việc chạy song song các Sub trong VBA để tiết kiệm thời gian
Trường hợp như sau ạ:

Sub Run_all ()
Sub1
Sub2
End Sub

Hiện tại khi chạy Run_all() thì Sub1 chạy rồi sau đó Sub2 mới chạy
Câu hỏi cần giúp đỡ:
Có cách nào chạy song song 2 sub mà không đợi Sub trước chạy xong không ạ?
Mong Anh/Chị giúp đỡ.
Cảm ơn các Anh/Chị rất nhiều!
Bạn nghĩ có không.Đến code trong 1 sub nó còn phải chạy theo thứ tự làm gì có kiểu chạy song song.
 
Upvote 0
Bạn nghĩ có không.Đến code trong 1 sub nó còn phải chạy theo thứ tự làm gì có kiểu chạy song song.
Vậy có cách nào để chạy nhanh hơn không ạ?, vì for i từ 1 tới 10000, chạy khoảng hơn 15 tiếng, em mới học nên thử tách ra 2 Sub nhưng cũng như vậy :), có giải pháp nào cải thiện xin chỉ giúp em với ạ,
 
Upvote 0
Vậy có cách nào để chạy nhanh hơn không ạ?, vì for i từ 1 tới 10000, chạy khoảng hơn 15 tiếng, em mới học nên thử tách ra 2 Sub nhưng cũng như vậy :), có giải pháp nào cải thiện xin chỉ giúp em với ạ,
Có vài trăm cách, cách nhẹ nhàn nhất là gởi file kèm yêu cầu và giải thích tường minh
 
Upvote 0
Có vài trăm cách, cách nhẹ nhàn nhất là gởi file kèm yêu cầu và giải thích tường minh
em đã đính kèm file, anh xem giúp ạ,
giải thích:
For i chạy đến 8000 , check nếu dữ liệu không bị trống thì chạy ghép chuỗi, sau đó gửi chuỗi đó tới web , sau đó gán giá trị web trả về vào ô Message
yêu cầu;
mỗi dòng trả về thành công vào ô Message mất 7s, nếu 8000 dòng sẽ mất gần 15 tiếng, anh/chị xem và chỉ giúp em cách giảm thời gian chạy ạ,
cám ơn anh
 

File đính kèm

  • API_TEST.xlsm
    31.2 KB · Đọc: 29
Upvote 0
em đã đính kèm file, anh xem giúp ạ,
giải thích:
For i chạy đến 8000 , check nếu dữ liệu không bị trống thì chạy ghép chuỗi, sau đó gửi chuỗi đó tới web , sau đó gán giá trị web trả về vào ô Message
yêu cầu;
mỗi dòng trả về thành công vào ô Message mất 7s, nếu 8000 dòng sẽ mất gần 15 tiếng, anh/chị xem và chỉ giúp em cách giảm thời gian chạy ạ,
cám ơn anh
Code liên quan đến Web mình không rành, hy vọng bạn khác biết cách
 
Upvote 0
có cách nào set thời gian bắt đầu chạy của sub2 không anh , vd: sau khi ấn sub1 chạy dc 5 phut thì sub2 se chay
Chỉn thời gian và chạy code theo hướng dẫn
Mã:
Dim runBln As Boolean
Sub CreatClock() 'Tao dong ho dem nguoc
  If runBln = True Then
    runBln = False
    Call ABC
    Exit Sub
  End If
  runBln = True
  Application.OnTime (Now + TimeSerial(0, 1, 2)), "CreatClock"
End Sub

Sub ABC()
  MsgBox ("Da duoc 1 Phut 2 Giay")
End Sub
 

File đính kèm

  • API_TEST.xlsm
    28.6 KB · Đọc: 19
Upvote 0
Lại ý tưởng lớn. Nhưng không được đâu bạn.
VBA không thể hổ trợ sub/function chạy đa luồng (multithread). Nếu MS coder mà thấy yêu cầu, ý tưởng này của bạn, họ ngã ngữa, khóc thét hết, vì phải viết lại toàn bộ VBA :)
Chạy multithread trên 1 CPU thì chỉ thực chất là mỗi thằng được chạy 1 chút, còn đa nhân (đa CPU) thì thread này có thể chạy trên CPU này, thread kia chạy trên CPU kia. Lúc đó mới là song song (parallel) thật sự.
 
Lần chỉnh sửa cuối:
Upvote 0
Vừa xem file của bạn, code vầy sao không chậm cho được. Optimize lại đi, xuống nhiều đó.
Mà tôi nghe nói dân VP không quan tâm nhanh chậm mà, vậy thôi cứ để vậy đi. Chạy được là tốt, mừng húm rồi.
1. Thêm Option Explicit vào giùm tui
2. Tuyệt đối tránh read từng cell Value từ VBA, vòng for bạn 3 to 8000, bạn read và IsEmpty 8000 lần ??/
3. Trong Sub TEST_Restful, nó cũng sẽ được gọi 8000 lần với 1 đống read từ cell Value bên trong nữa, khởi tạo object MSXML2.XMLHTTP 8000 lần, làm 1 mớ tác vụ giống nhau, chỉ khác nhau ở send strJson ???
4. Dùng CreateObject("MSXML2.XMLHTTP") later binding này là vô cùng chậm, đừng bắt chước người ta. Đưa ra ngoài, Set = New đi.
Các thao tác bắt tay, quy ước, kết nối tạo connection, chỉ làm 1 lần với server thôi, sau đó chỉ gởi chuỗi Json lên.
5. Kết nối, tạo connection, rồi hủy 8000 lần ???? Làm gì làm phải giữ 1 connection duy nhất. Xem bên server có cho giữ không ? Chắc chắn là có.
Làm xong hết mới đóng connection, destroy XMLHTTP object.
Bạn làm vầy không khác gì xem 1 trang Web, bạn F5 refresh 8000 lần, ông trời còn chịu chưa nổi.
Còn nhiều lắm, góp vài ngu ý vậy thôi. Thấy mấy cái code này là ngán.
Bạn tìm cách viết lại đi. Làm sao tới cuối cùng chỉ cần gới 1 chuỗi Json và nhận về 1 kết quả xong là đạt. Vài giây với máy, đường truyền bây giờ là hết cỡ.
 
Lần chỉnh sửa cuối:
Upvote 0
Nhảm ! Dùng Python mà code dỡ, code tệ còn chậm hơn code đúng, code tốt với VBA.
Python phải đi đường vòng để kết nối với Excel, ngôn ngữ thông dịch rồi mới qua mã máy. VBA kết nối direct, trực tiếp với Excel kia mà read cell value còn chậm, ở đó mà py với chả thon.
 
Upvote 0
Vừa xem file của bạn, code vầy sao không chậm cho được. Optimize lại đi, xuống nhiều đó.
Mà tôi nghe nói dân VP không quan tâm nhanh chậm mà, vậy thôi cứ để vậy đi. Chạy được là tốt, mừng húm rồi.

Em là người viết phần mềm chuyên trên Excel và cơ số công ty to nhỏ là khách hàng với rất nhiều bài toán dữ liệu lớn. Chuyện bây giờ làm đúng, làm đủ là đơn giản rồi. Cái người ta mong muốn cao hơn đó vừa nhanh lại vừa đẹp, khẩu vị thượng đế giờ không còn chỉ ăn cho no đâu a :D. Em chưa thấy khách hàng nào hay những người em biết là dân chuyên làm Excel lại nói tốc độ không quan trọng cả. Vì thế các cải tiến cho Office 365 gần đây cái gì họ nhũng nhắm tới tốc độ. XLOOKUP gì gì đó cũng là muốn tốc độ hơn Vlookup và tính đa năng đó anh.
 
Upvote 0
Bạn gửi cho tôi một web cụ thể để tôi test nhé. Tôi đoán với "đồ chơi" của tôi vấn đề của bạn có thể được giải quyết về tốc độ.
 
Upvote 0
Nếu táy máy mở Resource Monitor thì dễ thấy có hàng chục đến hàng trăm chương trình đang hoạt động. Tương ứng với mỗi chương trình là từ 1 đến cả trăm thread (process system có hơn trăm thread). Thế nên thực tế chả tồn tại xử lý song song như nhiều người nghĩ vì không có đủ nhân để phục vụ riêng cho mỗi thread trừ khi dùng siêu máy tính.

223615

CPU là chỉ con chip vật lý gắn trên mainboard máy tính. CPU có 2, 4, 6, 16 hay bao nhiêu nhân thì vẫn chỉ là 1 cái CPU chứ không thể hiểu là nhiều CPU. Một số mainboard chuyên dụng thì có thể thiết kế để lắp được nhiều CPU (nhiều CPU socket).

Trong điều kiện lý tưởng, nếu có thể mở được đồng thời 16 thread với mỗi thread là một request thì thời gian thực thi có thể rút ngắn xuống khoảng gần 1/16 lần. Tuy nhiên phải nhấn mạnh tới điều kiện lý tưởng vì một số server sẽ giới hạn số lượt truy cập từ mỗi IP trong một khoảng thời gian. Thập chí nếu số lượt truy cập từ một IP cao bất thường thì có khi server sẽ khóa mọi request từ IP này.

Tôi đã từng có khoảng thời gian dài lập trình multithread tương tác với server bằng C# nên có thể khẳng định là C# có thể giải quyết vấn đề này tương đối tốt. Tuy nhiên đừng ngộ nhận là càng mở nhiều thread thì tốc độ sẽ càng nhanh đâu nhé vì giới hạn kỹ thuật của cả phần cứng và phần mềm.
 
Lần chỉnh sửa cuối:
Upvote 0
Mà tôi nghe nói dân VP không quan tâm nhanh chậm mà, vậy thôi cứ để vậy đi. Chạy được là tốt, mừng húm rồi.
...
Em chưa thấy khách hàng nào hay những người em biết là dân chuyên làm Excel lại nói tốc độ không quan trọng cả. Vì thế các cải tiến cho Office 365 gần đây cái gì họ nhũng nhắm tới tốc độ. XLOOKUP gì gì đó cũng là muốn tốc độ hơn Vlookup và tính đa năng đó anh.
Đừng cố tình xuyên tạc, bóp méo lời người khác nhé.

Dân văn phòng có quan tâm tới nhanh chậm ở mức s, mức phút, mức giờ. Nhưng dân văn phòng không quan trọng nhanh chậm ở mức ms. Đừng cắt xén, bóp méo lời nói của người khác nhé.

ThangCuAnh nói là Value2 nhanh hơn Value. Không ai phản đối chuyện này. Nhưng ThangCuAnh chỉ trích người khác vì người ta không nghe theo và dùng Value2 như nó. Vì người ta nói là người ta không quan tâm tới độ nhanh chậm cỡ ms. Lúc đó ThangCuAnh cùn nên nói về CPU, nhịp đồng hồ, về viết hệ điều hành ... ThangCuAnh so sánh GPE với những diễn đàn cho những người lập trình CPU, hệ điều hành? Vì thế ta nói là với dân văn phòng, với mấy cô kế toán thì sự nhanh ở cỡ ms không quan trọng.

Ta nói là "sự nhanh chậm ở độ ms không màng" chứ không nói là "sự nhanh chậm không màng". Các người không hiểu sự khác biệt giữa 2 câu kia hay các người hiểu nhưng các người cùn, các người cố tình xuyên tạc?

Nếu các người kiếm cơm bằng lập trình muốn bàn về độ nhanh chậm cỡ ms, muốn ôm mấy tools rồi đum đum thì có ai cấm đâu? Có ai góp ý gì đâu? Nhưng một khi vào nơi mà 99,9 % không là dân lập trình phần mềm kiếm cơm để "diễn" thì dám chơi dám chịu thôi. Tự biên, tự diễn, tự vỗ tay, tự ném cà chua trứng thối. Ai cũng mong bài viết của mình có 100 "thích", nhưng nếu không có một rừng tay vỗ, một dàn hợp xướng ngợi ca thì các người chỉ có thể tự trách mình là đã diễn không đúng chỗ, trước không đúng loại khán giả. Nhưng các người lại trách là có ít người hưởng ứng. Trách mình diễn không đúng chỗ thôi. Vào diễn đàn Excel mà nói chuyện lập trình CPU, hệ điều hành, nhịp đồng hồ mà muốn có một rừng tay vỗ nhưng lại không có một rừng tay vỗ thì chỉ tự trách mình được thôi. Cũng như vào diễn đàn "Thú cưng" mà giảng về toán vi phân thì cũng sẽ không có một rừng tay vỗ. Cùng lắm chỉ có vài cái vỗ tay lẹt đẹt thôi. Chuyện đơn giản mà các người không hiểu sao?

ThangCuAnh có hiểu quái gì về Unicode đâu. ThangCuAnh nghĩ chỉ khi có BOM thì tập tin mới là unicode sao?


Ta, một người không kiếm cơm bằng lập trình, đã giải thích rất nhiều, rất kỹ mà ThangCuAnh còn cùn. Rồi ThangCuAnh viện lý do là không mở được bằng Word. Hoá ra do ThangCuAnh không biết mở. Khi ta chỉ ra là ThangCuAnh không biết mở thì ThangCuAnh lý sự cùn là nếu nhân viên văn phòng không biết mở thì sao. Có những nhân viên không biết mở và có nhân viên biết mở. Nhưng ta có nói về nhân viên văn phòng đâu. Ta nói về ThangCuAnh. ThangCuAnh không biết mở. ThangCuAnh khoe là dân lập trình chuyên nghiệm nhưng ThangCuAnh không biết mở. Ta nói về ThangCuAnh, không nói về dân văn phòng. Rồi chuyện ThangCuAnh không hiểu rõ về "băm" về Dictionary mà nói bừa thì ta cũng đã chỉ ra ở


ThangCuAnh nên nhớ là ta, người chỉ đam mê nhưng không kiếm cơm bằng lập trình, đã vạch ra những chỗ mà ThangCuAnh, người vỗ ngực xưng là lập trình chuyên nghiệp, không biết không hiểu.

ThangCuAnh cùn nên ThangCuAnh nói là những ai dùng Value là SAI. ThangCuAnh không hiểu thế nào là SAI hay ĐÚNG. ThangCuAnh chỉ có thể nói là Value2 nhanh hơn Value nhưng không thể nói là dùng Value là sai. Và nữa, ta đã nói rõ là trong những trường hợp nào ta không màng tới sự nhanh chậm ở cỡ ms. Ta không bao giờ nói là sự nhanh chậm không quan trọng. Ta chỉ nói là sự nhanh chậm ở cỡ ms thì không màng, không quan tâm.

Các người viết phần mềm kiếm cơm thì cứ tự nhiên thảo luận nhé. Ta không quan tâm tới mấy chuyện đó thì đừng cố khiêu khích ta. Ôm mấy cái tools rồi đum đum rồi phát hiện ra một loạt lỗi của MS. Nghe mà thấy nực cười. Một lũ vô danh tiểu tốt ngồi ở Việt Nam ăn tục nói phét.

Ai cũng có những sai sót. Một khi người ta chỉ ra chỗ sai của mình thì nên chấp nhận. Đừng cay cú để rồi chốc chốc lại khiêu khích bằng cách bóp méo lời nói của người ta. Có ôm mấy tools rồi đum đum hay khoe là bạn bè của những ai đó làm việc cho hẳn MS cơ thì cũng có những lúc sai. Đừng vì người ta chỉ ra cái sai của mình rồi cay cú. Mà tự chứng tỏ mình thôi. Đừng nên "sưởi ấm trong ánh hào quang của người khác (bạn bè)"
 
Lần chỉnh sửa cuối:
Upvote 0
Ông nhảm, con nít quá ông ơi. Với tập tin Unicode, mọi phần mềm phải ghi BOM hết. Cái notepad, TextStream, mọi phần mềm đều phải ghi hết, đó là tiêu chuẩn phải theo. Ông kg ghi thì la làng, hậm hực, cay cú khi tôi chỉ ra cái sai của ông, còn nói Wordpad kg thông minh, người dùng phải biết chọn, cố tình chống chế cho cái sai của mình.
Trình độ ông đáng xách dép cho team Wordpad chưa, với mấy trò API nhảm nhí, con nít đó.
Và nói cho rõ nhé, mười mấy năm trước nhân viên MS đã liên hệ mời tôi qua làm cho team Windows Defender lúc ấy mới thành lập nhé, chả phải tôi dựa hơi ai nhé
Đúng là ếch ngồi đáy giếng, cứ tưởng mình là chúa
 
Upvote 0
Phải ghi hay không ghi BOM là một chuyện. Nhưng nói là không có BOM thì tập tin không là unicode là sai rõ ràng. Mọi phần mềm đều nên ghi đúng định dạng cho tập tin mà nó tạo ra. Tức Paint thì phải ghi định dạng BMP, JPG, PNG .... notepad thì luôn ghi định dạng là TXT và có BOM. Nhưng không có nghĩa là tôi tạo tập tin TXT nhưng ghi ở định dạng DLL thì nó không là văn bản nữa mà là thư viện liên kết động. Cùn thì nói thế nào cũng được. Bó tay toàn tập. Tập tin có định dạng đúng thì dễ nhận dạng nhưng định dạng không quyết định. Quyết định là cái lõi. Đổi tên tập tin hichic.txt thành hichic.dll thì lõi vẫn là tập tin văn bản.

Nếu tôi không ghi BOM thì cùng lắm chỉ có thể nói là tôi không chuyên nghiệp. Còn nếu nói là không ghi BOM thì tập tin không còn là unicode nữa thì là nói cùn. Không con nít gì ở đây, mà là cùn.

Có bao giờ tôi nói trình của team WordPad kém đâu? Nhưng nếu tập tin không có BOM mà notepad, Word, FileSystemObject mở được mà WordPad không mở được thì WordPad kém ở chỗ này. Nói WordPad kém ở chỗ này đâu có nghĩa là nói là team WordPad kém? MS cũng có nhiều lỗi, nhiều người chỉ ra và thậm chí MS cũng thừa nhận. Nhưng chỉ ra lỗi đâu có nghĩa là cho là team MS kém? Lý sự cùn không thể cùn hơn.

Giỏi hay kém thì cứ giúp người khác thôi. Khoe khoang làm gì. Một thằng vô danh tiểu tốt ngồi ở Việt Nam ôm mấy tools đum đum rồi "chửi" VBA, chửi MS, chửi cả thiên hạ. Muốn khoe thì giới thiệu hẳn họ tên ra để người khác người ta kiểm chứng. Lúc đó sẽ có một rừng tay vỗ. Còn kiểu "nhanh hơn 80% ...", "trên thế giới chưa ai làm"... Nhưng ngồi ở Việt Nam thì làm sao biết thế giới thế nào. Họ chưa làm được cái XYZ tools nào đó phải chăng họ đi con đường khác, họ có tools mạnh hơn, qui mô lớn hơn nhiều? Đừng vì không thấy tools nào như của mình mà vỗ ngực là "Trên thế giới chưa ai làm được". Ở Ba Lan chả ai dùng những tools quảng cáo trên GPE. Chả nhẽ họ không làm được, chả nhẽ họ phải làm thủ công, phải cực khổ? Hay là người ta có tools tốt hơn nhiều, qui mô hơn nhiều? Mà đấy là Ba Lan. Còn các cường quốc khác thì sao? Họ không cũng không có các tools được quảng cáo trên GPE. Họ cũng kém nhỉ?
Nói chuyện đúng sai, góp ý thì luôn sẵn sàng. Nhưng gặp những thằng cùn thì chỉ còn nước bó tay.

Ta, một người không kiếm cơm bằng lập trình, nếu không biết thật nhiều thì có gì đáng xấu hổ. Nhưng một thằng tự vỗ ngực là dân lập trình chuyên nghiệm mà nói bừa về unicode, về "băm" và Dictionary thì đáng hổ thẹn.

Ta có chỗ nào tưởng là chúa không đấy? Chỉ ra, trích ra xem nào. Hay chỉ nói bừa? Có chỗ nào ta nói ta là ông này ông nọ, từng làm ở đây ở kia, có những bạn làm ở chỗ này chỗ kia, từng thư từ qua lại với ông "lớn" XYZ nổi tiếng trên thế giới? Đừng nói bừa mà hãy trích ra nếu ta có nói. Đừng nghĩ mình đã từng có những lời nói đó rồi lại nhầm sang người khác. Chuyện ta thấy chỗ sai ta chỉ ra thôi. Đó đâu có là tự xưng chúa? Cùn không thể cùn hơn.
 
Upvote 0
Em không rõ nội dung các vấn đề hai anh đang tranh luận từ đâu hay đúng sai rõ ràng thế nào nhưng thấy nội dung trao đổi hai bên làm những người biết các anh trên GPE này không vui và chắc rằng hai anh cũng thực sự không thoải mái chút nào. Xét cho cùng hai anh hay phần lớn mọi người tham gia tích cực trên GPE là để có chút niềm vui, giao lưu, chia sẻ, làm những cái mình thích là chính. Vậy nên mong các bác cố gắng bỏ qua những cái đã xảy ra, không xem hay dùng lại những nội dung cũ thì sẽ không thêm cằng thẳng cho nhau nữa. Ai cũng có cái tốt, có thể ai cũng từng vô tình...
Trên GPE này em không biết nhiều người nhưng biết cả hai anh qua một số bài viết hay thông tin nho nhỏ nên tôn trọng các anh, cá nhân em chỉ muốn tất cả nhẹ nhõm và vui vẻ hơn thôi.
 
Upvote 0
Em không rõ nội dung các vấn đề hai anh đang tranh luận từ đâu hay đúng sai rõ ràng thế nào nhưng thấy nội dung trao đổi hai bên làm những người biết các anh trên GPE này không vui và chắc rằng hai anh cũng thực sự không thoải mái chút nào. Xét cho cùng hai anh hay phần lớn mọi người tham gia tích cực trên GPE là để có chút niềm vui, giao lưu, chia sẻ, làm những cái mình thích là chính. Vậy nên mong các bác cố gắng bỏ qua những cái đã xảy ra, không xem hay dùng lại những nội dung cũ thì sẽ không thêm cằng thẳng cho nhau nữa. Ai cũng có cái tốt, có thể ai cũng từng vô tình...
Trên GPE này em không biết nhiều người nhưng biết cả hai anh qua một số bài viết hay thông tin nho nhỏ nên tôn trọng các anh, cá nhân em chỉ muốn tất cả nhẹ nhõm và vui vẻ hơn thôi.
Bạn thấy một loạt bài trong các chủ đề mà bạn và kieu manh quan tâm gần đây tôi không hề tham gia. Chuyện ai tham gia là quyền của họ. Nhưng vì cái sai mà tôi chỉ ra để cay cú và thỉnh thoảng diễu cợt thì không chấp nhận được. Mà đây còn là bóp méo sự thật.

Sự thật là chưa bao giờ tôi nói là Value2 không nhanh hơn Value. Chưa bao giờ tôi nói là tốc độ không quan trọng. Tôi chỉ nói là nếu trong trường hợp nào đó sự nhanh hơn (tổng thể) ở mức ms thì tôi không quan tâm. Và với dân kế toán thì sự nhanh chậm (tổng thể) ở cỡ ms cũng không quan trọng. Thế nhưng người ta lại bóp méo lời tôi và cho rằng "ai đó cho rằng tốc độ là không quan trọng".

Tôi dùng Value, bạn dùng Value2. Bạn có thể cho là code bạn chạy nhanh hơn. Nhưng bạn không thể cho là dùng Value là SAI. Thế mà người ta cho là dùng Value là sai đấy.

Sai đúng là chuyện có thể sảy ra cả với người giỏi vì không ai biết hết tất cả. Nhưng chỉ vì người khác chỉ ra cái sai mà cay cú, mà chốc chốc lại diễu cợt bằng cách bóp méo lời của người ta thì bó tay toàn tập.
 
Upvote 0
Web KT
Back
Top Bottom