VBA ByRef-argumenttityypin virhevirhe | Kolme parasta syytä ja virhekorjausta

ByRef-argumenttityyppi ei täsmää Excel VBA: ssa

Tässä artikkelissa kerromme virheestä, joka ilmeni käytettäessä Excel VBA ByRef -ohjelmaa argumenttityypin virhevirheenä. Ennen sitä anna minun esitellä sinulle ensin "By Ref". Muuttujat ovat avainasemassa mille tahansa ohjelmointikielelle, eikä VBA ole erilainen. Olemme nähneet monia tapoja ilmoittaa muuttujista yksi tällainen tapa ilmoittaa muuttujia käyttämällä sanoja "ByRef" ja "ByVal".

Mitä ByRef tarkoittaa?

"ByRef" tarkoittaa "viitteenä". Tämän sanan avulla voimme itse välittää argumentit menettelyille (molemmille ali- ja funktioille) viitteenä. Tämä on toisin kuin veljensä "By Val", joka ei ole joustava, mutta luonteeltaan kiinteä.

Tämän ymmärtämiseksi tarkastellaan kahta alla olevaa makroa.

Koodi:

 Alimakro1 () Dim A yhtä pitkä A = 50 makro2 A MsgBox A End Sub Sub makro2 (ByRef A yhtä pitkä) A = A * 10 End Sub 

Meillä on täällä kaksi alimenetelmää, jotka on nimetty vastaavasti Macro1 ja Macro2. Ymmärrä tämä paremmin suorittamalla makro rivi riviltä painamalla F8-näppäintä.

Paina F8-näppäintä saadaksesi muuttujan A arvoksi 50.

Seuraavalla koodirivillä lukee ”Makro2 A” eli toisen makron nimi ja ”A” on muuttuja, joka määritetään sanalla ”Viite”.

Kuten yllä olevasta hetkestä käy ilmi, kun suoritamme koodirivin "Macro2 A", se on siirtynyt seuraavaan VBA-alimenettelyyn edellisestä menettelystä.

Nyt voimme nähdä, että muuttujan "A" arvo on 50, koska koska olemme käyttäneet sanaa "ByRef" ilmoittaaksesi muuttujan "A", joka on sama kuin Macro1: ssä, se on kaapannut arvon, jonka olemme antaneet tälle muuttujalle " A ” Macro1: stä .

Nyt tässä makro ( Makro2 ) -yhtälössä sanotaan A = A * 10 eli A = 50 * 100. Paina F8-näppäintä 3 kertaa palataksesi edelliseen makroon ( Makro1 ).

Paina nyt vielä kerran F8-näppäintä nähdäksesi muuttujan "A" arvon VBA: n viestiruudussa.

Arvo kertoo 500.

Vaikka tässä makrossa (Macro1) määrittämä arvo on 50, laukaisimme ByRef-sanaa käyttämällä tosiasiallisesti Macro2-alimenettelyn pitämällä muuttujan A arvon Macro1: stä ja suorittamalla sitten A: n arvon kertomalla 10.

Kolme tärkeintä syytä VBA Byref-argumenttityypin ristiriidalle

Edellä on nähty, kuinka "ByRef" toimii, mutta meidän on pakko tehdä joitain virheitä, jotka aina johtivat VBA-virheilmoituksen heittämiseen nimellä "ByRef Argument Type Mismatch".

Tämä johtuu monista syistä, ja tässä osiossa näytämme, kuinka korjata tämä virhe ja korjata koodi.

Voit ladata tämän VBA ByRef-argumenttityypin yhteensopimattomuuden Excel-mallin täältä - VBA ByRef-argumenttityypin yhteensopivuus Excel-mallin kanssa

Virhesyy # 1 - Eri muuttujien nimet

Yksi tärkeimmistä syistä tämän virheen saamiseen Excel VBA: ssa johtuu kahdessa menettelyssä välitetyistä muuttujista. Katso esimerkki alla olevista koodeista.

Koodi:

 Alimakro1 () Dim A yhtä pitkä A = 50 Macro2 B MsgBox A End Sub Sub Makro2 (ByRef A yhtä pitkä) B = B * 10 End Sub 

Makro1: ssä olemme käyttäneet A-muuttujaa ja Macro2: ssa B-muuttujaa. Nyt kun yrität suorittaa koodin, saamme VBA-virheen nimellä ByRef Argument Type Mismatch.

Kuten yllä voit nähdä, muuttuja "B" on korostettu, koska muuttujan nimen tyyppi on ristiriita.

Ratkaisu: Tämän ongelman ratkaisemiseksi meidän on varmistettava, että muuttujien nimet molemmissa menettelyissä ovat tarkkoja.

Virhesyy 2: Erilaiset muuttujatyypit

Vaikka muuttujien nimet ovat samat, se aiheuttaa virheen johtuen niille määritetystä tietotyypistä. Katso alla oleva koodi.

Koodi:

 Alimakro1 () Dim A kokonaislukuna A = 50 Makro2 A MsgBox A End Sub Sub Makro2 (ByRef A Long) A = A * 10 End Sub 

Edellä mainituissa koodeissa olen ilmoittanut muuttujan "A" kokonaislukutyypiksi Macro1: ssä ja Macro2: ssa samalle muuttujalle annettiin tietotyyppi kuin "Long".

Kun suoritamme tämän koodin, se aiheuttaa vba-virheen "ByRef Argument Type Mismatch".

Tämä johtuu siitä, että samalle muuttujan nimelle on määritetty kaksi erilaista tietotyyppiä.

Ratkaisu: Tietotyypin tulee olla sama molemmissa menettelyissä.

Virhesyy 3: Muuttujatyypit puuttuvat yhdestä makrosta

Excel VBA -virhe ByRef Argument Type Mismatch saattaa johtua tietotyypistä, joka on määritetty yhdessä makrossa ja jota ei ole määritetty toisessa makrossa.

Koodi:

 Alimakro1 () A = 50 makro2 A MsgBox A End Sub Submakro2 (ByRef A niin pitkä) A = A * 10 End Sub 

Edellä olevassa Macro1-koodissa en ole ilmoittanut mitään muuttujaa, vaan yksinkertaisesti määrittänyt arvon muuttujalle.

Toisaalta Macro2: lle olen ilmoittanut muuttujan "A" niin kauan. Jos yrität suorittaa tämän koodin, se aiheuttaa "ByRef Argument Type Mismatch" VBA -virheen.

Ratkaisu 1: Tämäntyyppisten tilanteiden välttämiseksi ensimmäinen ratkaisu on ilmoittaa muuttuja molemmissa menettelyissä ja määrittää sama tietotyyppi.

Ratkaisu 2: Vaihtoehtoinen ratkaisu on tehdä muuttujailmoituksesta pakollinen lisäämällä "Option Explicit" -sana moduulin yläosaan.

Tämä tekee, että ennen kuin se näyttää VBA: n "ByRef Argument Type Mismatch" -virheen, se todella pyytää meitä ilmoittamaan muuttujan ensin.

Joten Option Explicit on aina hyödyllinen VBA: ssa.

Muistettavaa

  • ByRef on päinvastainen kuin Val.
  • ByRef vie viittauksen menettelystä toiseen.
  • Muuttujan nimen, tietotyypin tulee olla sama molemmissa menettelyissä.
  • Jokainen muuttuja on ilmoitettava erikseen, jos useita muuttujia.