فروم تخصصی - پشتیبانی CPSD

نسخه‌ی کامل: تابع IIf
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
با سلام

نگاهی با هم به تابع IIf داشته باشیم

تابع IIf مخفف عبارت Immediate If و یا همون If فوری هستش , شاید بشه گفت علت این نام گذاری , سهولت کاربرد اون در شروط ساده هستش

تابع IIf در دسته توابعی قرار میگیره که به شما در پیاده سازی ساختار تصمیم گیری کمک میکنند

در واقع تابع IIf معادل ساختارهای شرطی If Then Else و If Then Elseif هستش

ساختار تصمیم گیری در واقع این سناریو رو پوشش میده که شما خروجی رو مقید به یک تصمیم خاص میکنید , فرضا اگر عدد ورودی کاربر زوج بود آنگاه برنامه اقدام به نمایش یک پیغام کنه و ...

پس تا این مرحله متوجه شدیم که دستور IIf در مواقعی که در جمله سئوالی ما کلمه "اگر" وجود داشته باشه کاربرد داره ( If در زبان انگلیسی به معنای اگر هستش )

شکل کلی دستور بدین صورته :

کد:
IIf(expr, truepart, falsepart)

بیایم این عبارت رو در قالب یک جمله مطرح کنیم

سئوال : اگر نمره ورودی بالاتر از 10 بود عبارت Pass و در غیر اینصورت عبارت Fail بر روی خروجی صادر شود

اگر نمره ورودی بالاتر از 10 بود در واقع همون Expr هستش

جمله ای که بلافاصله بعد از شرط اولیه اومده موید Truepart هستش و جمله انتهایی هم مولفه بخش Falsepart

پس در بخش Truepart ما باید نتیجه ای رو درج کنیم که با شرط منطبق بوده و در قسمت Falsepart به صورت معکوس

جمله فوق در داخل دستور IIf با در نظر گرفتن این فرض که Entery همون عدد ورودی هستش به صورت زیر نوشته میشه :

کد:
IIf((Entery > 10), "Pass", "Fail")

نکته ای در خصوص دستور IIf حائز اهمیته این مورده که متاسفانه دستور IIf اقدام به اجرای هر دو بخش Truepart و Falsepart میکنه و در نهایت یکی از این دو رو بر روی خروجی ارسال خواهد کرد , همین امر منجر میشه که سرعت اجرای این تابع به نسبت پایین بوده و در رویه های تکراری تا حد امکان باید از به کارگیری اون خودداری کرد

دستور IIf در واقع گونه آماده شده دستورات If در محیط VBA هستش که شما رو بی نیاز از برنامه نویسی میکنه

مثال فوق در صورتی که بخواید در داخل دستورات VBA به کمک دستور If درج بشه به صورت زیر خواهد بود :

کد:
Function EvaluateGrade(Entery As Long) As String

If Entery > 10 Then
  EvaluateGrade = "Pass"
Else
  EvaluateGrade = "Fail"
End If

End Function

و همین دستور در صورتی که بخواید در داخل محیط VBA با استفاده از دستور IIf درج کنید بدین گونه خواهد شد :

کد:
Function EvaluateGrade(Entery As Long) As String

EvaluateGrade = IIf((Entery > 10), "Pass", "Fail")

End Function

نکته : شاید در ذهنتون این شبه ایجاد بشه که بارها یکی از عوامل موثر در سرعت اجرا تعداد خطوط برنامه نویسی عنوان شده , پس با توجه به اینکه دستور دوم تنها شامل یک خط هستش ( دستور IIf ) , چگونه سرعت اجرای اون کمتر از حالتی هست که تعداد خطوط 5 خط شده ( دستور If ) ؟!

در پاسخ باید به این نکته اشاره کرد که تعداد خطوط یکی از عوامل بوده ولیکن هر یک از خطوط وزن اجرایی خاص خودشون رو دارند , در دستور If تنها بخشی که همیشه اجرا میشه اون بخشی هست که مشتمل بر شرط هستش و مابقی خطوط تنها در صورتی اجرا خواهند شد که شرط لازم حاصل بشه
ضمن اینکه در دستور If بر خلاف دستور IIf تنها اون بخشی اجرا میشه که انطباق کاملی با شرط ورودی داره , همین امر افزایش سرعت دستور If رو بر دستور IIf توجیح میکنه

یکی از محدودیتهای تابع IIf تعداد شروط تو در توی اونه , تابع IIf قادر به اجرای 7 لایه تو در توی شرطی هستش و در صورتی که ساختار تصمیم گیری شما بیشتر از 7 لایه باشه , شما ناگزیر به استفاده از دستور If هستید
گو اینکه محدودیت 7 لایه میشه گفت تقریبا یک محدودیت دست نیافتنی هستش چرا که در بسیاری موارد شما حداکثر در همون لایه سوم و یا چهارم متوقف خواهید شد و این محدودیت یک محدودیت تئوریکه تا یک محدودیت عملیاتی

جهت اینکه با لایه شرطی تو در تو هم آشنایی نسبی پیدا کنید مثال فوق رو اندکی بسط میدیم

در همون مثال اگر نمره ورودی بالاتر از 15 بود عبارت Excellent به جای Pass درج بشه

در ابتدا این بخش رو تحلیل میکنیم

نمره ای که بالاتر از 15 باشه پس بالاتر از 10 هم خواهد بود , همین امر کمک میکنه که تشخیص بدیم دستور IIf دوم رو باید در داخل بخش Truepart دستور IIf اول بنویسیم

به دستور زیر و تغییراتی که نسبت به دستور اولیه پیدا کرده توجه کنید :

کد:
IIf((Entery > 10), IIf((Entery > 15), "Excellent", "Pass"), "Fail")

تذکر : در هنگام استفاده از تابع IIf دقت لازم رو به خرج بدید , متاسفانه این تابع پتانسیل بالایی در برگردوندن خطا داره
به یک مثال نگاهی بندازیم :

کد:
IIf(EnteryA <> 0, EnteryB / EnteryA, 0)

در مثال فوق قصدمون اینه که اگر عدد ورودی EnteryA مساوی با صفر نبود محاسبه ای که انجام میشه EnteryB/EnteryA باشه و در صورتی که عدد ورودی EnteryA برابر با صفر باشه خروجی هم صفر در نظر گرفته بشه
در تئوری مشکلی منطقی در دستور وجود نداره ! ولیکن چرا یک مشکل اساسی وجود داره !
امیدوارم فراموش نکرده باشید که دستور IIf هر دو بخش Truepart و Falsepart رو اجرا میکنه و در نهایت یکی از این دو رو با توجه به شرط اولیه بر روی خروجی ارسال میکنه
در واقع IIf ابتدا محاسبات رو انجام میده و سپس شرط رو بررسی میکنه !!!
اگر عدد ورودی صفر باشه در این حالت برنامه با صدور خطای تقسیم بر صفر مواجه میشه !

در مجموع همونطوری که در توضیح تابع Switch عنوان شد بهتره تا جایی که امکان داره از تابع IIf استفاده به عمل نیارید

موفق باشید