پروفایل برنامه‌ریزی و کنترل پروژه
نادر خرمی راد

تحلیل و درک فرمول‌های طولانی

سوالی تو یه ایمیل از من شده بود که الان فکر کردم بهتره جوابش رو اینجا بنویسم، چون احتمالا سوال کسای دیگه‌ای هم باشه.

نویسنده ایمیل در جستجوی معنی این فرمول بود که تو یه فایل پراجکت دیده:

=iif(ID=0, ROUND(IIf([Number1]=0, [Number4], [Number5]/[Number1]*100) ,2), ROUND(IIf([Number1]=0, [Number4], [Number5]/[Number1]*100), 1))

و به خاطر طولانی بودن فرمول به نتیجه نرسیده بود. حالا با هم روند درک یه فرمول طولانی رو بررسی می‌کنیم.

فرمول‌های اینچنینی تابعی هستن و به همین خاطر اولین قدم درک اجزای توابعه. کل این فرمول داخل یه تابع IF هست و توابع شرطی معمولا سه بخش دارن: اگه شرط برقرار بود فلان مقدار، وگرنه بهمان مقدار.

پس اولین کارمون اینه که بخش‌های مختلف این تابع رو از هم جدا کنیم. اگه به کارهای اینچنینی عادت داشته باشین به سرعت و با نگاه می‌تونین از هم جداشون کنین و اگر هم نه، می‌تونین با مقایسه پرانتزهایی که باز و بسته می‌شن به نتیجه برسین. ولی به هر حال کار راحت‌تری هم می‌شه کرد. نرم‌افزار Notepad++ رو دانلود و نصب کنین. این نرم‌افزار خیلی ساده و سبکیه که زندگی بدون اون برای من سخت می‌شه!

به‌روزرسانی: مدت‌هاس که به جای ویندوز از لینوکس استفاده می‌کنم و در نتیجه دیگه از Notepad++ هم استفاده نمی‌کنم. اگه کنجکاو باشین، ویرایشگرهای فعلی من Atom و Gedit هستن.

حالا فرمول رو اونجا کپی می‌کنیم:

Sample formula

اولین پارامتر ورودی تابع شرطی ID=0 هست که ساده‌س. بعدی تابع ROUND هست که راحت نمی‌شه انتهاش رو پیدا کرد. اشاره‌گر متن رو می‌بریم روی پرانتز شروع ROUND و نرم‌افزار پرانتز پایان رو با رنگ قرمز بهمون نشون می‌ده.

Sample formula

حالا این محدوده که عملا می‌شه دومین پارامتر تابع شرطی رو Cut می‌کنیم و به جاش یه متغیر می‌ذاریم، مثلا A. اون پایین هم می‌نویسیم که A خودش چطوری محاسبه می‌شه (اون عبارتی که قبلا Cut کرده بودیم رو Paste می‌کنیم).

Sample formula

حالا پارامتر دوم رو هم به همین ترتیب از فرمول خارج می‌کنیم.

Sample formula

خوب، همین الان خیلی ساده شده، درسته؟ می‌تونیم یه مرحله دیگه هم ساده‌ش کنیم؛ عبارتی که تو متغیرهای A و B تکرار شده رو هم ازشون خارج می‌کنیم و به جاش C می‌ذاریم.

Sample formula

=iif(ID=0, A, B)

A = ROUND(C,2)
B = ROUND(C,1)
C = iif([Number1]=0,[Number4],[Number5]/[Number1]*100)

الان دیگه فرمول عظمت قبل رو نداره و راحت می‌تونیم درکش کنیم. با C شروع می‌کنیم: حاصل تقسیم Number 5 بر Number1 محاسبه شده و به مقیاس ۱۰۰ در اومده (تا شکل درصدی به خودش بگیره). بعد چون ممکن بوده Number1 بعضی وقت‌ها صفر باشه و در نتیجه خطای تقسیم بر صفر ایجاد کنه، یه تابع شرطی هم نوشته شده که اگه اون صفر بود، به جای حاصل تقسیم، مقدار Number4 رو نشون بده. حالا این‌که این سه فیلد اختصاصی پراجکت چی هستن رو می‌شه حدس زد،‌ ولی بهتره که فرمول‌هاشون رو جداگانه چک کنیم که مطمئن بشیم.

حالا فرمول اصلی چیه؟ فرمول اصلی اینه که اگه برای ردیف صفر، یعنی خلاصه فعالیت پروژه محاسبه می‌شد، مقدار C رو به دو رقم اعشار گرد کنه و در غیر این صورت به یک رقم.

ساده نبود؟