Niezgodność typu argumentu ByRef VBA

Niezgodność typu argumentu ByRef w programie Excel VBA

W tym artykule wyjaśniamy błąd napotkany podczas korzystania z programu Excel VBA ByRef jako „Błąd niezgodności typu argumentu”. Wcześniej pozwólcie, że najpierw przedstawię Wam „By Ref”. Zmienne są kluczowe dla każdego języka programowania, podobnie jak VBA. Widzieliśmy wiele sposobów deklarowania zmiennych, jednym ze sposobów deklarowania zmiennych jest użycie słów „ByRef” i „ByVal”.

Co oznacza ByRef?

„ByRef” oznacza „przez odniesienie”, używając tego słowa możemy faktycznie przekazywać argumenty do procedur (zarówno dla podrzędnej, jak i funkcji) przez odniesienie. W przeciwieństwie do swojego brata „By Val”, który nie jest elastyczny, ale ma stały charakter.

Aby to zrozumieć, spójrzmy na poniższe dwa makra.

Kod:

 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 

Mamy tutaj dwie podprocedury nazwane odpowiednio jako Makro1 i Makro2. Aby lepiej to zrozumieć, uruchamiaj makro wiersz po wierszu, naciskając klawisz F8.

Naciśnij klawisz F8, aby zapisać wartość zmiennej „A” jako 50.

W następnej linii kodu jest napisane „Macro2 A”, czyli nazwa drugiego makra, a „A” to zmienna zdefiniowana przez słowo „By Ref”.

Jak widać powyżej, w momencie, gdy wykonujemy wiersz kodu „Macro2 A”, przeskoczył on do następnej podprocedury VBA z powyższej procedury.

Teraz widzimy, że wartość zmiennej „A” wynosi 50, ponieważ ponieważ użyliśmy słowa „ByRef” do zadeklarowania zmiennej „A”, która jest taka sama jak w Macro1 , przechwyciła ona wartość, którą przypisaliśmy tej zmiennej ” A ”z Macro1 .

Teraz równanie tego makra ( Makro2 ) mówi, że A = A * 10 tj. A = 50 * 100. Naciśnij klawisz F8 3 razy, aby wrócić do powyższego makra ( Makro1 ).

Teraz naciśnij jeszcze raz klawisz F8, aby zobaczyć wartość zmiennej „A” w oknie komunikatu w VBA.

Wartość mówi 500.

Mimo że wartość, którą przypisaliśmy w tym makrze (Makro1) to 50, używając słowa ByRef faktycznie uruchomiliśmy podprocedurę Macro2, zachowując wartość zmiennej „A” z Makro1, a następnie wykonując wartość A przez pomnożenie 10.

3 najważniejsze przyczyny niezgodności typu argumentu VBA Byref

Powyżej widzieliśmy, jak działa „ByRef”, ale musieliśmy popełnić kilka błędów, które niezmiennie powodowały wyrzucenie komunikatu o błędzie VBA jako „Niezgodność typu argumentu ByRef”.

Dzieje się tak z wielu powodów, aw tej sekcji pokażemy, jak naprawić ten błąd i debugować kod.

Możesz pobrać ten szablon Excela dotyczący niezgodności typu argumentu ByRef VBA - Szablon programu Excel niezgodny z typem argumentu ByRef VBA

Przyczyna błędu nr 1 - Różne nazwy zmiennych

Jednym z głównych powodów pojawienia się tego błędu w Excel VBA są różne zmienne przekazywane w dwóch procedurach. Na przykład spójrz na poniższe kody.

Kod:

 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 

W Macro1 użyliśmy zmiennej „A”, aw Macro2 zmienną „B”. Teraz, jeśli spróbujesz uruchomić kod, otrzymamy błąd VBA jako „Niezgodność typu argumentu ByRef”.

Jak widać powyżej zmienna „B” została podświetlona, ​​ponieważ typ nazwy zmiennej jest niezgodny.

Rozwiązanie: Aby rozwiązać ten problem, musimy upewnić się, że nazwy zmiennych w obu procedurach są dokładne.

Przyczyna błędu 2: Różne typy danych zmiennych

Mimo że nazwy zmiennych są takie same, nadal powoduje to błąd, wynika to z przypisanego im typu danych. Spójrz na poniższy kod.

Kod:

 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 

W powyższych kodach zadeklarowałem zmienną „A” jako typ danych Integer w Makro1, aw Makro2 tej samej zmiennej przypisano typ danych jako „Long”.

Uruchomienie tego kodu spowoduje błąd vba „Niezgodność typu argumentu ByRef”.

Dzieje się tak, ponieważ przypisaliśmy dwa różne typy danych do tej samej nazwy zmiennej.

Rozwiązanie: Typ danych powinien być taki sam w obu procedurach.

Przyczyna błędu 3: Brak typów danych zmiennych w jednym makrze

Błąd Excel VBA „Niezgodność typu argumentu ByRef” może wystąpić z powodu typu danych przypisanego w jednym makrze, a nie przypisanego w innym makrze.

Kod:

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

W powyższym kodzie Macro1 nie zadeklarowałem żadnej zmiennej, a po prostu przypisałem wartość zmiennej.

Z drugiej strony dla Macro2 zadeklarowałem zmienną „A” tak długo. Jeśli spróbujesz uruchomić ten kod, spowoduje to błąd VBA „ByRef Argument Type Mismatch”.

Rozwiązanie 1: Aby uniknąć tego typu sytuacji, pierwszym rozwiązaniem jest zadeklarowanie zmiennej w obu procedurach i przypisanie tego samego typu danych.

Rozwiązanie 2: Alternatywnym rozwiązaniem jest uczynienie deklaracji zmiennej obowiązkową przez dodanie słowa „Option Explicit” w górnej części modułu.

Spowoduje to, że zanim pokaże błąd „ByRef Argument Type Mismatch” w języku VBA, w rzeczywistości prosi nas o zadeklarowanie zmiennej.

Tak więc Option Explicit zawsze przydaje się w VBA.

Rzeczy do zapamiętania

  • ByRef jest przeciwieństwem By Val.
  • ByRef przenosi odwołanie z jednej procedury do drugiej.
  • Nazwa zmiennej, typ danych powinny być takie same w obu procedurach.
  • W przypadku wielu zmiennych każdą zmienną należy zadeklarować osobno.