فهرست مطالب
همانطور که می دانید چگونه UDF ها را ایجاد کنید (و امیدوارم استفاده از آنها را در اکسل خود نیز امتحان کرده باشید)، بیایید کمی عمیق تر بگردیم و ببینیم در صورتی که عملکرد تعریف شده توسط کاربر کار نمی کند چه کاری می توان انجام داد.
برای حل برخی از مشکلات هنگام ایجاد یک تابع سفارشی، به احتمال زیاد نیاز به اجرای اشکال زدایی دارید. سپس می توانید مطمئن شوید که عملکرد به درستی کار می کند.
ما تکنیک های اشکال زدایی زیر را بررسی می کنیم:
هنگامی که یک تابع سفارشی ایجاد می کنید، همیشه این امکان وجود دارد که اشتباه خواهی کرد توابع سفارشی معمولاً بسیار پیچیده هستند. و آنها همیشه به درستی کار را بلافاصله شروع نمی کنند. فرمول ممکن است یک نتیجه نادرست یا #VALUE را نشان دهد! خطا برخلاف توابع استاندارد اکسل، هیچ پیام دیگری نخواهید دید.
آیا راهی وجود دارد که بتوان گام به گام یک تابع سفارشی را بررسی کرد تا نحوه عملکرد هر یک از عبارات آن را بررسی کرد؟ مطمئن! برای این کار از اشکال زدایی استفاده می شود.
من چندین روش برای اشکال زدایی عملکرد سفارشی خود به شما پیشنهاد می کنم تا بتوانید یکی را انتخاب کنید که برای شما کار می کند.
به عنوان مثال، ما از تابع سفارشی استفاده می کنیم. GetMaxBetween از یکی از مقالات قبلی ما که حداکثر عدد را در محدوده مقادیر مشخص شده محاسبه می کند:
عملکرد MsgBox را در مکان های مهم قرار دهید
به منظور نظارت بر اجرای محاسبات، می توانید نمایش دهید مقادیر مهم ترین متغیرهای روی صفحه در مکان های مناسب. این کار را می توان با استفاده از کادرهای گفتگوی بازشو انجام داد.
MsgBox یک کادر محاوره ای است که می توانید از آن برای نشان دادن نوعی پیام به کاربر استفاده کنید.
Syntax MsgBox شبیه سایر توابع VBA است:
MsgBox(prompt [, buttons] [, title] [, helpfile, context])prompt یک آرگومان لازم است. حاوی پیامی است که در کادر محاوره ای مشاهده می کنید. همچنین میتوان از آن برای نمایش مقادیر متغیرهای جداگانه استفاده کرد.
همه آرگومانهای دیگر اختیاری هستند.
[ buttons ] - تعیین میکند کدام دکمهها و نمادها هستند. در MsgBox نمایش داده می شود. برای مثال اگر از گزینه vbOkOnly استفاده کنیم، فقط دکمه OK نمایش داده می شود. حتی اگر این آرگومان را از دست داده باشید، این دکمه به طور پیش فرض استفاده می شود.
[ title ] - در اینجا می توانید عنوان کادر پیام را مشخص کنید.
بیایید از کلمات برای تمرین و شروع به رفع اشکال. برای نمایشقبل از عملگر Case Else خط زیر را به کد تابع GetMaxBetween که توسط کاربر تعریف شده است اضافه کنید:
MsgBox vMax,, "Count -" & iاین چیزی است که در نتیجه به دست می آوریم:
تابع GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange به عنوان Range Dim vMax Dim arrNums() Dim i به عنوان عدد صحیح ReDim arrNums(rngCells.Count) برای هر NumRange در rngCells vMax = NumRange انتخاب Case vMax Case MinNum + 0.01 To MaxNum - 0.01 arrNums(i) = vMax i = i + 1 MsgBox vMax,, "Count -" & i مورد دیگر GetMaxBetween = 0 End Select Next NumRange GetMaxBetween = WorksheetFunction.Max(arrNums) End Functionبا استفاده از متغیر vMax در کادر محاوره ای، خواهیم دید که کدام اعداد معیارهای انتخاب را دارند، بنابراین که بتوانیم بزرگترین آنها را انتخاب کنیم. با عبارت "Count -" & من در نوار عنوان، نشان میدهیم که چند عدد قبلاً انتخاب کردهایم تا حداکثر مقدار را تعیین کنیم. شمارنده با هر مقدار جدید افزایش می یابد.
پس از تنظیم UDF، فرمول زیر را در محدوده تاریخ اعمال می کنیم:
= GetMaxBetween (A1:A6,10,50)
بعد از دکمه Enter با فشار دادن، پیامی مانند تصویر زیر مشاهده خواهید کرد:
این اولین عدد در محدوده A1: A6 است که معیارهای زیر را دارد: بزرگتر از 10 اما کمتر بیش از 50.
بعد از کلیک روی OK، یک پیام دوم با عدد 14 ظاهر می شود. بقیه اعداد با انتخاب مطابقت ندارند.شاخص. بنابراین، تابع خارج شده و بزرگترین مقدار از دو مقدار 17 را برمی گرداند.
عملکرد MsgBox را می توان در مهمترین مکان ها در تابع سفارشی شما برای کنترل چگونگی مقادیر استفاده کرد. تغییر متغیرهای فردی جعبه های پیام زمانی می توانند بسیار مفید باشند که عملکرد بزرگ و محاسبات زیادی داشته باشید. در این صورت، تشخیص خطا در کدام قسمت از کد برای شما آسان خواهد بود.
نقاط توقف را تعیین کنید و مرحله به مرحله انجام دهید
می توانید نقاط شکست را به کد اضافه کنید. تابع شما که در آن اجرای کد متوقف می شود. بنابراین می توانید مراحل محاسبه را مرحله به مرحله دنبال کنید. با انجام این کار، میتوانید ببینید که چگونه مقادیر متغیرها تغییر میکنند.
برای افزودن نقطه شکست، مکاننما را روی خط حاوی عبارتی که در آن انتخاب میکنید، قرار دهید. سپس کلیک راست کرده و Debug -> نقطه شکست را تغییر دهید یا فقط F9 را فشار دهید. همچنین می توانید در محل مورد نظر در ناحیه خاکستری عمودی در سمت چپ کد عملکرد کلیک کنید.
دایره قرمز رنگ ظاهر می شود، همانطور که در تصویر زیر می بینید. خط کدی که در آن محاسبه متوقف می شود، با رنگ قرمز مشخص شده است.
اکنون، پنجره ویرایشگر VBA زمانی که تابع در حال اجرا است باز می شود. مکان نما در نقطه ای که توقف کرده اید قرار می گیرد.
اگر نشانگر ماوس خود را روی هر یک از متغیرهای کد تابع قرار دهید، می توانید جریان آنها را ببینید.مقدار:
F5 را فشار دهید تا محاسبه ادامه یابد.
توجه داشته باشید. پس از نقطه شکست، می توانید گام به گام پیشرفت محاسبات را پیگیری کنید. اگر دکمه F8 را فشار دهید، فقط یک خط بعدی از کد VBA اجرا می شود. خط زرد با یک فلش نیز به آخرین موقعیت کد اجرا شده منتقل می شود.
از آنجایی که اجرای تابع دوباره متوقف می شود، می توانید مقادیر فعلی همه متغیرهای تابع را با استفاده از نشانگر ماوس مشاهده کنید.
فشار بعدی F8 ما را یک قدم به جلو می برد. . بنابراین می توانید F8 را تا پایان محاسبه فشار دهید. یا F5 را فشار دهید تا محاسبه تا نقطه شکست بعدی ادامه یابد.
اگر خطایی رخ دهد، مکان نما در نقطه ای از کد که خطا رخ داده متوقف می شود. و همچنین یک پیغام خطای پاپ آپ را مشاهده خواهید کرد. این کار تعیین علت مشکل را آسان میکند.
نقاط شکستی که مشخص میکنید تا زمانی که فایل را ببندید اعمال خواهند شد. وقتی دوباره آن را باز کردید، باید دوباره آنها را تنظیم کنید. راحت ترین روش نیست، فکر نمی کنید؟
با این حال، این مشکل قابل حل است. یک عبارت Stop را در کد تابع در نقاط ضروری وارد کنید، و می توانید اجرای برنامه را به همان روشی که هنگام استفاده از نقاط شکست، متوقف کنید.
هنگامی که VBA با عبارت Stop مواجه می شود، اجرای برنامه را متوقف می کند و منتظر اقدام شما می شود. سپس مقادیر متغیرها را بررسی کنیدبرای ادامه، F5 را فشار دهید.
یا برای انجام عملکرد گام به گام همانطور که در بالا توضیح داده شد، F8 را فشار دهید.
عبارت Stop بخشی از برنامه است و بنابراین حذف نشده است، همانطور که در مورد نقطه شکست وجود دارد. وقتی اشکال زدایی تمام شد، خودتان آن را حذف کنید. یا با قرار دادن یک نقل قول (') آن را به یک نظر تبدیل کنید.
اشکال زدایی با استفاده از عملگر Debug.Print
شما می توانید Debug.Print را در کد تابع در جای مناسب این برای بررسی مقادیر متغیرهایی که به صورت دوره ای در حال تغییر هستند مفید است.
می توانید نمونه ای از عملکرد Debug.Print را در تصویر زیر مشاهده کنید.
بیانیه Debug.Print i, vMax مقادیر و اعداد ترتیبی آنها را چاپ می کند.
در پنجره فوری دو عدد (17 و 14) را از محدوده انتخاب شده مشاهده می کنید که مربوط به محدودیت ها را تعیین کنید و از بین آنها حداکثر انتخاب شود. ارقام 1 و 2 به این معنی است که تابع 2 چرخه را تکمیل کرده است که در آن اعداد انتخاب شده اند. ما مقادیر مهم ترین متغیرها را می بینیم، همانطور که قبلاً با MsgBox انجام دادیم. اما این عملکرد را متوقف نکرد.
فراخوانی یک تابع از رویه
شما می توانید یک تابع تعریف شده توسط کاربر را نه از یک سلول در کاربرگ، بلکه از روی یک روش فراخوانی کنید. در این حالت، تمام خطاها در پنجره ویرایشگر ویژوال بیسیک نشان داده می شوند.
در اینجا نحوه فراخوانی تابع تعریف شده توسط کاربر GetMaxBerween از یکروش:
Sub Test() Dim x x = GetMaxBetween(Range ( "A1:A6")، 10، 50) MsgBox(x) End Subمکان نما را در هر نقطه از کد قرار دهید و F5 را فشار دهید. اگر خطایی در تابع وجود نداشته باشد، یک پنجره بازشو با نتیجه محاسبه مشاهده خواهید کرد.
در صورت بروز خطا، پیام مربوطه را در ویرایشگر VBA خواهید دید. محاسبه متوقف می شود و خط کدی که در آن خطا رخ داده است با رنگ زرد برجسته می شود. شما به راحتی می توانید تشخیص دهید که خطا کجا و چرا رخ داده است.
همین. اکنون افزونه خود را ایجاد کرده اید، آن را به اکسل اضافه کرده اید و می توانید از UDF در آن استفاده کنید. اگر می خواهید از UDF های بیشتری استفاده کنید، فقط کد را در ماژول افزودنی در ویرایشگر VBA بنویسید و آن را ذخیره کنید.
این برای امروز است. ما روشهای مختلفی را برای اشکالزدایی توابع سفارشی پوشش دادهایم و نحوه استفاده از آنها را در کتاب کار خود یاد گرفتهایم. ما واقعا امیدواریم که این دستورالعمل ها برای شما مفید باشد. اگر سوالی دارید، در نظرات این مقاله بنویسید.