Chương trình con VBA Excel: Cách gọi Sub trong VBA bằng ví dụ

⚡ Tóm tắt thông minh

Hàm con (Subroutine) trong Excel VBA là một nhóm các khối mã thực hiện một tác vụ mà không trả về giá trị nào. Trang này sẽ đề cập đến các quy tắc đặt tên, cú pháp của Sub, cách gọi Sub từ nút lệnh và sự khác biệt giữa Sub và Function.

  • 📦 Định nghĩa: Một chương trình con thực hiện một nhiệm vụ cụ thể và không trả về giá trị nào cho đoạn mã gọi nó.
  • ♻️ Khả năng tái sử dụng: Một chương trình con có thể được gọi nhiều lần từ bất kỳ đâu trong dự án.
  • 🔤 Quy tắc đặt tên: Tên không chứa khoảng trắng, bắt đầu bằng một chữ cái hoặc dấu gạch dưới, và không bao giờ là từ khóa VBA.
  • 🧾 Cú pháp: Private Sub name(ByVal arg As String) mở khối và End Sub đóng khối đó.
  • 🖱️ Kêu gọi: Sự kiện Click của nút lệnh sẽ gọi chương trình con và truyền các tham số của nó.
  • ▶ ️ Chạy trực tiếp: Phím F5, hộp thoại Macro hoặc từ khóa Call đều cho phép chạy một chương trình con mà không cần nhấn nút.
  • 🔁 Chức năng phụ: Chọn một hàm (Function) khi cần trả về một giá trị, nếu không thì chọn một thủ tục con (Sub).

Chương trình con Excel VBA

Chương trình con trong VBA là gì?

A Chương trình con trong VBA là một đoạn mã thực hiện một tác vụ cụ thể được mô tả trong mã nhưng không trả về kết quả hoặc giá trị. Các chương trình con được sử dụng để chia các đoạn mã lớn thành các phần nhỏ có thể quản lý được. Các chương trình con có thể được gọi lại nhiều lần từ bất kỳ đâu trong chương trình.

Giả sử bạn đã tạo một giao diện người dùng với các hộp văn bản để chấp nhận dữ liệu đầu vào của người dùng. Bạn có thể tạo một chương trình con xóa nội dung của các hộp văn bản. Một chương trình con VBA Call phù hợp trong trường hợp như vậy vì bạn không muốn trả về bất kỳ kết quả nào.

Tại sao nên sử dụng chương trình con

  • Chia mã thành mã nhỏ có thể quản lý được: Một chương trình máy tính trung bình có hàng ngàn dòng mã nguồn. Điều này làm tăng tính phức tạp. Các chương trình con giúp giải quyết vấn đề này bằng cách chia nhỏ chương trình thành các đoạn mã nhỏ dễ quản lý.
  • Code khả năng tái sử dụng. Giả sử bạn có một chương trình cần truy cập cơ sở dữ liệu, hầu như tất cả các cửa sổ trong chương trình sẽ cần tương tác với cơ sở dữ liệu. Thay vì viết mã riêng cho các cửa sổ này, bạn có thể tạo một hàm xử lý tất cả các tương tác cơ sở dữ liệu. Sau đó, bạn có thể gọi nó từ bất kỳ cửa sổ nào bạn muốn.
  • Các chương trình con và chức năng tự ghi lại tài liệu. Giả sử bạn có một hàm tính toánLoanInterest và một hàm khác có nội dung connectToDatabase. Chỉ cần nhìn vào tên của chương trình con/chức năng, lập trình viên sẽ có thể biết chương trình đó làm gì.

Trước khi ghi tên, trình biên dịch mong đợi tên đó tuân theo một số quy tắc ngắn.

Quy tắc đặt tên chương trình con và hàm

Để sử dụng các chương trình con và hàm, có một bộ quy tắc mà người ta phải tuân theo.

  • Tên hàm gọi chương trình con hoặc VBA không được chứa dấu cách
  • Tên hàm hoặc cuộc gọi VBA Excel phải bắt đầu bằng một chữ cái hoặc dấu gạch dưới. Nó không thể bắt đầu bằng số hoặc ký tự đặc biệt
  • Tên chương trình con hoặc hàm không thể là từ khóa. Từ khóa là một từ có ý nghĩa đặc biệt trong VBA. Những từ như Riêng tư, Phụ, Chức năng và Kết thúc, v.v. đều là ví dụ về từ khóa. Trình biên dịch sử dụng chúng cho các tác vụ cụ thể.

Khi đã chọn được một tên hợp lệ, bản khai báo sẽ tuân theo một khuôn mẫu cố định.

Cú pháp chương trình con VBA

Bạn sẽ cần bật tab Nhà phát triển trong Excel để làm theo ví dụ này. Nếu bạn không biết cách bật tab Nhà phát triển thì hãy đọc hướng dẫn trên Các điều khiển VBA trong Excel

ĐÂY trong cú pháp,

Private Sub mySubRoutine(ByVal arg1 As String, ByVal arg2 As String)
    'do something
End Sub

giải thích cú pháp

Code Hoạt động
  • “Sub riêng mySubRoutine(…)”
  • Ở đây từ khóa “Sub” được sử dụng để khai báo một chương trình con có tên là “mySubRoutine” và bắt đầu phần thân của chương trình con.
  • Từ khóa Private được sử dụng để xác định phạm vi của chương trình con
  • “ByVal arg1 dưới dạng chuỗi, ByVal arg2 dưới dạng chuỗi” :
  • Nó khai báo hai tham số có kiểu dữ liệu chuỗi tên là arg1 và arg2
  • “Kết thúc phụ”
  • “End Sub” được dùng để kết thúc phần thân của chương trình con

Chương trình con sau đây chấp nhận tên và họ và hiển thị chúng trong hộp thông báo.

Bây giờ chúng ta sẽ lập trình và thực hiện Thủ tục phụ này. Hãy xem điều này.

Cách gọi Sub trong VBA

Dưới đây là quy trình từng bước về cách Gọi Sub trong VBA:

  1. Thiết kế giao diện người dùng và đặt các thuộc tính cho điều khiển người dùng.
  2. Thêm chương trình con
  3. Viết mã sự kiện nhấp chuột cho nút lệnh gọi chương trình con
  4. Kiểm tra ứng dụng

Bước 1) Giao diện người dùng

Thiết kế giao diện người dùng như trong hình bên dưới.

Cách gọi Sub trong VBA

Thiết lập các thuộc tính sau. Các thuộc tính mà chúng ta đang thiết lập:

S / N Kiểm soát Bất động sản Giá trị
1 LệnhNút1 Họ tên btnDisplayFullName
2 Chú thích Chương trình con tên đầy đủ

Giao diện của bạn bây giờ sẽ trông như sau.

Cách gọi Sub trong VBA

Bước 2) Thêm chương trình con

  1. Nhấn Alt + F11 để mở cửa sổ mã
  2. Thêm chương trình con sau
Private Sub displayFullName(ByVal firstName As String, ByVal lastName As String)
    MsgBox firstName & " " & lastName
End Sub

ĐÂY trong mã,

Code Hoạt động
  • “Hiển thị phụ riêng tưFullName(…)”
  • Nó khai báo một chương trình con riêng displayFullName chấp nhận hai tham số chuỗi.
  • “ByVal firstName dưới dạng chuỗi, ByVal LastName dưới dạng chuỗi”
  • Nó khai báo hai biến tham số firstName và lastName
  • CôBox FirstName & ” ” & LastName”
  • Nó gọi MsgBox hàm tích hợp để hiển thị hộp thông báo. Sau đó, nó truyền các biến 'firstName' và 'lastName' làm tham số.
  • Ký hiệu “&” được sử dụng để nối hai biến và thêm khoảng trống giữa chúng.

Bước 3) Gọi chương trình con

Gọi chương trình con từ sự kiện nhấn nút lệnh.

  • Nhấp chuột phải vào nút lệnh như hình bên dưới. Chọn Xem. Code.
  • Trình soạn thảo mã sẽ mở

Cách gọi Sub trong VBA

Thêm đoạn mã sau vào trình soạn thảo mã cho sự kiện nhấp chuột vào nút lệnh btnDisplayFullName.

Private Sub btnDisplayFullName_Click()
    displayFullName "John", "Doe"
End Sub

Cửa sổ mã của bạn bây giờ sẽ trông như sau

Cách gọi Sub trong VBA

Lưu các thay đổi và đóng cửa sổ mã.

Bước 4) Kiểm tra mã

Trên thanh công cụ dành cho nhà phát triển, đặt chế độ thiết kế 'tắt'. Như hình dưới đây.

Cách gọi Sub trong VBA

Bước 5) Bấm vào nút lệnh 'Chương trình con FullName'.

Bạn sẽ nhận được kết quả sau

Cách gọi Sub trong VBA

Tải xuống tệp Excel ở trên Code

Nút bấm rất tiện lợi, nhưng đó không phải là cách duy nhất để khởi chạy một chương trình con, và trong quá trình phát triển, nó hiếm khi là cách nhanh nhất.

Cách chạy chương trình con mà không cần nút bấm

Trong khi bạn vẫn đang viết mã, việc thêm một điều khiển vào trang tính chỉ để kiểm tra một chương trình con sẽ lãng phí thời gian. VBA cung cấp bốn cách khác để chạy chương trình con đó, và mỗi cách phù hợp với một thời điểm khác nhau trong chu kỳ phát triển.

  • Nhấn phím F5 trong trình soạn thảo: Đặt con trỏ vào bất kỳ vị trí nào bên trong Sub và nhấn F5. Chương trình sẽ chạy ngay lập tức. Điều này chỉ hoạt động khi Sub không có tham số nào, vì VBA không có giá trị nào để cung cấp.
  • Nhấn F8 để thực hiện các bước tiếp theo: Chạy cùng một lệnh, từng dòng một, để bạn có thể theo dõi sự thay đổi của từng biến trong cửa sổ Locals. Sử dụng lệnh này khi kết quả sai và bạn cần biết lỗi ở đâu.
  • Sử dụng hộp thoại Macro: Trên tab Nhà phát triển, nhấp vào Macro, chọn tên và nhấp vào Chạy. Chỉ những Sub công khai không có đối số mới xuất hiện trong danh sách này, đó là lý do tại sao một Sub trợ giúp thường được khai báo là Private.
  • Gọi từ một Sub khác: Đây là phương pháp được sử dụng cho bất kỳ Sub nào nhận tham số, và là phương pháp mà nút lệnh ở trên dựa vào.

Phương án cuối cùng có hai hình thức được chấp nhận. Viết tên hàm kèm theo các đối số đơn thuần đều được, và từ khóa Call tường minh cũng vậy, nhưng quy tắc dấu ngoặc đơn lại khác nhau giữa hai cách này.

Sub RunTheGreeting()
    ' Form 1: no Call keyword, no brackets
    displayFullName "John", "Doe"

    ' Form 2: Call keyword, brackets required
    Call displayFullName("Jane", "Roe")
End Sub

Cả hai dòng đều thực hiện chính xác cùng một việc. Việc trộn lẫn hai dạng này, bằng cách viết dấu ngoặc mà không có từ khóa Call, là nguyên nhân phổ biến nhất gây ra lỗi biên dịch “Expected: =” khi một Sub nhận nhiều hơn một đối số.

Sự khác biệt giữa Sub và Function trong VBA

Sub và Function là hai loại thủ tục trong VBA, và người mới bắt đầu thường chọn sai loại. Câu hỏi quyết định rất đơn giản: mã gọi có cần trả về giá trị nào không?

Tính năng Sub Chức năng
Trả về một giá trị Không Vâng, đã được gán cho tên hàm.
Đã khai báo với Sub… End Sub Hàm … Kết thúc hàm
Được gọi là Một tuyên bố riêng biệt. Một phần của biểu thức, ví dụ x = myFunc(2)
Có thể sử dụng trong ô bảng tính Không Vâng, như một hàm do người dùng định nghĩa
Sử dụng điển hình Định dạng trang tính, xóa dữ liệu nhập, hiển thị thông báo Tính tổng, chuyển đổi giá trị, tra cứu dữ liệu

Sử dụng Sub khi mã tác động trực tiếp lên sổ làm việc, và một Hàm VBA Khi đoạn mã tạo ra một câu trả lời mà một thứ khác sử dụng.

Câu Hỏi Thường Gặp

Một Private Sub chỉ có thể được gọi từ bên trong mô-đun khai báo nó. Một Public Sub hiển thị cho mọi mô-đun trong dự án và là loại duy nhất xuất hiện trong hộp thoại Macro.

ByVal truyền một bản sao, do đó chương trình con không thể thay đổi biến của người gọi. ByRef truyền chính biến đó, do đó bất kỳ thay đổi nào cũng sẽ hiển thị cho người gọi. ByRef là mặc định khi không có từ khóa nào được viết.

Hãy sử dụng câu lệnh Exit Sub. Câu lệnh này sẽ dừng thủ tục tại điểm đó và trả lại quyền điều khiển cho chương trình đã gọi nó, điều này rất hữu ích khi muốn thoát sớm nếu quá trình kiểm tra xác thực thất bại.

Vâng. Dán macro vào và trợ lý AI sẽ nhóm các dòng liên quan, đề xuất tên mô tả cho mỗi Sub mới và viết lại macro gốc thành một chuỗi các lệnh gọi ngắn. Kiểm tra kết quả trên một bản sao của sổ làm việc.

Đúng vậy. Hãy cung cấp văn bản lỗi và dòng lệnh gọi, và trợ lý AI sẽ xác định các nguyên nhân như dấu ngoặc được sử dụng mà không có từ khóa Call, số lượng đối số sai hoặc kiểu dữ liệu không khớp, sau đó cung cấp dòng lệnh đã được sửa.

Tóm tắt bài viết này với: