تاریخ شمسی در نرمافزار Microsoft Project (MSP)، یکی از چالشهای رایج برای کاربران فارسیزبان است، است. از آنجا که MSP بهصورت پیشفرض از تقویم میلادی استفاده میکند، برای تطبیق با نیازهای پروژههای ایرانی یا فارسیزبان، لازم است راهکاری برای تبدیل تاریخها به شمسی در نظر گرفته شود. یکی از روشهای کاربردی برای این کار، استفاده از ستونهای سفارشی (Custom Fields) از نوع TEXT و وارد کردن فرمولهای تبدیل تاریخ در آنهاست.
برای شروع، ابتدا دو ستون جدید از نوع TEXT در نمای Task یا Gantt Chart باز کنید. این ستونها را میتوانید با نامهایی مانند “تاریخ شروع شمسی” و “تاریخ پایان شمسی” نامگذاری کنید تا کاربرد آنها مشخص باشد. سپس وارد تنظیمات ستون شوید و برای هر ستون، یک فرمول سفارشی تعریف کنید که تاریخ میلادی را به شمسی تبدیل کند.
در ستون اول (مثلاً تاریخ شروع شمسی)، فرمولی وارد میشود که تاریخ شروع هر فعالیت را گرفته و آن را به شمسی تبدیل میکند. این فرمول معمولاً از توابع داخلی MSP مانند DateValue, Year, Month, و Day استفاده میکند و با الگوریتم تبدیل تاریخ میلادی به شمسی ترکیب میشود. از آنجا که MSP بهصورت مستقیم از تقویم شمسی پشتیبانی نمیکند، این فرمول باید بهصورت دستی نوشته شود یا از ماکروهای آماده استفاده گردد.
در ستون دوم (مثلاً تاریخ پایان شمسی)، فرمول مشابهی وارد میشود که تاریخ پایان فعالیت را تبدیل میکند. این فرمول نیز باید بهگونهای طراحی شود که بتواند تاریخ میلادی را بهدرستی به معادل شمسی آن تبدیل کند. برای مثال، میتوان از الگوریتمهای تبدیل تاریخ که در زبانهای برنامهنویسی مانند VBA یا حتی در اکسل پیادهسازی شدهاند، استفاده کرد و آنها را در قالب ماکرو به MSP اضافه نمود.
همچنین میتوان از اکسل برای تبدیل تاریخها استفاده کرد و سپس تاریخهای شمسی را به MSP منتقل نمود. در این روش، ابتدا تاریخهای میلادی را از MSP به اکسل صادر کرده، سپس با استفاده از توابع سفارشی یا افزونههایی مانند “Jalali Date Converter”، تاریخها را به شمسی تبدیل کرده و مجدداً به MSP وارد میکنید.
نکته مهم دیگر این است که در برخی نسخههای ویندوز، اگر تنظیمات منطقهای (Regional Settings) روی تقویم شمسی تنظیم شده باشد، ممکن است تاریخها در MSP نیز بهصورت شمسی نمایش داده شوند. با این حال، این روش همیشه قابل اعتماد نیست و توصیه میشود از فرمولهای سفارشی یا ماکروهای دقیق استفاده شود.
این روش نهتنها باعث افزایش خوانایی برنامه زمانبندی برای کاربران فارسیزبان میشود، بلکه در تهیه گزارشها، مستندات پروژه، و هماهنگی با کارفرما نیز بسیار مفید خواهد بود. همچنین میتوان این ستونها را در قالبهای چاپی یا PDF نیز گنجاند تا در جلسات ارائه یا مستندسازی نهایی پروژه، اطلاعات تقویمی بهصورت بومی و قابلفهم نمایش داده شوند. در صورت نیاز به دقت بیشتر، میتوان از افزونههای جانبی یا اسکریپتهای VBA برای تبدیل خودکار تاریخها استفاده کرد. این ابزارها قابلیت سفارشیسازی دارند و میتوانند بهصورت پویا تاریخهای میلادی را به شمسی تبدیل کرده و در ستونهای مربوطه نمایش دهند. استفاده از این راهکارها، بهویژه در پروژههایی با ذینفعان داخلی، موجب افزایش شفافیت، دقت و تطابق فرهنگی در ارائه اطلاعات زمانبندی خواهد شد.
در نهایت، پس از وارد کردن فرمولها در ستونهای TEXT، میتوانید تاریخهای شمسی را در کنار تاریخهای اصلی مشاهده کنید. این روش نهتنها باعث افزایش خوانایی برنامه زمانبندی برای کاربران فارسیزبان میشود، بلکه در تهیه گزارشها، مستندات پروژه، و هماهنگی با کارفرما نیز بسیار مفید خواهد بود. همچنین میتوان این ستونها را در قالبهای چاپی یا PDF نیز گنجاند تا در جلسات ارائه یا مستندسازی نهایی پروژه، اطلاعات تقویمی بهصورت بومی و قابلفهم نمایش داده شوند.
فرمول شروع یا START:
(Int((Int([Scheduled Start]-DateValue(“21/3/1997 00:00:00”))-Int(Int([Scheduled Start]-DateValue(“21/3/1997 00:00:00”))/1461))/365)+1376) & “/” & (IIf(((((Int([Scheduled Start]-DateValue(“21/3/1997 00:00:00”)))-Int((Int([Scheduled Start]-DateValue(“21/3/1997 00:00:00”)))/1461)) Mod 365))<=186؛Int(((((Int([Scheduled Start]-DateValue(“21/3/1997 00:00:00”)))-Int((Int([Scheduled Start]-DateValue(“21/3/1997 00:00:00”)))/1461)) Mod 365))/31)+1؛Int((((((Int([Scheduled Start]-DateValue(“21/3/1997 00:00:00”)))-Int((Int([Scheduled Start]-DateValue(“21/3/1997 00:00:00”)))/1461)) Mod 365))-186)/30)+7)) & “/” & (IIf(((((Int([Scheduled Start]-DateValue(“21/3/1997 00:00:00”)))-Int((Int([Scheduled Start]-DateValue(“21/3/1997 00:00:00”)))/1461)) Mod 365))<=186,Int(((((Int([Scheduled Start]-DateValue(“21/3/1997 00:00:00”)))-Int((Int([Scheduled Start]-DateValue(“21/3/1997 00:00:00”)))/1461)) Mod 365)) Mod 31)+1,Int((((((Int([Scheduled Start]-DateValue(“21/3/1997 00:00:00”)))-Int((Int([Scheduled Start]-DateValue(“21/3/1997 00:00:00”)))/1461)) Mod 365))-186) Mod 30)+1+(IIf((Int([Scheduled Start]-DateValue(“21/3/1997 00:00:00”))) Mod 1461=0,1,0))))
فرمول پایان یا FINISH
(Int((Int([Scheduled Finish]-DateValue(“21/3/1997 00:00:00”))-Int(Int([Scheduled Finish]-DateValue(“21/3/1997 00:00:00”))/1461))/365)+1376) & “/” & (IIf(((((Int([Scheduled Finish]-DateValue(“21/3/1997 00:00:00”)))-Int((Int([Scheduled Finish]-DateValue(“21/3/1997 00:00:00”)))/1461)) Mod 365))<=186؛Int(((((Int([Scheduled Finish]-DateValue(“21/3/1997 00:00:00”)))-Int((Int([Scheduled Finish]-DateValue(“21/3/1997 00:00:00”)))/1461)) Mod 365))/31)+1؛Int((((((Int([Scheduled Finish]-DateValue(“21/3/1997 00:00:00”)))-Int((Int([Scheduled Finish]-DateValue(“21/3/1997 00:00:00”)))/1461)) Mod 365))-186)/30)+7)) & “/” & (IIf(((((Int([Scheduled Finish]-DateValue(“21/3/1997 00:00:00”)))-Int((Int([Scheduled Finish]-DateValue(“21/3/1997 00:00:00”)))/1461)) Mod 365))<=186,Int(((((Int([Scheduled Finish]-DateValue(“21/3/1997 00:00:00”)))-Int((Int([Scheduled Finish]-DateValue(“21/3/1997 00:00:00”)))/1461)) Mod 365)) Mod 31)+1,Int((((((Int([Scheduled Finish]-DateValue(“21/3/1997 00:00:00”)))-Int((Int([Scheduled Finish]-DateValue(“21/3/1997 00:00:00”)))/1461)) Mod 365))-186) Mod 30)+1+(IIf((Int([Scheduled Finish]-DateValue(“21/3/1997 00:00:00”))) Mod 1461=0,1,0))))