Giúp em xử lý lỗi macro khi chạy VBA (2 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Tôi tuân thủ nội quy khi đăng bài

Bài học đắt giá

Thành viên mới
Tham gia
2/12/13
Bài viết
22
Được thích
1
Untitled.jpg
2.jpg

Em có tạo 4 macro: macro1, macro4, macro5, macro6. Nhưng khi em chạy vba thì chỉ chạy được 3 macro 1,4,5 còn 6 thì bị lỗi. Mọi người giúp em với. Em xin đa tạ. (Có cả ảnh và file luôn nhé)
 

File đính kèm

Lần chỉnh sửa cuối:
Anh có thể giải thích thêm được không anh? Vì sao khi em viết module1. thì chỉ hiện macro 1,4,5 còn 6 thì không thế anh?
Vì Macro6 nằm ở Module2, trong Module1 không có Macro6 thế thôi. Bạn thử sửa Module1.Macro6 thành Module2.Macro6 xem thế nào.
 
Bạn cứ bỏ hết chữ Module và dấu chấm đi, còn giải thích thì mình chịu.
Trong vba, tất cả các hằng, biến, và sub/func đều có không gian định danh (namespace) của chúng. Tiền tố này dùng để vba phân biệt rõ là bạn muốn dùng cái ở đâu. Ví dụ code có 2 sub ToTe thì vba sẽ không chịu. Bạn phải phân chúng ra, 1 nằm ở module1 và 1 ở module2. Lúc ấy, để vba biết bạn muốn gọi thằng sub nào thì bạn phải gán tiền tố tênModule + dấu chấm
Không có tiền tố thì vba sẽ tìm theo luật mặc định.
Ở code trên, người ta gọi macro6 bằng cách thêm tiền tố module1. Vba bị ép buộc phải tìm macro6 bên trong module1. Và dĩ nhiên là nó không tìm ra. Nếu tiền tố module1 được xoá đi, vba sẽ tự do tìm macro6 (nơi nó tìm đầu tiên là module chứa code đang chạy)

Đại khái giống như thằng Tèo. Nếu ngõ chỉ có 1 Tèo thì tự do gọi. Nhưng nếu ngõ có trên 1 Tèo thì phải cho muốn gọi Tèo nhà nào. Vào nhà mà gọi Tèo thì người ta tạm hiểu là nhà hiện tại. Nếu nhà không có Tèo thì người ta hiểu là hàng xóm và có thể đòi phải cho biết nhà nào
 
Trong vba, tất cả các hằng, biến, và sub/func đều có không gian định danh (namespace) của chúng. Tiền tố này dùng để vba phân biệt rõ là bạn muốn dùng cái ở đâu. Ví dụ code có 2 sub ToTe thì vba sẽ không chịu. Bạn phải phân chúng ra, 1 nằm ở module1 và 1 ở module2. Lúc ấy, để vba biết bạn muốn gọi thằng sub nào thì bạn phải gán tiền tố tênModule + dấu chấm
Không có tiền tố thì vba sẽ tìm theo luật mặc định.
Ở code trên, người ta gọi macro6 bằng cách thêm tiền tố module1. Vba bị ép buộc phải tìm macro6 bên trong module1. Và dĩ nhiên là nó không tìm ra. Nếu tiền tố module1 được xoá đi, vba sẽ tự do tìm macro6 (nơi nó tìm đầu tiên là module chứa code đang chạy)

Đại khái giống như thằng Tèo. Nếu ngõ chỉ có 1 Tèo thì tự do gọi. Nhưng nếu ngõ có trên 1 Tèo thì phải cho muốn gọi Tèo nhà nào. Vào nhà mà gọi Tèo thì người ta tạm hiểu là nhà hiện tại. Nếu nhà không có Tèo thì người ta hiểu là hàng xóm và có thể đòi phải cho biết nhà nào
Em cũng hiểu như vậy, nhưng thấy bạn này có bài tương tự từ hồi tháng 7/2024 đến giờ mà không thấy cải thiện chút nào và vẫn đi hỏi lại nên cũng không có hứng thú để giải thích anh ạ.
 
Em cũng hiểu như vậy, nhưng thấy bạn này có bài tương tự từ hồi tháng 7/2024 đến giờ mà không thấy cải thiện chút nào và vẫn đi hỏi lại nên cũng không có hứng thú để giải thích anh ạ.
Tôi cũng quên mất chủ thởt này có tật hỏi thì nhiều nhưng học thì ít.
Thực ra thắc mắc của thớt thì bài #7 đã giải quyết rồi
 
Trong vba, tất cả các hằng, biến, và sub/func đều có không gian định danh (namespace) của chúng. Tiền tố này dùng để vba phân biệt rõ là bạn muốn dùng cái ở đâu. Ví dụ code có 2 sub ToTe thì vba sẽ không chịu. Bạn phải phân chúng ra, 1 nằm ở module1 và 1 ở module2. Lúc ấy, để vba biết bạn muốn gọi thằng sub nào thì bạn phải gán tiền tố tênModule + dấu chấm
Không có tiền tố thì vba sẽ tìm theo luật mặc định.
Ở code trên, người ta gọi macro6 bằng cách thêm tiền tố module1. Vba bị ép buộc phải tìm macro6 bên trong module1. Và dĩ nhiên là nó không tìm ra. Nếu tiền tố module1 được xoá đi, vba sẽ tự do tìm macro6 (nơi nó tìm đầu tiên là module chứa code đang chạy)

Đại khái giống như thằng Tèo. Nếu ngõ chỉ có 1 Tèo thì tự do gọi. Nhưng nếu ngõ có trên 1 Tèo thì phải cho muốn gọi Tèo nhà nào. Vào nhà mà gọi Tèo thì người ta tạm hiểu là nhà hiện tại. Nếu nhà không có Tèo thì người ta hiểu là hàng xóm và có thể đòi phải cho biết nhà nào
Cảm ơn bạn nhiều nhé.
Bài đã được tự động gộp:

Tôi cũng quên mất chủ thởt này có tật hỏi thì nhiều nhưng học thì ít.
Thực ra thắc mắc của thớt thì bài #7 đã giải quyết rồi
bài nào vậy bạn? gửi link cho mình xem được không? tại không tìm thấy bài tương tự nên mình mới đăng xin giúp á.
Bài đã được tự động gộp:

Em cũng hiểu như vậy, nhưng thấy bạn này có bài tương tự từ hồi tháng 7/2024 đến giờ mà không thấy cải thiện chút nào và vẫn đi hỏi lại nên cũng không có hứng thú để giải th
Chào anh, em không phải người trong ngành chuyên về excel, nên thi thoảng em làm theo 1 số hướng dẫn trên mạng để xử lý dữ liệu, và khi nó phát sinh lỗi thì em post lên đây để mọi người giải thích giúp. Lần đầu e post từ tháng 7 nhưng chưa thấy ai trả lời, em nghĩ có thể mọi người chưa hiểu câu hỏi của em, nên giờ em post lại để tìm câu trả lời đấy anh.
Nếu những bài post của em làm anh khó chịu và làm phiền anh thì anh có thể bỏ qua nhé. Cảm ơn anh đã giải đáp
 
Lần chỉnh sửa cuối:
...
bài nào vậy bạn? gửi link cho mình xem được không? tại không tìm thấy bài tương tự nên mình mới đăng xin giúp á.
...
Chẳng lẽ bạn không biết gì về thói quen dẫn số bài ở GPE?
Chịu khó đọc kỹ. Kẻo tôi lại nói "hỏi thì nhiều mà học/đọc thì rất ít"
 
Chẳng lẽ bạn không biết gì về thói quen dẫn số bài ở GPE?
Chịu khó đọc kỹ. Kẻo tôi lại nói "hỏi thì nhiều mà học/đọc thì rất ít"
"thói quen dẫn số bài ở GPE" là cái gì vậy anh? Ngoài đọc nội quy để post bài không gây hiểu lầm và ảnh hưởng đến các anh chị thì em chỉ biết dùng công cụ search của web để tìm bài liên quan. Không biết em làm vậy có gì sai để anh phán xét như vậy?
Anh Hoàng Tuấn trên kia thì bảo hỏi từ tháng 7 đến giờ lại hỏi tiếp, trong khi từ đó đến giờ em vẫn chưa tìm được câu trả lời, thì em có nên hỏi tiếp không?
Em nghĩ web excel cũng giống như bao web kiến thức khác như địa lý, hóa học, tiếng anh... được lập ra không chỉ là nơi trao đổi kiến thức excel để tăng trình độ trong chuyên môn excel mà còn giải đáp, chỉ dẫn, tạo động lực cho những người ngoại đạo giống như em, cần giúp đỡ 1 hàm nào đó để xử lý file gấp nhưng sau đó thì có thể không cần dùng nữa chứ không phải lúc nào cũng dùng vì chuyên môn công việc của em không phải làm việc với excel.(Giống như sử dụng ô tô, em biết nạp điện, thay pin, nổ máy và lái, còn những vấn đề hay lỗi phát sinh thì em nhờ những chuyên gia họ xử lý để em có thể tiếp tục lái xe).
Còn nếu 2 anh cảm thấy những vấn đề này quá đơn giản không muốn trả lời các anh có thể bỏ qua. Hoặc các anh cũng có thể đề xuất admin viết lại nội quy tùy chỉnh trình độ có thể post bài để các anh có thể giao lưu với những người hỏi ít mà học/đọc nhiều.
Em cảm ơn, nhờ 2 anh mà cũng nhận ra được vài bài học trong cuộc sống. Và hi vọng mấy anh đừng nên phán xét một con người chỉ vì một hai câu hỏi của họ.
Chúc hai anh trình độ càng ngày càng tăng và giúp đỡ được nhiều người hơn.
 
Haha…vậy là chủ thớt chưa quen văn hoá ở đây rồi: sẽ phải thông qua xét duyệt của cảnh sát diễn đàn xem có biết tiếng Việt, chính tả … xong cái đã. Kế tiếp thì sẽ có chuyên gia (như tâm lý tội phạm) sẽ phán đoán tính cách, trí thông minh hay ngu dốt, làm biếng… (hay cả người không liên quan là “sếp” của bạn cũng không thoát khỏi sự đánh giá này đâu :D ) thông qua câu hỏi của bạn. Còn câu trả lời hướng dẫn thì cứ chờ đi nhé vì cũng có những người sẳn sàng hỗ trợ nhưng bị những comment (giới trẻ bây giờ hay nói là còm-men toxic đó) đi trước nên cũng đứng ngoài luôn. Làm quen từ từ đi bạn. Chúc bạn vượt ải thành công.
 
Em có tạo 4 macro: macro1, macro4, macro5, macro6. Nhưng khi em chạy vba thì chỉ chạy được 3 macro 1,4,5 còn 6 thì bị lỗi. Mọi người giúp em với. Em xin đa tạ. (Có cả ảnh và file luôn nhé)
Trong chính hình bạn chụp đã có câu trả lời rồi, nhưng có thể bạn chưa hiểu.
1730775071800.png

Trong VBA bạn có thể khai báo code tại 3 nơi là sheets(workbook), Module(ClassModule) và userform;
Và theo hình trên, Module1 (nơi chứa code mà bạn đã khai báo trong module *); chỉ chứa 3 đoạn Sub code là Marco1,4,5 nhưng không có Macro6. Nên bạn truy vấn (hay trỏ tới) Macro6 thì báo lỗi vì đoạn code này không tồn tại trong Module1;
Bạn có thể gọi Macro6 bằng các cách thêm dòng
PHP:
Macro6
Cách này sẽ tìm kiếm trong tất cả module trong dự án (trong file này), và chạy, yêu cầu là Macro6 phải là duy nhất, không thì sẽ báo lỗi
PHP:
Module1.Macro6
Cách này sẽ tìm kiếm trong Module1 và chạy Macro6, không thì sẽ báo lỗi.
Do bạn đã chỉ đích danh là Module1.Macro6 là chỉ được tìm trong Module1 nên dù có Macro6 ở vị trí khác thì code không chạy, nó chỉ quan tâm bên trong Module1;
Như kiểu bạn chỉ anh grab tới nhà Ông A để tìm anh C; trong khi thực tế anh C ở nhà ông B. Nên bảo ông A tìm, ông A trả lời là không có.
 
Haha…vậy là chủ thớt chưa quen văn hoá ở đây rồi: sẽ phải thông qua xét duyệt của cảnh sát diễn đàn xem có biết tiếng Việt, chính tả … xong cái đã. Kế tiếp thì sẽ có chuyên gia (như tâm lý tội phạm) sẽ phán đoán tính cách, trí thông minh hay ngu dốt, làm biếng… (hay cả người không liên quan là “sếp” của bạn cũng không thoát khỏi sự đánh giá này đâu :D ) thông qua câu hỏi của bạn. Còn câu trả lời hướng dẫn thì cứ chờ đi nhé vì cũng có những người sẳn sàng hỗ trợ nhưng bị những comment (giới trẻ bây giờ hay nói là còm-men toxic đó) đi trước nên cũng đứng ngoài luôn. Làm quen từ từ đi bạn. Chúc bạn vượt ải thành công.
Nói chuyện kiểu này thì cũng như phe A lợi dụng sách lược "ketiano" để đả kích phe B thôi.
Phe B vì là thiểu số cho nên cứ thỉnh thoảng nhận được phản đối hay chửi xéo của bên B. Rốt cuộc thì ai được giúp đỡ gì không biết chứ thớt là kẻ hả hê nhất.
Phe B rất có khả năng tảng lờ câu hỏi không theo lối văn hóa của mình, nhưng họ vẫn muốn cho người hỏi biết có thể người hỏi tự mình giới hạn số người giải vào phe A mà không hay.

Tôi chỉ giải thích một lần này thôi. Nếu tôi còn làm nữa thì có thể tại mình quên. Bạn toàn quyền lôi ra mà đả kích tiếp.

Riêng cái vụ "hỏi nhiều mà đọc ít" thì bạn đáng lẽ phải biết nhiều hơn ai hết. Nhưng cố tình giải thích lại thì tôi không tin là ở đây có số đông đâu.
 
Lần chỉnh sửa cuối:
Bài #7 đã giải thích việc Macro được goi qua chỗ chứa nó. Thớt không chịu đọc kỹ cho nên khi tôi nhắc thì ngơ ngác hỏi lại "bài #7 ở đâu?". Nếu thớt có đọc kỹ thì phải từ đó mà hỏi tiếp. Nói chung, những người chịu khó đọc kỹ câu trả lời thì đều biết "thói quen dẫn số bài". Hỏi ở đâu thì số bài mặc định là số bài nằm trong thớt ấy. Nếu cần nói về thớt khác thì có thêm tiền tố là link về thớt chứa. Nối cho cùng thì in hệt như vấn đề của bài này.

Trả lời trọn vẹn thì bài #16 đã nói rõ rồi đấy. Chỉ có phần chi tiết về gợi ý thì chưa rõ.
VBA gợi ý theo chi tiết đã nhận. Trong hai modules thì Module1 có Macro1,4,5 đâu có chứa Macro6 cho nên khi gõ Mdule1 (+dấu chấm để VBA biết là tiền tố) thì nó thẳng thắng nêu ra cái list macro1,4,5 - đại khái trong Module1 có cái gì public (không private) thì nó nêu ra hết cho người viết code chọn.

Chi tiết rõ hơn dành cho người viết code nhiều modules.
- Nếu thớt copy Macro6 vào Module1 thì lúc gợi ý cho Module1 sẽ thấy Macro1,4,5,6.
- Nếu copy nhưng chưa xóa Macro6 trong Module2 thì đồng thời cũng sẽ thấy Macro6 trong Module2. Lý do là đối với VBA, hai hàm Macro6 này là hai đối tượng riêng biệt nhau và có cách phân biệt (tiền tố Module1/2)
- Nếu thớt xóa Macro6 trong Module2 thì VBA coi như là hành động dời nhà của đối tượng Macro6

Hai hàm trùng tên nằm trong hai nơi khác nhau thì không có gì sai cả. Người ta vẫn viết vậy thường xuyên. Miễn là lúc gọi thì thêm tiền tố để VBA biết mình muốn thằng nào.
 
Trong chính hình bạn chụp đã có câu trả lời rồi, nhưng có thể bạn chưa hiểu.
View attachment 305287
Trong VBA bạn có thể khai báo code tại 3 nơi là sheets(workbook), Module(ClassModule) và userform;
Và theo hình trên, Module1 (nơi chứa code mà bạn đã khai báo trong module *); chỉ chứa 3 đoạn Sub code là Marco1,4,5 nhưng không có Macro6. Nên bạn truy vấn (hay trỏ tới) Macro6 thì báo lỗi vì đoạn code này không tồn tại trong Module1;
Bạn có thể gọi Macro6 bằng các cách thêm dòng
PHP:
Macro6
Cách này sẽ tìm kiếm trong tất cả module trong dự án (trong file này), và chạy, yêu cầu là Macro6 phải là duy nhất, không thì sẽ báo lỗi
PHP:
Module1.Macro6
Cách này sẽ tìm kiếm trong Module1 và chạy Macro6, không thì sẽ báo lỗi.
Do bạn đã chỉ đích danh là Module1.Macro6 là chỉ được tìm trong Module1 nên dù có Macro6 ở vị trí khác thì code không chạy, nó chỉ quan tâm bên trong Module1;
Như kiểu bạn chỉ anh grab tới nhà Ông A để tìm anh C; trong khi thực tế anh C ở nhà ông B. Nên bảo ông A tìm, ông A trả lời là không có.
Đúng là em không hiểu đoạn đấy thật đấy anh. Vì khi đó em lại nghĩ do em thực hiện thao tác tạo macro bị sai hoặc excel của em bị lỗi. Sau đó em dò thao tác tạo thì vẫn đúng nên xóa luôn excel và cài lại nó nhưng nó vẫn vậy. Cảm ơn anh.
 
Bài #7 đã giải thích việc Macro được goi qua chỗ chứa nó. Thớt không chịu đọc kỹ cho nên khi tôi nhắc thì ngơ ngác hỏi lại "bài #7 ở đâu?". Nếu thớt có đọc kỹ thì phải từ đó mà hỏi tiếp. Nói chung, những người chịu khó đọc kỹ câu trả lời thì đều biết "thói quen dẫn số bài". Hỏi ở đâu thì số bài mặc định là số bài nằm trong thớt ấy. Nếu cần nói về thớt khác thì có thêm tiền tố là link về thớt chứa. Nối cho cùng thì in hệt như vấn đề của bài này.

Trả lời trọn vẹn thì bài #16 đã nói rõ rồi đấy. Chỉ có phần chi tiết về gợi ý thì chưa rõ.
VBA gợi ý theo chi tiết đã nhận. Trong hai modules thì Module1 có Macro1,4,5 đâu có chứa Macro6 cho nên khi gõ Mdule1 (+dấu chấm để VBA biết là tiền tố) thì nó thẳng thắng nêu ra cái list macro1,4,5 - đại khái trong Module1 có cái gì public (không private) thì nó nêu ra hết cho người viết code chọn.

Chi tiết rõ hơn dành cho người viết code nhiều modules.
- Nếu thớt copy Macro6 vào Module1 thì lúc gợi ý cho Module1 sẽ thấy Macro1,4,5,6.
- Nếu copy nhưng chưa xóa Macro6 trong Module2 thì đồng thời cũng sẽ thấy Macro6 trong Module2. Lý do là đối với VBA, hai hàm Macro6 này là hai đối tượng riêng biệt nhau và có cách phân biệt (tiền tố Module1/2)
- Nếu thớt xóa Macro6 trong Module2 thì VBA coi như là hành động dời nhà của đối tượng Macro6

Hai hàm trùng tên nằm trong hai nơi khác nhau thì không có gì sai cả. Người ta vẫn viết vậy thường xuyên. Miễn là lúc gọi thì thêm tiền tố để VBA biết mình muốn thằng nào.
Thật sự đến giờ em vẫn chưa hiểu "Bài #7" mà anh nói đến là bài nào?
"Hỏi ở đâu thì số bài mặc định là số bài nằm trong thớt ấy" theo câu này của anh thì em có thể hiểu bài #7 mà anh nhắc đến là bình luận thứ 7 trong bài post này đúng không anh?
Và thuật ngữ "thói quen dẫn số bài", có phải ý anh là số thứ tự của các bình luận có trong bài post.
Cảm ơn anh đã giải thích thêm phần macro.

 
Web KT

Bài viết mới nhất

Back
Top Bottom