Thủ tục “Hàm” và “Phụ” trong VBA

Các chức năng VBA tích hợp

Trước khi bạn bắt đầu tạo các hàm VBA của riêng mình, bạn nên biết rằng Excel VBA có một bộ sưu tập phong phú các hàm tích hợp sẵn mà bạn có thể sử dụng trong khi viết mã của mình.

Danh sách các chức năng này có thể được xem trong trình chỉnh sửa VBA:

  • Mở sổ làm việc Excel và khởi chạy trình soạn thảo VBA (bấm để thực hiện việc này Alt + F11), và sau đó nhấn F2.
  • Chọn một thư viện từ danh sách thả xuống ở trên cùng bên trái của màn hình VBA.
  • Danh sách các lớp và chức năng VBA dựng sẵn sẽ xuất hiện. Nhấp vào tên chức năng để hiển thị mô tả ngắn gọn của nó ở cuối cửa sổ. bức xúc F1 sẽ mở trang trợ giúp trực tuyến cho tính năng đó.

Ngoài ra, bạn có thể tìm thấy danh sách đầy đủ các hàm VBA tích hợp sẵn với các ví dụ tại Trung tâm Nhà phát triển Visual Basic.

Thủ tục tùy chỉnh “Hàm” và “Phụ” trong VBA

Trong Excel Visual Basic, một tập hợp các lệnh thực hiện một tác vụ cụ thể được đặt trong một thủ tục. Chức năng (Chức năng) hoặc Sub (Chương trình con). Sự khác biệt chính giữa các thủ tục Chức năng и Sub đó là thủ tục Chức năng trả về kết quả, thủ tục Sub - không phải.

Do đó, nếu bạn cần thực hiện các hành động và nhận được một số kết quả (ví dụ: tính tổng một số số), thì thủ tục này thường được sử dụng Chức năngvà để đơn giản thực hiện một số hành động (ví dụ: thay đổi định dạng của một nhóm ô), bạn cần chọn quy trình Sub.

Lập luận

Nhiều dữ liệu khác nhau có thể được chuyển tới các thủ tục VBA bằng cách sử dụng các đối số. Danh sách đối số được chỉ định khi khai báo một thủ tục. Ví dụ, thủ tục Sub trong VBA thêm số nguyên đã cho (Số nguyên) vào mỗi ô trong phạm vi đã chọn. Bạn có thể chuyển số này vào thủ tục bằng cách sử dụng một đối số, như sau:

Sub AddToCells (i As Integer) ... End Sub

Hãy nhớ rằng có các đối số cho các thủ tục Chức năng и Sub trong VBA là tùy chọn. Một số thủ tục không yêu cầu đối số.

Đối số tùy chọn

Các thủ tục VBA có thể có các đối số tùy chọn. Đây là những đối số mà người dùng có thể chỉ định nếu họ muốn, và nếu chúng bị bỏ qua, thủ tục sẽ sử dụng các giá trị mặc định cho chúng.

Quay lại ví dụ trước, để tạo đối số số nguyên cho một hàm tùy chọn, nó sẽ được khai báo như sau:

Sub AddToCells (Tùy chọn i As Integer = 0)

Trong trường hợp này, đối số số nguyên i mặc định sẽ là 0.

Có thể có một số đối số tùy chọn trong một thủ tục, tất cả đều được liệt kê ở cuối danh sách đối số.

Truyền đối số theo giá trị và tham chiếu

Các đối số trong VBA có thể được chuyển tới một thủ tục theo hai cách:

  • ByVal - truyền một đối số theo giá trị. Điều này có nghĩa là chỉ giá trị (nghĩa là, một bản sao của đối số) được chuyển cho thủ tục và do đó bất kỳ thay đổi nào được thực hiện đối với đối số bên trong thủ tục sẽ bị mất khi thủ tục thoát.
  • Theo giới thiệu - truyền một đối số bằng tham chiếu. Đó là, địa chỉ thực của vị trí đối số trong bộ nhớ được chuyển cho thủ tục. Mọi thay đổi được thực hiện đối với một đối số bên trong thủ tục sẽ được lưu khi thủ tục thoát.

Sử dụng từ khóa ByVal or Theo giới thiệu trong khai báo thủ tục, bạn có thể chỉ định cách đối số được truyền vào thủ tục. Điều này được thể hiện trong các ví dụ dưới đây:

Sub AddToCells (ByVal i As Integer) ... End Sub
Trong trường hợp này, đối số số nguyên i được truyền bởi giá trị. Sau khi rời khỏi thủ tục Sub tất cả được làm bằng i các thay đổi sẽ bị mất.
Sub AddToCells (ByRef i As Integer) ... End Sub
Trong trường hợp này, đối số số nguyên i thông qua tham chiếu. Sau khi rời khỏi thủ tục Sub tất cả được làm bằng i các thay đổi sẽ được lưu trữ trong biến đã được chuyển cho thủ tục Sub.

Hãy nhớ rằng các đối số trong VBA được truyền theo tham chiếu theo mặc định. Nói cách khác, nếu từ khóa không được sử dụng ByVal or Theo giới thiệu, thì đối số sẽ được chuyển qua tham chiếu.

Trước khi tiến hành các thủ tục Chức năng и Sub chi tiết hơn, sẽ rất hữu ích nếu bạn có một cái nhìn khác về các tính năng và sự khác biệt giữa hai loại thủ tục này. Sau đây là những thảo luận ngắn gọn về các thủ tục VBA Chức năng и Sub và các ví dụ đơn giản được hiển thị.

Thủ tục VBA «Chức năng»

Trình soạn thảo VBA nhận dạng quy trình Chức năngkhi nó gặp một nhóm lệnh nằm giữa các câu lệnh mở và đóng sau:

Chức năng ... Kết thúc Chức năng

Như đã đề cập trước đó, thủ tục Chức năng trong VBA (trái ngược với Sub) trả về một giá trị. Các quy tắc sau áp dụng để trả về giá trị:

  • Kiểu dữ liệu của giá trị trả về phải được khai báo trong tiêu đề của thủ tục Chức năng.
  • Biến có chứa giá trị trả về phải được đặt tên giống như thủ tục Chức năng. Biến này không cần phải khai báo riêng vì nó luôn tồn tại như một phần không thể thiếu của thủ tục. Chức năng.

Điều này được minh họa rõ ràng trong ví dụ sau.

Ví dụ về hàm VBA: Thực hiện một phép toán trên 3 số

Sau đây là một ví dụ về mã thủ tục VBA Chức năng, có ba đối số thuộc loại Kép (số dấu phẩy động chính xác kép). Kết quả là, thủ tục trả về một số kiểu khác Képbằng tổng của hai đối số đầu tiên trừ đối số thứ ba:

Hàm SumMinus (dNum1 As Double, dNum2 As Double, dNum3 As Double) As Double SumMinus = dNum1 + dNum2 - dNum3 End Function

Thủ tục VBA rất đơn giản này Chức năng minh họa cách dữ liệu được truyền cho một thủ tục thông qua các đối số. Bạn có thể thấy rằng kiểu dữ liệu được trả về bởi thủ tục được định nghĩa là Kép (lời nói Như đôi sau danh sách các đối số). Ví dụ này cũng cho thấy kết quả của quy trình Chức năng được lưu trữ trong một biến có cùng tên với tên thủ tục.

Gọi thủ tục VBA là “Hàm”

Nếu thủ tục trên đơn giản Chức năng được chèn vào một mô-đun trong trình soạn thảo Visual Basic, nó có thể được gọi từ các thủ tục VBA khác hoặc được sử dụng trên một trang tính trong sổ làm việc Excel.

Gọi thủ tục VBA “Hàm” từ một thủ tục khác

Thủ tục Chức năng có thể được gọi từ một thủ tục VBA khác bằng cách chỉ cần gán thủ tục đó cho một biến. Ví dụ sau đây cho thấy một lệnh gọi đến một thủ tục bản tóm tắt, đã được xác định ở trên.

Chính phụ () Tổng số phụ là Tổng cộng gấp đôi = SumMinus (5, 4, 3) Kết thúc phụ

Gọi thủ tục VBA “Hàm” từ một trang tính

Thủ tục VBA Chức năng có thể được gọi từ một trang tính Excel theo cách giống như bất kỳ hàm Excel tích hợp sẵn nào khác. Do đó, thủ tục được tạo trong ví dụ trước Chức năngbản tóm tắt có thể được gọi bằng cách nhập biểu thức sau vào một ô trang tính:

=SumMinus(10, 5, 2)

Thủ tục VBA «Sub»

Trình soạn thảo VBA hiểu rằng có một thủ tục phía trước nó Subkhi nó gặp một nhóm lệnh nằm giữa các câu lệnh mở và đóng sau:

Sub ... End Sub

Thủ tục VBA “Sub”: Ví dụ 1. Căn giữa và thay đổi kích thước phông chữ trong một phạm vi ô đã chọn

Hãy xem xét một ví dụ về một thủ tục VBA đơn giản Sub, có nhiệm vụ thay đổi định dạng của dải ô đã chọn. Các ô được căn giữa (theo cả chiều dọc và chiều ngang) và kích thước phông chữ được thay đổi thành do người dùng chỉ định:

Sub Format_Centered_And_Size (Tùy chọn iFontSize As Integer = 10) Selection.HorizontalAlignment = xlCenter Selection.VerticalAlignment = xlCenter Selection.Font.Size = iFontSize End Sub

Thủ tục này Sub thực hiện các hành động nhưng không trả về một kết quả.

Ví dụ này cũng sử dụng đối số Tùy chọn Cỡ chữ. Nếu đối số Cỡ chữ không được thông qua thủ tục Sub, thì giá trị mặc định của nó là 10. Tuy nhiên, nếu đối số Cỡ chữ thông qua thủ tục Sub, thì phạm vi ô đã chọn sẽ được đặt thành kích thước phông chữ do người dùng chỉ định.

Thủ tục phụ VBA: Ví dụ 2: Căn giữa và Phông chữ đậm trong Dải ô đã Chọn

Quy trình sau đây tương tự như quy trình vừa thảo luận, nhưng lần này, thay vì thay đổi kích thước, nó áp dụng kiểu phông chữ đậm cho phạm vi ô đã chọn. Đây là một thủ tục ví dụ Sub, không có đối số:

Sub Format_Centered_And_Bold () Selection.HorizontalAlignment = xlCenter Selection.VerticalAlignment = xlCenter Selection.Font.Bold = True End Sub

Gọi thủ tục "Sub" trong Excel VBA

Gọi thủ tục VBA là “Sub” từ một thủ tục khác

Để gọi một thủ tục VBA Sub từ một thủ tục VBA khác, bạn cần viết từ khóa Gọi số, tên thủ tục Sub và xa hơn nữa trong ngoặc đơn là các đối số của thủ tục. Điều này được hiển thị trong ví dụ dưới đây:

Chính phụ () Định dạng cuộc gọi_Centered_And_Size (20) Kết thúc phụ

Nếu thủ tục Format_Centered_And_Size có nhiều hơn một đối số, chúng phải được phân tách bằng dấu phẩy. Như thế này:

Sub main () Call Format_Centered_And_Sized (arg1, arg2, ...) End Sub

Gọi thủ tục VBA “Sub” từ trang tính

Thủ tục Sub không thể được nhập trực tiếp vào một ô trang tính Excel, như có thể được thực hiện bằng một thủ tục Chức năngbởi vì thủ tục Sub không trả về giá trị. Tuy nhiên, thủ tục Sub, không có đối số và được khai báo là Công khai (như hình bên dưới) sẽ có sẵn cho người dùng trang tính. Như vậy, nếu các thủ tục đơn giản đã thảo luận ở trên Sub được chèn vào một mô-đun trong Visual Basic Editor, thủ tục Định dạng_Centered_And_Bold sẽ có sẵn để sử dụng trong trang tính Excel và quy trình Format_Centered_And_Size - sẽ không có sẵn vì nó có các đối số.

Đây là một cách dễ dàng để chạy (hoặc thực thi) một thủ tục Sub, có thể truy cập từ trang tính:

  • Ấn Bản Alt + F8 (nhấn phím Khác và trong khi giữ nó, hãy bấm phím F8).
  • Trong danh sách macro xuất hiện, hãy chọn macro mà bạn muốn chạy.
  • Ấn Bản chạy (chạy)

Để thực hiện một thủ tục Sub nhanh chóng và dễ dàng, bạn có thể gán một phím tắt cho nó. Đối với điều này:

  • Ấn Bản Alt + F8.
  • Trong danh sách macro xuất hiện, hãy chọn macro mà bạn muốn gán phím tắt.
  • Ấn Bản Thông số (Tùy chọn) và trong hộp thoại xuất hiện, hãy nhập phím tắt.
  • Ấn Bản OK và đóng hộp thoại Macro (Vĩ mô).

Chú ý: Khi gán phím tắt cho macro, hãy đảm bảo rằng nó không được sử dụng làm chuẩn trong Excel (ví dụ: Ctrl + C). Nếu bạn chọn một phím tắt đã tồn tại, nó sẽ được gán lại cho macro và kết quả là người dùng có thể vô tình khởi động macro.

Phạm vi thủ tục VBA

Phần 2 của hướng dẫn này đã thảo luận về phạm vi của các biến và hằng số và vai trò của từ khóa. Công khai и Riêng. Các từ khóa này cũng có thể được sử dụng với các thủ tục VBA:

Public Sub AddToCells (i As Integer) ... End Sub
Nếu khai báo thủ tục đứng trước từ khóa Công khai, sau đó thủ tục sẽ có sẵn cho tất cả các mô-đun trong dự án VBA đó.
Private Sub AddToCells (i As Integer) ... End Sub
Nếu khai báo thủ tục đứng trước từ khóa Riêng, thì quy trình này sẽ chỉ có sẵn cho mô-đun hiện tại. Nó không thể được gọi trong bất kỳ mô-đun nào khác hoặc từ một sổ làm việc Excel.

Hãy nhớ rằng nếu trước khi khai báo một thủ tục VBA Chức năng or Sub từ khóa không được chèn, thuộc tính mặc định được đặt cho thủ tục Công khai (nghĩa là nó sẽ có sẵn ở khắp mọi nơi trong dự án VBA này). Điều này trái ngược với khai báo biến, theo mặc định là Riêng.

Thoát sớm khỏi các thủ tục VBA “Hàm” và “Phụ”

Nếu bạn cần chấm dứt việc thực thi một thủ tục VBA Chức năng or Sub, không cần chờ đợi kết thúc tự nhiên của nó, thì đối với điều này, có các toán tử Chức năng thoát и Thoát Sub. Việc sử dụng các toán tử này được trình bày dưới đây bằng cách sử dụng một thủ tục đơn giản làm ví dụ. Chức năngA mong đợi nhận được một đối số tích cực để thực hiện các thao tác tiếp theo. Nếu một giá trị không dương được chuyển cho thủ tục, thì không thể thực hiện thêm thao tác nào nữa, vì vậy người dùng sẽ được hiển thị thông báo lỗi và thủ tục sẽ thoát ngay lập tức:

Hàm VAT_Amount(sVAT_Rate As Single) As Single VAT_Amount = 0 If sVAT_Rate <= 0 Then MsgBox "Dự kiến ​​giá trị dương của sVAT_Rate nhưng đã nhận " & sVAT_Rate Thoát Chức năng Kết thúc Nếu ... Kết thúc Chức năng

Xin lưu ý rằng trước khi hoàn thành thủ tục Chức năng - VAT_Số tiền, một hàm VBA tích hợp được chèn vào mã Hộp tin nhắn, hiển thị một cửa sổ bật lên cảnh báo cho người dùng.

Bình luận