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ä haluan esitellä sinulle ensin "By Ref". Muuttujat ovat avain mihin tahansa ohjelmointikieleen, eikä VBA ole myöskään erilainen. Olemme nähneet monia tapoja ilmoittaa muuttujia. Yksi tapa mainita muuttujia on käyttää sanoja "ByRef" ja "ByVal".

Mitä ByRef tarkoittaa?

"ByRef" tarkoittaa "viitteenä", joka käyttää tätä sanaa, voimme tosiasiallisesti välittää argumentit menettelyille (molemmille ali- ja funktioille) viitteellä. 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 kaksi alimenetelmää, nimeltään Macro1 ja Macro2, vastaavasti. Ymmärrä tämä paremmin suorittamalla makro rivi riviltä painamalla F8-näppäintä.

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

Seuraava koodirivi sanoo “Makro2 A”, toisin sanoen toisen makron nimi ja “A” on muuttuja, joka määritetään sanan ”By Ref” kautta.

Kuten yllä voit nähdä, sillä hetkellä kun suoritamme koodirivin "Macro2 A", se on siirtynyt seuraavaan VBA-alimenettelyyn edellisestä menettelystä.

Nyt voimme nähdä, että muuttujan "A" arvo on 50. Tämä johtuu siitä, että koska olemme käyttäneet sanaa "ByRef" ilmoittaaksesi muuttujan "A", joka on sama kuin Macro1: ssä, se on kaapannut arvon, jonka meillä on määritetty tälle muuttujalle “A” Macro1: sta .

Nyt tämä makro ( Macro2 ) yhtälö kertoo A = A * 10 eli A = 50 * 100. Paina F8-näppäintä 3 kertaa palata edellä makro ( Macro1 ).

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

Arvo kertoo 500.

Vaikka tässä makrossa (Makro1) meille määrittämä arvo on 50, käynnistimme ByRef-sanaa käyttämällä itse asiassa Macro2-alimenettelyn pitämällä muuttujan A arvon Makro1: 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.

Virhesyy # 1 - Eri muuttujien nimet

Yksi tärkeimmistä syistä tämän virheen saamiseen Excel VBA: ssa johtuu kahdessa menettelyssä välitetyistä muuttujista. Katso esimerkiksi alla olevia koodeja.

Koodi:

Alimakro1 () Dim A yhtä pitkä A = 50 makro2 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. Jos yrität nyt 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 ovat molemmissa menettelyissä tarkat.

Virhesyy 2: Erilaiset muuttujatyypit

Vaikka muuttujien nimet ovat samat, se aiheuttaa silti virheen, mikä johtuu heille osoitetusta tietotyypistä. Katso alla oleva koodi.

Koodi:

Alimakro1 () Dim A kokonaislukuna A = 50 Makro2 A MsgBox A End Sub Sub makro2 (ByRef A niin pitkä) 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

Excelin VBA-virhe, "ByRef-argumenttityypin epäsuhta", saattaa johtua yhdessä makrossa määritetystä tietotyypistä, 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 olen ilmoittanut Macro2: lle 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 kyseessä on useita muuttujia.

Mielenkiintoisia artikkeleita...