Bài viết: Gọi một Private Sub

Liên hệ QC

kyo

Nguyễn Khắc Duy
Thành viên danh dự
Tham gia
4/6/06
Bài viết
901
Được thích
2,714
Gọi một Private Sub


Bạn là một người mới học VBA và bạn cần tìm cách để kích hoạt hay gọi một sub (thủ tục) khác từ sub hiện tại của bạn để thực thi một điều gì đó mà không cần phải viết lại (thậm chí trong nhiều trường hợp viết lại sẽ khó hơn là sử dụng sub có sẵn). Theo cách thông thường, bạn sẽ sử dụng lệnh Call (hoặc không) để gọi một Sub khác. Giả sử như tôi có code sau:

JsawvLtpN_4OPpsXxKZ7zgjiNA_PdJQgqDnDf_HPWIUCPtpLliKc4c4Er6jT5ql0JGAsRq3bM26CodLxRT1CGewhyYm6YB_cHmDrg1-U73EWomSKu-GR1ZiBAqE2LKUsQRZukCqDKoa8i05lfb5Vf9RyC0QwfkpetuCzc_a6gxz-S8b0eSlQMqCvweTosuGq9wPR8EjiXh_So_pupKnu36hgxjju0CTC1S-tIPSz3UU2XYzAqnMnf5X2BRv_wcfd4P4RXNUt3wHwsvBtPOZJxS-stFl8IV60SX-kk5-oGqH5yWUMLhYDoyR7wp3HDHTLh62QCjl05rG64yR9xFC8sFDkca6P1OPaZ_7p69YaKwW2B64dcqP0gv1laT2FjlmV5IN1t9B0AHV258e_SFtjE_5lcelaPeHg09uY1-anYw1UiZjf2AwW5TtOunzWq7m17mucBSZi3QEN-XqiHFAjVfDuQYTBTsKbZ97DpFNq1yg7t6zH4M2OX6YqYkhyMB_cdKi2NlmwFHEuFpStvTHUtHu6Dk8o4ON1z-Bh7ZkY_wvvVAfwt4wYllaViUQBjc_ZGgX0u9bV4_l0X0OTNt7Gklcnz22Yqiud2p1DLi9b2plrN-AnV58N=w504-h264-no


Và khi chạy code, tôi sẽ nhận được kết quả là 2 hộp thoại thông báo Msgbox hiện ra:

bAhNiju2GqYVqIl3WvqjiWCrvpv0CdNV6Ht5E-NcE8yTwLpj9dT326naTg40at5L8iHeuPJIE9Sg5CSawGaW_BGThoPLqLnSSC9OuF0aWndxf80KbmWG3E4Rge1ksHV0FgRauW9OHHRlWNc2ItCPfCtcYOCtVUOfLvWEs86_frvOzQ_e7LEjwDHvFQ8wO2gI_oBmW4n7NyDl6-G86dCzwhj-wq_DCzS6M4CIKNmgnfTpNL52haFKJMXE2aRE5VJg9S0rec3SkStGBgGBYOHKGH0LppnxaRppAfwDrrZz25ed7ldqYDir6NRpUd1i_CITkkLPul5fNqi76bLXTEDe-CjAB-GmaQl9soXIxKb4AHcP27jadIFtmO0D_sPAHfYH4HJPZK20Q4UvOgPCR-Uy8eyAITgdPI1uQ_BRLOBXi50iITMgNT1737pFsCPMXSU8-Nv5aOKoVcHaYn6JH6CxkG7RnVzxi6LJiM5kiotL_b521jPbjKi46LbOYlyZivx6o_osgNO8UlxKyLHLZUD9YIMbfTLKIKFcRPr94-peS1ZfCtViMTNYQv8Njm68-TqJkBCN_JVQcuCZvsgLyBGThWvGmoNr70fzzxR1K6jKagBx1t9835Lj=w261-h158-no


BX_9f_PDACk88c9YdCfjPp1GMRs63ExJjCn2PrvALKBGkzbi_II61oxxSOu0538KAVqndnnGYWyBaLA724NdvYyrJSU77G6-9vi1ZJAK_Fk3jR0Ic4hi6AU3Zh0po8M1MsmMsTMqN44yjWJShDLtksa8KI-7eAJsWl24ztt0UVaF1U-rKpTx4fIr_47qU64tczS5M0VAkACIkdCDNrpIcbzGIy2sZIjNIxkGYnfJeh7pZZJJYeRM9i8jO2nWsALRA6LSHyvU6baAubmXZ7uZl4i8Z133FAdENvUARuS_s_nvFKpgJwiRWzvzE8NTWOzXgpWTiKGey66sMIdT5kSBlu7OGMIHSFsQ4-MwJnk2DFGHguG-zvgw1s57ZUpAKdCpfTxRnqFsePEM2VdoAqPnJwsItjrhEBPP0qeS1xLYTHjpniNJE656k4n_wGawTpkHRaieKZSv1nuQbGu0uEIXjmZJ97GeELJwfic34sV8LfuB4KIDEtjvql_20aNeKkLaRGUYjrZ-0o858kbz1AO_J4qF7rGAchltQXScGTRheMvaEAuK0TwADj-aDwjfFdcR_H4T-rR6hDFxlOXWtup-bo9CRx1V-rpFDVuaKtmryEMAw-Svn-Ja=w333-h161-no


Bây giờ bạn chỉnh sửa lại chút xíu nhé, từ Sub Lienlac thành Private Sub Lienlac.

riBpKdybrJzVzqbQYSKBk9gHbjpHjkVGTW8Z4dXfKgfj85j7c11eISpLPaZaBgtWNKKf7jdWBLWZqQTiMyWGCMVMFyvlq6K4Ed5KFMR4KswongE-VtAQFwZBPB9LU8imtx-kQHgz8CCP6Lo0MFSdeKo8gEp1r3f4gY0tpctUf4I47qVGl9QQorwIL0ojVSSjPSlr5pyYKmABPjSnZMDvLqr2NQmi2Rb0x_ke1sSh0q9izHdZehg0l703dgGUBtWm3ZISiQie6rZPlISErEKpwUs3Uj2uVsG6TGOKN1MFbDQx5SOMooD1cEoOmoSB6VR2vfOwczftve-9rKksqgs7HmxwRiRz008qaOgtNAL6Rgw5V3e2kp6DkFU-HkaiEy2x2BwvZMrHcn396vWXmn__h38aJuTW8FxKV0fAZJAeltUdtvDj0WZU5FirGB7b7lR87pcpJHw2TBiQ5PnhKsGFUu6vIkH8jGvAK7enYHC1DZ_8m_ahruOccHjbPeWNLs4x9H5cnIeX1s7Ln578rxwT7Oh_UtRsT_IWS0eg_drp_xY13-v_P_1iAxiu2qOu5U-QzBvtO1tjnYjjnAStoQnNKCfbdrHYcXXGl-G6GN2L9cGTxpSe3ohR=w502-h250-no


Và chắc chắn rồi, kết quả vẫn sẽ hiện như cũ. Tuy nhiên, tôi muốn bạn thay đổi chút, hãy chuyển Private Sub Lienlac sang Module2 (hoặc một module khác), và hãy chạy lại xem.

Y0arrYXoGERRZOYzTdlBjSyK0q1CG2M9jOgsCw2BupzFyHdD3ZiIAkrdud7zMaJhzAZ4Whpa41JM7mgItocsvRTUVspgXTD9ZGYdsStheUZZ0YnVRAtp1JRnIzJHIBdfLUZdzZFGihWeh6e_1TG1_6hbDQAfBhOHYWhDamYf5GD08VJzOCUXqT7ZR_PCOa0zm1EEJCip0Su2nZGsCDETpt8CuBdslqnyxm7wYT3hn39L4-qkOp0IxN_1fDerSN702a5fwka0YnKEs8Y5wkaxBsrj94WCWUcP8i_BEuKAPYR9TLVW4g47tbH95QqvnsQJ50AT_tXXty7ngU0mF5EgIP4T4CfB1iKdOqFciAPp3KirGEQDQ98PEANdy7mkaGFByMTRfm528rtogHD-Ag2GQXIeZoiXkvZZEXGZuqxfopzEpia9uM_Fwe3JsFP1nI5ACbCfx0eRGJ8e0nt1N0b8d_Za3EcQB-EgR2pMR-QtzpWTtCp6VX213GYmPxoH3Yk2dPhmgFiJqnYhEfksdYWnAmbtVAg6n20TbdYRPX1MMlXG0HdR_cqf4AC1uP3EdON83HLqBkzntOUh3-SrOGze5kR9HtTXue9MOK2TCPvugdcYbC8Kjuph=w772-h471-no


Và khi chạy lại, bạn sẽ gặp lỗi:

7CPpgjkJFRbAUIDCRrUYlA_mJ_PK7V9VsQLUWC9W3z-6R0330a-txytb54fMAkUAW4-CQjJ9JxoJVK3xFTFH4E74KSNpHJblUJRtiLYaIelH6gD8v1A28VOcKBjp9mA0Ea1EkF-O4px6_7BpWrsEPh-1iBbjuqcOM_1PsA6n0cQjkfgON75p_CvNpF81Bqz19J3SxWTQDIzX1xDWZyex83KVG_lUm09J6J2ELoXFFoDrfsISW8xwH-BmOyyvPRdtXBekdamsLrE-jONSxB9biewVqMwKAujnMxJzj5Ts7QK1SJVTDyS5RS7Yl7-mUNLqNTULoU10mF6KWJqQb0ez99ONTvYiSwbdWI0wLcMPcx6Yja4DFjH7cLJcTpdq4R_xVVPw66L6ivY2a4o1ujXE9bNwvsEIwcaWuJyRQLDUAnnbBQkBw7Rp1rKGilHO73W_0GmTASY8kbv08fZg_TSgXZR4q-P1efalPUqrI6kAgKAzrnoFBZeaVvCq_5-HEFnhvSLeZ1UnJm2gPUZ3gxR_-qejBBGe76-nEhhq__6-VuzUj7R9Y0MYt5rl_-HMRC_ApE21HjGYt3ZQatMmWzI9XIi8qo5ajiLZ7YwN00Z0x9l1zUYawSng=w666-h497-no


Tuy nhiên, nếu bạn bỏ chữ Private và chỉ giữ lại Sub Lienlac ở Module2, code vẫn chạy như thường.

Tới đây chắc bạn đã hiểu sự khác biệt giữa Sub và Private Sub rồi chứ? Private Sub là một thủ tục chỉ hoạt động cục bộ ngay tại module mà nó được khai báo, do đó, nếu nó ở Module1 thì Sub Hello_GPE sẽ gọi được, nhưng nếu nó chuyển qua Module2 thì sẽ gặp lỗi như trên.

Vậy cách khắc phục ở đây là gì? Đó là sử dụng Application.Run. Bạn hãy làm như sau:

jBjRktURWkD6ewjYVdjDmJRvvZ7Y6AqhkRy4HHfmemrRH8YSoSwKlGEzQ8xg62Pf-shLkEOFt1bmN1O1GsQNr86ICSLtGowP0PIhSh36RInTrzXBPRzQuBg8BM9k0B9JmXvDdXApz4CBwIbR6hkApH5g615u6HghB5lEDmyLKjALgetkxljVv7-bRX830OGWJXbVQJPGYoW4hAhxip9RxhLtrXqG8MaVuYTXSZTYMoAhKBJlo1Qo00XDnmKFl1_4osUxDKCeq5FUXqN0FH0zMbBWrCdQJsRNb0XSzEVRnayfOieIFrgItCEQlW_icc9s8ONKoN2_mB1sxkYLLsQcrtDbKTNSnODYLnDVnCgOcDTrrZyyJY4V2_bBsaNBoUbksg-GnarYw88ZqlRY8H6dFSOOooV1c3Ogbnvj979NJueAUkNKqZGVHreVDDd0yH5p6SwWC1yAgEIFlZkxu5ZqOHs1O32mKDsgOF5mXZesiGBc586xqhaguoKXfvaMYcamV1JEUnmPiDlSHaducNEnuiDFYXwVDWRWdsPPTlDfMPebS_h_bYn4VW5bByZVGDKNGIG9LGPc6Ypo9GFPQLywjjwlgyBJkGUa8z6oPG0xPEEesgMZUT5M=w616-h493-no


Ứng dụng này có thể được áp dụng khá tốt nếu bạn muốn gọi một sự kiện, chẳng hạn Worksheet_Change. Vì nó rõ ràng là một Private Sub nên việc bạn gọi trực tiếp bằng Call là không thể.

eTXsPqqZEPuwCbHsgKOZTapWeSzmhI2n6FLXsBx3wnAvhtwwHlH1SRu029LYepLTH3TaKpHiZgeIEtgPylutuWriWmDWq0937s-W8aRrwN0TdKkxfu820uWFrsCP848w4HtStoZDI0irRvwJudQM6zJhacr3j3yRFK8nhGcvUwd6ypeCF5QaAbLoFzNJg7J5MI-oJqcAEkcidzfLgGU6vHxgQPflIZXEI3jEPQhXSiCGzpLeeUiHNTR0aVxtHQdD-kkL_p_DYhEg5Gw_3KcisF8AGPipS_gW4NSzAFbjR53EqxqNtb1O4P2wRLkvabRL-vB3JprQ1NYF7XbPsevg0oAMhuyfS9sAr-Xs4UoJXVg8Hlw7Z_fNPrexyZaNCND_uPHNoOnv0-ev-GTEr3Pn0kWK3_ZrEKl8C3ue1OcUr4KiJxVd9UfcdDDEp3YseQ1MGOJF-YobNPLPAFwzEdRF-ct59DesWl7CZX0USS3kPttaDTX0j0QEEWde_cV-juceyrnLOZNHt5lgjkOTQM2k6u2Q6Ey0HdhBxHLX1tb41_YlTPCy4yao9kefVA3oZOvxMXlApMbrWKKxtGnLM81fLIcIAg-gpx4sRTZGIosAz6NihWId0tNh=w735-h177-no


Giả sử tôi muốn gọi sự kiện này của Sheet1, tôi liền áp dụng ngay Application.Run như sau:

sVucO2zH-C3GSUFwaSs1ltv3NAV1n2kGiVZgCYfmlj6D-10inz0ycmrddJSeWEFRcoW-sd5_dxhhdadoDQOtAve4gnQqua_hSbyM9mncJGiMpeU2iBJA2n8f6xQZjdUW8-sGYsAG52eyk6FLol9bCd8dH1-sfUQygMHWuAeDofIH9JF29wM-qHunqKrBNtsMKXL7ZfIyZxfn-QtvZlJOrouuHt0ZCIAi3zOWd4WHu0wC2dR5ChKi0qoAKoWYC9aKnYXHCZgBM4r1ljeInvEoyGwGxhbjjgRytR_n5syHF5P8YS6JFnaHvzwXebqGPbJbwtjBHThkg9jIRQZ7d7imp2Rp5QfhIglPJU9A7kvd8PuVgYfJ1mv3NkJXoRP38pXATLXLRu3uHM0LxVmxqpzXCnABTh2RUnpktbVf47LgvAwhVrmtbOhied-lb0nyqvetXzN2egorxSbRnKh4SlqsBeGZHWKGvLyZQst-QLVVhLbAUXPSUWunQ0HgBBMoZKLyBCQgGTKJW0Q7QSxVmc5505BM5RCMrGEISqx1OowebxQAErFZPnILHRf2A4H0PrkfvJueG_EBB2yYLhlXNqeqv40_b7bXo-N7bcOQTVz6wRvCR-aySMzp=w575-h425-no


Và kết quả y chang như kích hoạt sự kiện vậy.

N34MidaLrmhgYWWg3548aWZt3JP18QWUxJOkxSmdANxmRL3b0ZplRZl7SDQy6rz8sSLw6u9TrrmhDoiy8MKSzX4iEtKpCzEMfJHmF-Wmnisngwf3UXsmv60-WT3nxIWUZ2pc1PUGfx6dUCHn-k0XmX_rbIhBJfD0WP03S4e3Ocym850X7Ya6i8JVBcdM2ImehjLONTADC6-3BVdCQ8loVlA741bKzd5xTPtMBqz4ri17VnGNtaaoVGGMIcdv612ZCMJUeBsLKzejiXh6iyBfuVaDrFtb4aov-mHkb8qt3Kn5KNX0pPKXhAOycc6gHzL8Yy0AFtFsIiQG74I85X-vtyllvo4WWKJkzy2NedrQiVQX7oF0DeXXgkneljBam8MijKe5B3IftbocL4seDKMvOWh7y_7Dnh4kueR2TfwVwj35GPQYdQ6RX8zAcxSHzLB4ZTxuD2QxukgZH_o6154LJ4gcrUaWgiuPowE1skIOJq2BbuHA2tjpXGkn_0e1ZGtMmbK37hP7A4lo7MRYWebjf7EAdaS551tkdNe1MD0gaJBujtSOVN_dLuMlTXRzbUn26CAeeevNhJv6qqXHU0rXrOQh0vikpWrt0-99ipNRce6V7ZS-fh1I=w345-h208-no


Chúc bạn thành công!

Một số bài viết có liên quan:
1/ Xếp một trường theo một trật tự màu quy định trước
2/ Hàm để lấy chỉ số màu trong các ô đã Conditional Formatting
3/ Khai báo sử dụng các thành phần đối tượng của Excel
4/ Sử dụng Worksheet Function trong VBA
5/ Hiển thị tiếng việt cho hộp thông báo trong ACCESS & Excel
6/ Khai báo biến và đặt tên biến trong VBA
7/ Hướng dẫn truyền tham số trong VBA (ByVal & ByRef)
8/ UDF hữu ích: Xác định một vùng có tồn tại trong một vùng khác hay không
9/ UDF hữu ích: Một số hàm thông dụng cần thiết
10/ UDF hữu ích: Hàm tìm hàng cuối, cột cuối, ô cuối, ...
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom