VBA ByRef Loại đối số không phù hợp Lỗi | 3 lý do hàng đầu & sửa lỗi
Loại đối số ByRef Không khớp trong Excel VBA
Trong bài viết này, chúng tôi giải thích lỗi gặp phải khi sử dụng Excel VBA ByRef là “Lỗi không khớp kiểu đối số”. Trước đó, hãy để tôi giới thiệu với bạn về “By Ref” trước. Các biến là chìa khóa cho bất kỳ ngôn ngữ lập trình nào và VBA cũng không khác. Chúng ta đã thấy nhiều cách khai báo biến, một cách khai báo biến như vậy là sử dụng các từ “ByRef” và “ByVal”.
ByRef có nghĩa là gì?
“ByRef” có nghĩa là “Theo tham chiếu”, sử dụng từ này, chúng ta thực sự có thể chuyển các đối số cho các thủ tục (cho cả hàm con và hàm) bằng cách tham chiếu. Điều này không giống như người anh em của nó "By Val" không linh hoạt nhưng cố định về bản chất.
Để hiểu điều này, chúng ta hãy xem hai macro dưới đây.
Mã:
Sub Macro1 () Dim A As Long A = 50 Macro2 A MsgBox A End Sub Sub Macro2 (ByRef A As Long) A = A * 10 End Sub
Chúng ta có hai quy trình con ở đây được đặt tên tương ứng là Macro1 & Macro2. Để hiểu điều này tốt hơn, hãy chạy macro từng dòng bằng cách nhấn phím F8.
Nhấn phím F8 để nhận giá trị của biến “A” là 50.
Dòng mã tiếp theo cho biết “Macro2 A” tức là tên của macro thứ hai và “A” là biến được xác định thông qua từ “By Ref”.
Như bạn có thể thấy ở trên tại thời điểm chúng tôi thực hiện dòng mã “Macro2 A”, nó đã chuyển sang thủ tục phụ VBA tiếp theo từ quy trình trên.
Bây giờ chúng ta có thể thấy giá trị của biến “A” là 50, điều này là do chúng ta đã sử dụng từ “ByRef” để khai báo biến “A” giống như trong Macro1, nó đã nắm bắt được giá trị mà chúng ta đã gán cho biến này “ A ”từ Macro1 .
Bây giờ trong phương trình macro ( Macro2 ) này cho biết A = A * 10 tức là A = 50 * 100. Nhấn phím F8 3 lần để quay lại macro trên ( Macro1 ).
Bây giờ nhấn phím F8 một lần nữa để xem giá trị của biến “A” trong hộp thông báo trong VBA.
Giá trị cho biết 500.
Mặc dù giá trị chúng tôi đã gán trong macro này (Macro1) là 50, bằng cách sử dụng từ ByRef, chúng tôi thực sự đã kích hoạt quy trình con Macro2 bằng cách giữ lại giá trị của biến “A” từ Macro1 và sau đó thực thi giá trị của A bằng cách nhân với 10.
3 lý do hàng đầu khiến loại đối số Byref của VBA không khớp
Ở trên chúng ta đã thấy cách hoạt động của “ByRef” nhưng chúng ta nhất định mắc phải một số lỗi dẫn đến việc đưa ra thông báo lỗi VBA là “ByRef Argument Type Mismatch”.
Điều này là do nhiều nguyên nhân và trong phần này, chúng tôi sẽ hướng dẫn bạn cách khắc phục lỗi này và gỡ lỗi mã.
Bạn có thể tải xuống Mẫu Excel kiểu đối số không khớp VBA này tại đây - Mẫu Excel kiểu đối số không khớp VBALý do lỗi # 1 - Các tên biến khác nhau
Một trong những lý do chính đằng sau việc nhận được lỗi này trong Excel VBA là do các biến khác nhau được truyền trong hai thủ tục. Để có ví dụ, hãy xem các mã dưới đây.
Mã:
Sub Macro1 () Dim A As Long A = 50 Macro2 B MsgBox A End Sub Sub Macro2 (ByRef A As Long) B = B * 10 End Sub
Trong Macro1, chúng tôi đã sử dụng biến “A” và trong Macro2, chúng tôi đã sử dụng biến “B”. Bây giờ nếu bạn cố gắng chạy mã, chúng tôi sẽ nhận được Lỗi VBA là "ByRef Argument Type Mismatch".
Như bạn có thể thấy ở trên, biến “B” đã được đánh dấu vì loại tên biến không khớp.
Giải pháp: Để khắc phục vấn đề này, chúng ta cần đảm bảo rằng các tên biến trong cả hai thủ tục là chính xác.
Lý do lỗi 2: Các kiểu dữ liệu biến khác nhau
Mặc dù các tên biến giống nhau nhưng nó vẫn gây ra lỗi do kiểu dữ liệu chúng ta gán cho chúng. Nhìn vào đoạn mã dưới đây.
Mã:
Sub Macro1 () Dim A As Integer A = 50 Macro2 A MsgBox A End Sub Sub Macro2 (ByRef A As Long) A = A * 10 End Sub
Trong các mã trên, tôi đã khai báo biến “A” là kiểu dữ liệu Số nguyên trong Macro1 và trong Macro2, cùng một biến đã được gán kiểu dữ liệu là “Dài”.
Khi chúng tôi chạy mã này, nó sẽ gây ra lỗi vba “ByRef Argument Type Mismatch”.
Điều này là do chúng tôi đã gán hai kiểu dữ liệu khác nhau cho cùng một tên biến.
Giải pháp: Kiểu dữ liệu phải giống nhau trong cả hai quy trình.
Lý do lỗi 3: Thiếu loại dữ liệu biến trong một macro
Lỗi VBA Excel “Không khớp loại đối số ByRef” có thể xảy ra do kiểu dữ liệu được chỉ định trong một macro và không được chỉ định trong macro khác.
Mã:
Sub Macro1 () A = 50 Macro2 A MsgBox A End Sub Sub Macro2 (ByRef A As Long) A = A * 10 End Sub
Trong đoạn mã trên của Macro1, tôi đã không khai báo bất kỳ biến nào mà chỉ đơn giản là gán giá trị cho biến.
Mặt khác, đối với Macro2, tôi đã khai báo biến “A”. Nếu bạn thử chạy mã này, nó sẽ gây ra lỗi VBA “ByRef Argument Type Mismatch”.
Giải pháp 1: Để tránh những trường hợp này, giải pháp đầu tiên là khai báo biến trong cả hai thủ tục và gán cùng một kiểu dữ liệu.
Giải pháp 2: Một giải pháp thay thế là bắt buộc khai báo biến bằng cách thêm từ “Option Explicit” ở đầu mô-đun.
Điều này sẽ làm là trước khi nó hiển thị lỗi VBA “ByRef Argument Type Mismatch”, nó thực sự yêu cầu chúng ta khai báo biến trước.
Vì vậy, Option Explicit luôn có ích trong VBA.
Những điều cần ghi nhớ
- ByRef đối lập với By Val.
- ByRef mang tham chiếu từ thủ tục này sang thủ tục khác.
- Tên biến, kiểu dữ liệu phải giống nhau trong cả hai thủ tục.
- Mỗi biến cần được khai báo riêng trong trường hợp có nhiều biến.