Ketidakcocokan Jenis Argumen VBA ByRef

ByRef Argument Type Mismatch dalam Excel VBA

Dalam artikel ini, kami menerangkan ralat yang dihadapi ketika menggunakan Excel VBA ByRef sebagai "Ralat Jenis Ketidakcocokan Argumen". Sebelum itu izinkan saya memperkenalkan anda kepada "By Ref" terlebih dahulu. Pemboleh ubah adalah kunci bagi sebarang bahasa pengaturcaraan dan VBA juga tidak berbeza. Kami telah melihat banyak cara untuk menyatakan pemboleh ubah salah satu cara untuk menyatakan pemboleh ubah adalah dengan menggunakan kata-kata "ByRef" dan "ByVal".

Apa maksud ByRef?

"ByRef" bermaksud "Dengan Rujukan", dengan menggunakan kata ini kita benar-benar dapat menyampaikan argumen ke prosedur (untuk kedua sub & fungsi) dengan merujuk. Ini tidak seperti saudaranya "By Val" yang tidak fleksibel tetapi tetap sifatnya.

Untuk memahami ini mari kita lihat dua makro di bawah ini.

Kod:

 Sub Macro1 () Dim A Long A = 50 Macro2 A MsgBox A End Sub Sub Macro2 (ByRef A As Long) A = A * 10 Sub Akhir 

Kami mempunyai dua subprosedur di sini masing-masing dinamakan sebagai Macro1 & Macro2. Untuk memahami ini dengan lebih baik jalankan baris demi baris makro dengan menekan kekunci F8.

Tekan kekunci F8 untuk menangkap nilai pemboleh ubah "A" sebagai 50.

Baris kod seterusnya mengatakan "Macro2 A" iaitu nama makro kedua dan "A" adalah pemboleh ubah yang ditentukan melalui kata "By Ref".

Seperti yang anda lihat di atas ketika kita menjalankan baris kod "Macro2 A", ia telah melangkah ke sub prosedur VBA seterusnya dari prosedur di atas.

Sekarang kita dapat melihat nilai pemboleh ubah "A" adalah 50 ini karena sejak kita menggunakan kata "ByRef" untuk menyatakan pemboleh ubah "A" yang sama seperti di Macro1, ia telah menangkap nilai yang telah kita tetapkan pada pemboleh ubah ini " A ”dari Macro1 .

Sekarang dalam persamaan makro ( Makro2 ) ini mengatakan A = A * 10 iaitu A = 50 * 100. Tekan kekunci F8 sebanyak 3 kali untuk kembali ke makro di atas ( Makro1 ).

Sekarang tekan kekunci F8 sekali lagi untuk melihat nilai pemboleh ubah "A" di kotak mesej di VBA.

Nilai mengatakan 500.

Walaupun nilai yang telah kami tetapkan dalam makro ini (Macro1) adalah 50, dengan menggunakan kata ByRef, kami benar-benar memicu subprosedur Macro2 dengan mengekalkan nilai pemboleh ubah "A" dari Macro1 dan kemudian melaksanakan nilai A dengan mengalikan 10.

3 Sebab Teratas untuk Ketidakcocokan Jenis VBA Byref Argument

Di atas kita telah melihat bagaimana "ByRef" berfungsi tetapi kita pasti melakukan beberapa kesalahan yang selalu mengakibatkan melemparkan mesej kesalahan VBA sebagai "Ketidakcocokan Jenis Argumen ByRef".

Ini kerana banyak sebab dan di bahagian ini, kami akan menunjukkan kepada anda cara membetulkan ralat ini dan menyahpepijat kodnya.

Anda boleh memuat turun templat VBA ByRef Argument Type Mismatch Excel ini di sini - Templat VBA ByRef Argument Type Mismatch Excel

Sebab Kesalahan # 1 - Nama Pembolehubah yang berbeza

Salah satu sebab utama berlakunya ralat ini di Excel VBA adalah kerana pemboleh ubah yang berlainan dalam dua prosedur. Sebagai contoh lihat kod di bawah.

Kod:

 Sub Macro1 () Dim A Long A = 50 Macro2 B MsgBox A End Sub Sub Macro2 (ByRef A Selagi) B = B * 10 Sub Akhir 

Di Macro1 kami telah menggunakan pemboleh ubah "A" dan di Macro2 kami telah menggunakan pemboleh ubah "B". Sekarang jika anda cuba menjalankan kod, kita akan mendapat Kesalahan VBA sebagai "Ketidakcocokan Jenis Argumen ByRef".

Seperti yang anda lihat di atas pemboleh ubah "B" telah diserlahkan kerana jenis nama pemboleh ubah adalah ketidakcocokan.

Penyelesaian: Untuk mengatasi masalah ini, kita perlu memastikan bahawa nama pemboleh ubah dalam kedua prosedur itu tepat.

Sebab Ralat 2: Jenis Data Pembolehubah yang berbeza

Walaupun nama pemboleh ubah tetap sama, ia menyebabkan kesalahan kerana jenis data yang kami berikan kepada mereka. Lihat kod di bawah.

Kod:

 Sub Macro1 () Dim A As Integer A = 50 Macro2 A MsgBox A End Sub Sub Macro2 (ByRef A Selagi) A = A * 10 Sub Akhir 

Dalam kod di atas, saya telah menyatakan pemboleh ubah "A" sebagai jenis data Integer di Macro1 dan di Macro2 pemboleh ubah yang sama diberikan jenis data sebagai "Long".

Apabila kita menjalankan kod ini, ia akan menyebabkan ralat vba "Ketidakcocokan Jenis Argumen ByRef".

Ini kerana kami telah menetapkan dua jenis data yang berbeza untuk nama pemboleh ubah yang sama.

Penyelesaian: Jenis data harus sama dalam kedua prosedur.

Sebab Ralat 3: Jenis Data Pembolehubah Hilang dalam Satu Makro

Ralat Excel VBA "ByRef Argument Type Mismatch" boleh berlaku kerana jenis data yang diberikan dalam satu makro dan tidak ditugaskan dalam makro lain.

Kod:

 Sub Macro1 () A = 50 Macro2 A MsgBox A Sub Sub Macro2 Akhir (ByRef A Selagi) A = A * 10 Sub Akhir 

Dalam kod Macro1 di atas, saya belum menyatakan sebarang pemboleh ubah sebaliknya hanya memberikan nilai kepada pemboleh ubah.

Sebaliknya untuk Macro2 saya telah menyatakan pemboleh ubah "A" sebagai panjang. Sekiranya anda mencuba menjalankan kod ini, ia akan menyebabkan Kesalahan VBA "ByRef Argument Type Mismatch".

Penyelesaian1: Untuk mengelakkan situasi seperti ini, penyelesaian pertama adalah dengan menyatakan pemboleh ubah dalam kedua prosedur dan menetapkan jenis data yang sama.

Penyelesaian2: Penyelesaian alternatif adalah menjadikan perisytiharan pemboleh ubah wajib dengan menambahkan kata "Option Explicit" di bahagian atas modul.

Apa yang akan dilakukan ini ialah sebelum menunjukkan Kesalahan VBA "ByRef Argument Type Mismatch", ia sebenarnya meminta kita untuk menyatakan pemboleh ubah terlebih dahulu.

Jadi, Option Explicit selalu berguna dalam VBA.

Perkara yang Perlu Diingat

  • ByRef adalah kebalikan dari By Val.
  • ByRef membawa rujukan dari satu prosedur ke prosedur yang lain.
  • Nama pemboleh ubah, jenis data harus sama dalam kedua prosedur tersebut.
  • Setiap pemboleh ubah perlu dinyatakan secara berasingan sekiranya terdapat beberapa pemboleh ubah.