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
Sửa mấy từ mầu đỏ đó đi là được hỗ trợ thôi.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 chỉ giáo giúp em. Em xin đa tạ. (Có cả ảnh và file luôn nhé)
Em sửa rồi nhé. Anh hỗ trợ giúp với.Sửa mấy từ mầu đỏ đó đi là được hỗ trợ thôi.
. . . . . . . . . . . . . . .Em sửa rồi nhé. Anh hỗ trợ giúp vớ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?. . . . . . . . . . . . . . .
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.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.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?
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ấmBạn cứ bỏ hết chữ Module và dấu chấm đi, còn giải thích thì mình chịu.
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 ạ.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
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.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 ạ.
Cảm ơn bạn nhiều nhé.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
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 á.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
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.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ẳng lẽ bạn không biết gì về thói quen dẫn số bài ở GPE?...
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 á.
...
"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?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"
Phản hồi rất lịch sự, tớ thích cách phản hồi này. Tuy nhiên, "trích dẫn trên" mà đứng trước chữ "vọng" thì thay "y" ngắn thành "i" dài 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.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é)
Macro6
Module1.Macro6
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.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) 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.
Đú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.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
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ỗiPHP:Macro6
Cách này sẽ tìm kiếm trong Module1 và chạy Macro6, không thì sẽ báo lỗi.PHP:Module1.Macro6
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ó.
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?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.