VBA ByRef வாத வகை பொருந்தாத பிழை | சிறந்த 3 காரணங்கள் மற்றும் பிழை திருத்தங்கள்

Excel VBA இல் ByRef வாத வகை பொருந்தவில்லை

இந்த கட்டுரையில், எக்செல் விபிஏ பைரெஃப்பை “வாத வகை பொருந்தாத பிழை” என்று பயன்படுத்தும் போது ஏற்பட்ட பிழையை விளக்குகிறோம். அதற்கு முன் உங்களை முதலில் “By Ref” க்கு அறிமுகப்படுத்துகிறேன். எந்தவொரு நிரலாக்க மொழிக்கும் மாறுபாடுகள் முக்கியம் மற்றும் VBA யும் வேறுபட்டதல்ல. "பைரெஃப்" மற்றும் "பைவால்" என்ற சொற்களைப் பயன்படுத்துவதன் மூலம் மாறிகளை அறிவிப்பதற்கான பல வழிகளை நாம் அறிவோம்.

ByRef என்றால் என்ன?

“பைரெஃப்” என்றால் “குறிப்பு மூலம்”, இந்த வார்த்தையைப் பயன்படுத்தி நாம் உண்மையில் வாதங்களுக்கு நடைமுறைகளுக்கு (துணை மற்றும் செயல்பாடு இரண்டிற்கும்) குறிப்பு மூலம் அனுப்ப முடியும். இது அதன் சகோதரர் “பை வால்” போலல்லாமல் இது நெகிழ்வானது அல்ல, ஆனால் இயற்கையில் சரி செய்யப்பட்டது.

இதைப் புரிந்து கொள்ள கீழேயுள்ள இரண்டு மேக்ரோக்களைப் பார்ப்போம்.

குறியீடு:

 துணை மேக்ரோ 1 () மங்கலான ஒரு நீண்ட A = 50 மேக்ரோ 2 ஒரு MsgBox ஒரு முடிவு துணை துணை மேக்ரோ 2 (ByRef A நீண்டது) A = A * 10 முடிவு துணை 

எங்களிடம் முறையே மேக்ரோ 1 & மேக்ரோ 2 என பெயரிடப்பட்ட இரண்டு துணை நடைமுறைகள் உள்ளன. இதை நன்கு புரிந்துகொள்ள எஃப் 8 விசையை அழுத்துவதன் மூலம் மேக்ரோ வரியை வரி மூலம் இயக்கவும்.

மாறி “A” இன் மதிப்பை 50 ஆகப் பிடிக்க F8 விசையை அழுத்தவும்.

குறியீட்டின் அடுத்த வரி “மேக்ரோ 2 ஏ” அதாவது இரண்டாவது மேக்ரோவின் பெயர் மற்றும் “ஏ” என்பது “பை ரெஃப்” வார்த்தையின் மூலம் வரையறுக்கப்பட்ட மாறி.

"மேக்ரோ 2 ஏ" குறியீட்டின் வரியை நாங்கள் செயல்படுத்தும் தருணத்திற்கு மேலே நீங்கள் காணக்கூடியது, இது மேலே உள்ள நடைமுறையிலிருந்து அடுத்த விபிஏ துணை நடைமுறைக்கு முன்னேறியுள்ளது.

இப்போது "A" என்ற மாறியின் மதிப்பு 50 ஆக இருப்பதைக் காணலாம், ஏனென்றால் "A" என்ற மாறியை அறிவிக்க "ByRef" என்ற வார்த்தையை நாங்கள் பயன்படுத்தியுள்ளதால், மேக்ரோ 1 இந்த மாறி “A” க்கு நாம் ஒதுக்கிய மதிப்பை இது கைப்பற்றியுள்ளது மேக்ரோ 1.

இப்போது இந்த மேக்ரோவில் (மேக்ரோ 2) சமன்பாடு A = A * 10 அதாவது A = 50 * 100. மேலே உள்ள மேக்ரோவுக்குச் செல்ல F8 விசையை 3 முறை அழுத்தவும் (மேக்ரோ 1).

VBA இல் உள்ள செய்தி பெட்டியில் “A” மாறியின் மதிப்பைக் காண இப்போது ஒரு முறை F8 விசையை அழுத்தவும்.

மதிப்பு 500 என்று கூறுகிறது.

இந்த மேக்ரோவில் (மேக்ரோ 1) நாம் ஒதுக்கியுள்ள மதிப்பு 50 ஆக இருந்தாலும், பைரெஃப் வார்த்தையைப் பயன்படுத்துவதன் மூலம் மேக்ரோ 1 இலிருந்து மாறி “ஏ” இன் மதிப்பைத் தக்கவைத்து, 10 ஐ பெருக்கி A இன் மதிப்பை செயல்படுத்துவதன் மூலம் மேக்ரோ 2 துணை செயலாக்கத்தைத் தூண்டினோம்.

VBA பைரெஃப் வாத வகை பொருந்தாத முதல் 3 காரணங்கள்

"பைரெஃப்" எவ்வாறு இயங்குகிறது என்பதை மேலே பார்த்தோம், ஆனால் சில தவறுகளைச் செய்ய நாங்கள் கட்டுப்படுகிறோம், இதன் விளைவாக ஒரு விபிஏ பிழை செய்தியை "பைரெஃப் வாத வகை பொருத்தமின்மை" என்று வீசுவோம்.

இது பல காரணங்களால் மற்றும் இந்த பிரிவில், இந்த பிழையை எவ்வாறு சரிசெய்வது மற்றும் குறியீட்டை பிழைத்திருத்துவது என்பதை நாங்கள் உங்களுக்குக் காண்பிப்போம்.

இந்த VBA ByRef வாத வகை பொருந்தாத எக்செல் வார்ப்புருவை இங்கே பதிவிறக்கம் செய்யலாம் - VBA ByRef வாத வகை பொருந்தாத எக்செல் வார்ப்புரு

பிழை காரணம் # 1 - வெவ்வேறு மாறி பெயர்கள்

எக்செல் விபிஏவில் இந்த பிழையைப் பெறுவதற்கு ஒரு முக்கிய காரணம் இரண்டு நடைமுறைகளில் வெவ்வேறு மாறிகள் காரணமாக உள்ளது. எடுத்துக்காட்டாக, கீழே உள்ள குறியீடுகளைப் பாருங்கள்.

குறியீடு:

 துணை மேக்ரோ 1 () மங்கலான ஒரு நீண்ட A = 50 மேக்ரோ 2 பி எம்.எஸ்.ஜி.பாக்ஸ் ஒரு முடிவு துணை துணை மேக்ரோ 2 (பைரெஃப் ஒரு நீளமாக) பி = பி * 10 முடிவு துணை 

மேக்ரோ 1 இல் “ஏ” மாறியைப் பயன்படுத்தினோம், மேக்ரோ 2 இல் “பி” மாறியைப் பயன்படுத்தினோம். இப்போது நீங்கள் குறியீட்டை இயக்க முயற்சித்தால், VBA பிழையை “ByRef Argument Type Misatch” என்று பெறுவோம்.

மேலே காணக்கூடிய மாறி “பி” முன்னிலைப்படுத்தப்பட்டுள்ளது, ஏனெனில் மாறி பெயரின் வகை பொருந்தவில்லை.

தீர்வு: இந்த சிக்கலை சமாளிக்க, இரண்டு நடைமுறைகளிலும் மாறி பெயர்கள் சரியானவை என்பதை உறுதிப்படுத்த வேண்டும்.

பிழை காரணம் 2: வெவ்வேறு மாறுபட்ட தரவு வகைகள்

மாறி பெயர்கள் ஒரே மாதிரியாக இருந்தாலும், அது ஒரு பிழையை ஏற்படுத்துகிறது, இது நாம் அவர்களுக்கு ஒதுக்கும் தரவு வகை காரணமாகும். கீழே உள்ள குறியீட்டைப் பாருங்கள்.

குறியீடு:

 சப் மேக்ரோ 1 () டிம் ஏ ஆக முழு எண் A = 50 மேக்ரோ 2 ஒரு எம்.எஸ்.ஜி.பாக்ஸ் ஒரு முடிவு துணை துணை மேக்ரோ 2 (பைரெஃப் ஒரு நீளமாக) ஏ = ஏ * 10 முடிவு துணை 

மேலே உள்ள குறியீடுகளில், நான் "A" மாறியை மேக்ரோ 1 இல் முழு தரவு வகையாக அறிவித்துள்ளேன், மேக்ரோ 2 இல் அதே மாறி தரவு வகையை "நீண்ட" என ஒதுக்கியது.

இந்த குறியீட்டை நாங்கள் இயக்கும்போது, ​​அது “ByRef வாத வகை பொருந்தாதது” என்ற vba பிழையை ஏற்படுத்தும்.

ஒரே மாறி பெயருக்கு இரண்டு வெவ்வேறு தரவு வகைகளை ஒதுக்கியுள்ளதே இதற்குக் காரணம்.

தீர்வு: இரண்டு நடைமுறைகளிலும் தரவு வகை ஒரே மாதிரியாக இருக்க வேண்டும்.

பிழை காரணம் 3: ஒரு மேக்ரோவில் மாறக்கூடிய தரவு வகைகள் இல்லை

எக்செல் விபிஏ பிழை “பைரெஃப் ஆர்க்யூமென்ட் டைப் பொருந்தாதது” ஒரு மேக்ரோவில் ஒதுக்கப்பட்ட தரவு வகை மற்றும் மற்றொரு மேக்ரோவில் ஒதுக்கப்படாததால் நிகழலாம்.

குறியீடு:

 துணை மேக்ரோ 1 () A = 50 மேக்ரோ 2 ஒரு MsgBox ஒரு முடிவு துணை துணை மேக்ரோ 2 (ByRef A நீண்டது) A = A * 10 முடிவு துணை 

மேக்ரோ 1 இன் மேலே உள்ள குறியீட்டில், நான் எந்த மாறியையும் அறிவிக்கவில்லை, மாறாக மாறிக்கு மதிப்பை ஒதுக்கியுள்ளேன்.

மேக்ரோ 2 க்கு மறுபுறம் நான் "A" மாறியை நீண்ட காலமாக அறிவித்தேன். இந்த குறியீட்டை இயக்க முயற்சித்தால் அது “ByRef வாத வகை பொருந்தாதது” VBA பிழையை ஏற்படுத்தும்.

தீர்வு 1: இந்த வகையான சூழ்நிலைகளைத் தவிர்ப்பதற்கு முதல் தீர்வு இரண்டு நடைமுறைகளிலும் மாறியை அறிவித்து ஒரே தரவு வகையை ஒதுக்குவதாகும்.

தீர்வு 2: ஒரு மாற்று தொகுதியின் மேற்புறத்தில் “விருப்பம் வெளிப்படையான” வார்த்தையைச் சேர்ப்பதன் மூலம் மாறி அறிவிப்பை கட்டாயமாக்குவதே தீர்வு.

இது என்ன செய்யும் என்பது VBA ஐ காண்பிப்பதற்கு முன்பு “ByRef Argument Type Misatch” பிழை அது முதலில் மாறியை முதலில் அறிவிக்கும்படி கேட்கிறது.

எனவே, விருப்பம் வெளிப்படையானது எப்போதும் VBA இல் கைக்குள் வரும்.

நினைவில் கொள்ள வேண்டிய விஷயங்கள்

  • ByRef என்பது By Val க்கு நேர் எதிரானது.
  • ByRef ஒரு நடைமுறையிலிருந்து மற்றொரு நடைமுறைக்கு குறிப்பைக் கொண்டு செல்கிறது.
  • மாறி பெயர், தரவு வகை இரண்டு நடைமுறைகளிலும் ஒரே மாதிரியாக இருக்க வேண்டும்.
  • பல மாறிகள் இருந்தால் ஒவ்வொரு மாறியும் தனித்தனியாக அறிவிக்கப்பட வேண்டும்.