Hướng dẫn về hàm VBA Excel: Trả về, gọi, ví dụ

⚡ Tóm tắt thông minh

Hàm VBA trong Excel là một khối mã thực hiện một tác vụ và trả về kết quả cho đối tượng gọi nó. Trang này trình bày cú pháp khai báo, trả về giá trị, ví dụ phép cộng đã thực hiện và cách sử dụng hàm bên trong một ô bảng tính.

  • 🎯 Định nghĩa: Hàm thực hiện một nhiệm vụ cụ thể và trả về một kết quả duy nhất cho mã gọi hàm đó.
  • 🧾 Cú pháp: Tên hàm (đối số) As Type mở khối lệnh và End Function đóng khối lệnh đó.
  • ↩️ Trả về một giá trị: Gán kết quả cho tên hàm, ví dụ như hàm add.Numbers = Số thứ nhất + Số thứ hai.
  • 🔢 Kiểu trả về: Khai báo là Dài hoặc Như Double Tránh sử dụng biến thể mặc định chậm hơn.
  • 🖱️ Kêu gọi: Nút lệnh truyền hai số và hiển thị tổng trả về trong hộp thoại thông báo.
  • 📊 Sử dụng phiếu bài tập: Một hàm công khai trong một mô-đun chuẩn sẽ trở thành một công thức do người dùng định nghĩa trong bất kỳ ô nào.

Hàm VBA trong Excel

Chức năng là gì?

Hàm là một đoạn mã thực hiện một tác vụ cụ thể và trả về kết quả. Các hàm chủ yếu được sử dụng để thực hiện các tác vụ lặp đi lặp lại như định dạng dữ liệu cho đầu ra, thực hiện các phép tính, v.v.

Giả sử bạn đang phát triển...ping Một chương trình tính toán lãi suất cho vay. Bạn có thể tạo một hàm nhận vào số tiền vay và thời hạn trả nợ. Sau đó, hàm này sẽ sử dụng số tiền vay và thời hạn trả nợ để tính toán lãi suất và trả về giá trị.

Tại sao phải sử dụng hàm

Ưu điểm của việc sử dụng hàm cũng tương tự như ưu điểm của chương trình con: chúng chia một chương trình dài thành các phần dễ quản lý, có thể được tái sử dụng ở bất kỳ đâu trong dự án, và tên gọi mô tả rõ ràng chức năng của đoạn mã. Hướng dẫn sử dụng hàm con VBA trong Excel Bao gồm đầy đủ các quyền lợi đó.

Quy tắc đặt tên chức năng

Các quy tắc đặt tên cũng giống hệt như đối với các chương trình con. Tên hàm không được chứa dấu cách, phải bắt đầu bằng một chữ cái hoặc dấu gạch dưới, và không được là tên dành riêng. VBA Từ khóa như Function, Private hoặc End.

Cú pháp VBA khai báo hàm

Private Function myFunction (ByVal arg1 As Integer, ByVal arg2 As Integer)
    myFunction = arg1 + arg2
End Function

ĐÂY trong cú pháp,

Code Hoạt động
  • “Hàm riêng myFunction(…)”
  • Ở đây từ khóa “Function” được sử dụng để khai báo một hàm có tên là “myFunction” và bắt đầu phần thân của hàm.
  • Từ khóa 'Private' được sử dụng để xác định phạm vi của hàm
  • “ByVal arg1 là số nguyên, ByVal arg2 là số nguyên”
  • Nó khai báo hai tham số có kiểu dữ liệu số nguyên có tên là 'arg1' và 'arg2.'
  • myFunction = arg1 + arg2
  • đánh giá biểu thức arg1 + arg2 và gán kết quả cho tên của hàm.
  • “Chức năng kết thúc”
  • Lệnh “End Function” được sử dụng để kết thúc phần thân của hàm.

Cách trả về giá trị và thiết lập kiểu dữ liệu cho hàm

Hàm có một nhiệm vụ mà chương trình con không có: nó trả về một giá trị. Có hai chi tiết kiểm soát giá trị đó, và cả hai đều rất dễ bị bỏ sót.

Đầu tiên là phép gán. VBA không có câu lệnh Return. Thay vào đó, bạn gán kết quả cho chính tên của hàm, đó là lý do tại sao dòng lệnh lại có dạng như vậy. myFunction = arg1 + arg2Nếu phép gán đó không bao giờ được thực thi, hàm sẽ âm thầm trả về một giá trị rỗng thay vì báo lỗi, vì vậy mọi nhánh của mã đều phải thiết lập giá trị đó.

Thứ hai là kiểu trả về. Khai báo ở trên kết thúc ở dấu ngoặc đóng, vì vậy hàm trả về một kiểu Variant. Thêm mệnh đề As sau dấu ngoặc sẽ sửa kiểu, giúp tăng tốc độ, sử dụng ít bộ nhớ hơn và cho phép trình biên dịch phát hiện sự không khớp.

Tờ khai Hoàn trả Khi nào sử dụng nó
Hàm f(x As Long) biến thể Chỉ khi loại kết quả thực sự khác biệt
Hàm f(x As Long) As Long dài Số nguyên như số lượng và số hàng.
Hàm f(x As Long) As Double Double Bất kỳ phép tính nào tạo ra số thập phân
Hàm f(x As Long) As String Chuỗi Văn bản được định dạng trả về để hiển thị
Hàm f(x As Long) As Boolean Boolean Kiểm tra xác thực trả lời đúng hoặc sai.

💡 Mẹo: Sử dụng hàm Exit để thoát sớm sau khi giá trị trả về được thiết lập, tương tự như cách hàm Exit Sub thoát khỏi một chương trình con.

Chức năng được thể hiện bằng ví dụ:

Các chức năng rất giống với chương trình con. Sự khác biệt chính giữa chương trình con và hàm là hàm trả về một giá trị khi được gọi. Mặc dù chương trình con không trả về giá trị khi nó được gọi. Giả sử bạn muốn cộng hai số. Bạn có thể tạo một hàm chấp nhận hai số và trả về tổng của các số đó.

  1. Tạo giao diện người dùng
  2. Thêm chức năng
  3. Viết mã cho nút lệnh
  4. Kiểm tra mã

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

Thêm nút lệnh vào bảng tính như minh họa bên dưới

Hàm và chương trình con VBA

Hãy đặt các thuộc tính sau của CommandButton1 thành các giá trị sau.

S / N Kiểm soát Bất động sản Giá trị
1 LệnhNút1 Họ tên btnThêmNumbers
2 Chú thích Thêm Numbers Chức năng

Giao diện của bạn bây giờ sẽ xuất hiện như sau

Hàm và chương trình con VBA

Bước 2) Mã chức năng.

  1. Nhấn Alt + F11 để mở cửa sổ mã
  2. Thêm mã sau đây
Private Function addNumbers(ByVal firstNumber As Integer, ByVal secondNumber As Integer)
    addNumbers = firstNumber + secondNumber
End Function

ĐÂY trong mã,

Code Hoạt động
  • “Thêm chức năng riêng tưNumbers(…) ”
  • Nó khai báo một hàm riêng tư “thêmNumbers” chấp nhận hai tham số nguyên.
  • “ByVal firstNumber dưới dạng số nguyên, ByVal thứ hai dưới dạng số nguyên”
  • Nó khai báo hai biến tham số firstNumber và secondNumber
  • "cộngNumbers = Số thứ nhất + Số thứ hai”
  • Nó cộng các giá trị FirstNumber và SecondNumber rồi gán tổng cần cộngNumbers.

Bước 3) Viết Code hàm đó gọi hàm

  1. Nhấp chuột phải vào nút ThêmNumbers nút lệnh
  2. Chọn Xem Code
  3. Thêm mã sau đây
Private Sub btnAddNumbers_Click()
    MsgBox addNumbers(2, 3)
End Sub

ĐÂY trong mã,

Code Hoạt động
“Tin nhắnBox thêm vàoNumbers(một)"
  • Nó gọi hàm addNumbers và truyền vào 2 và 3 làm tham số. Hàm trả về tổng của hai số năm (5)

Bước 4) Chạy chương trình, bạn sẽ nhận được kết quả sau

Hàm và chương trình con VBA

Tải xuống Excel chứa mã ở trên

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

Nút phía trên gọi hàm từ mã VBA. Hàm cũng có thể được gọi trực tiếp từ trang tính mà không cần dùng nút nào.

Cách sử dụng hàm VBA trong ô bảng tính

Một hàm được viết bằng VBA có thể được nhập trực tiếp vào ô giống như hàm SUM hoặc VLOOKUP. Excel gọi đây là hàm do người dùng định nghĩa, hay UDF, và đó là lý do nhiều người học hàm trước khi học các chương trình con. Ba điều kiện phải được đáp ứng.

  • Đặt nó vào một mô-đun tiêu chuẩn: Chèn, Mô-đun trong trình chỉnh sửa. Một hàm được lưu trữ phía sau một trang tính hoặc trong ThisWorkbook sẽ không hiển thị trên thanh công thức.
  • Công khai điều này: Ví dụ trên sử dụng thuộc tính Private, giúp ẩn thông tin khỏi Excel. Thuộc tính Public là mặc định, vì vậy chỉ cần xóa từ khóa là đủ.
  • Trả về giá trị, không thay đổi gì: Hàm do người dùng định nghĩa (UDF) không thể định dạng ô, xóa hàng hoặc ghi vào ô khác. Excel sẽ chặn các thao tác đó và ô sẽ hiển thị lỗi #VALUE!.

Hàm bên dưới chuyển đổi nhiệt độ và có thể được sử dụng ở bất kỳ đâu trên bảng tính.

Public Function CelsiusToF(ByVal Celsius As Double) As Double
    CelsiusToF = (Celsius * 9 / 5) + 32
End Function

Lưu bảng tính dưới dạng tệp .xlsm có hỗ trợ macro, sau đó nhập =CelsiusToF(A1) vào bất kỳ ô nào. Kết quả sẽ cập nhật mỗi khi ô A1 thay đổi, và tên sẽ xuất hiện trong danh sách tự động hoàn thành công thức dưới mục Người dùng định nghĩa. Vì sổ làm việc hiện chứa macro, bất kỳ ai mở nó đều phải bật nội dung trước khi công thức trả về một giá trị thay vì #NAME?.

Các lỗi thường gặp trong hàm VBA và cách khắc phục chúng.

Bốn vấn đề này là nguyên nhân chính dẫn đến hầu hết các hàm biên dịch thành công nhưng trả về kết quả sai.

  • Hàm trả về giá trị rỗng hoặc 0: Kết quả không bao giờ được gán cho tên hàm, hoặc một nhánh của câu lệnh If bỏ qua việc gán giá trị. Hãy đặt giá trị trả về trên mọi đường dẫn.
  • #NAME? trong một ô bảng tính: Chức năng này là riêng tư, nằm trong một mô-đun trang tính thay vì mô-đun tiêu chuẩn, hoặc sổ làm việc được lưu mà không bật macro.
  • Tràn số khi sử dụng đối số kiểu số nguyên: Ví dụ này sử dụng kiểu dữ liệu As Integer, chỉ hỗ trợ tối đa 32,767. Hãy thay đổi cả hai tham số và kiểu trả về thành Long để sử dụng với dữ liệu thực.
  • Một lập luận thay đổi khiến người gọi ngạc nhiên: Việc bỏ qua ByVal khiến VBA truyền chính biến đó, do đó hàm có thể thay đổi giá trị của biến gọi. Hãy viết ByVal trừ khi bạn muốn có hiệu ứng đó.

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

Không trực tiếp. Hãy trả về một mảng hoặc một kiểu dữ liệu tùy chỉnh để chứa nhiều giá trị trong một kết quả duy nhất, hoặc khai báo các tham số bổ sung bằng ByRef để hàm ghi lại vào các biến của người gọi.

Thêm từ khóa Optional với giá trị mặc định, ví dụ như Optional ByVal Rate As Double = 0.05. Mọi tham số sau tham số Tùy chọn cũng phải là Tùy chọn và chúng phải đứng cuối danh sách.

Đúng vậy, thông qua Application.WorksheetFunction, ví dụ: Application.WorksheetFunction.Sum(Range(“A1:A10”)). Các hàm mà VBA đã cung cấp, chẳng hạn như Left hoặc Trim, được gọi trực tiếp mà không cần tiền tố đó.

Đúng vậy. Dán công thức vào bảng tính và trợ lý AI sẽ trả về một hàm công khai tương đương với các đối số được đặt tên và kiểu trả về được khai báo. So sánh cả hai kết quả trên các hàng mẫu trước khi thay thế công thức.

Đúng vậy. Hãy cung cấp hàm và công thức, và trợ lý AI sẽ chỉ ra các nguyên nhân như lỗi không khớp kiểu dữ liệu đối số, thiếu phép gán giá trị trả về, hoặc lỗi khi cố gắng thay đổi một ô từ bên trong hàm do người dùng định nghĩa.

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