Błąd niezgodności typu argumentu ByRef VBA - 3 najważniejsze przyczyny i poprawki błędów

Niezgodność typu argumentu ByRef w programie Excel VBA

W tym artykule wyjaśnimy 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ą kluczem do 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 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ępnym wierszu kodu jest napisane „Macro2 A”, tj. 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. Dzieje się tak, 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ą mamy przypisana do 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 (Macro1) to 50, używając słowa ByRef, w rzeczywistości uruchomiliśmy podprocedurę Macro2, zachowując wartość zmiennej „A” z Macro1, 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 jesteśmy zobowiązani do popełnienia niektórych błędów, które niezmiennie skutkują wyświetleniem 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.

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 wykorzystaliśmy zmienną „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 języka 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 programu Excel VBA „Niezgodność typu argumentu ByRef” może wystąpić z powodu typu danych przypisanego w jednym makrze, a nie przypisanego w innym.

Kod:

Sub Macro1 () A = 50 Macro2 A MsgBox A End Sub 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.

To spowoduje, że zanim pokaże VBA „Niedopasowanie typu argumentu ByRef”, błąd, w rzeczywistości prosi nas o zadeklarowanie zmiennej jako pierwszej.

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.

Interesujące artykuły...