برنامه در اکسل برای نمایش دادن مناسبت‌ها از روی تاریخ (سال شمسی، سال قمری، سال میلادی) با استفاده از ماکرو و ماژول به صورت تابع


---
در دنیای امروز، مدیریت و رصد مناسبت‌ها و رویدادهای مختلف، یکی از نیازهای اساسی هر فرد و کسب‌وکار است. به‌خصوص در فرهنگ‌ها و تمدن‌های مختلف، تقویم‌های گوناگونی وجود دارند که هر کدام نقش مهمی در زندگی روزمره دارند. در این میان، تقویم‌های شمسی، قمری و میلادی، اهمیت ویژه‌ای دارند. توسعه برنامه‌های اکسل که بتوانند این مناسبت‌ها را بر اساس تاریخ‌های مختلف به صورت خودکار و دقیق نمایش دهند، بسیار مفید است. در این مقاله، قصد داریم یک برنامه کامل در اکسل را شرح دهیم که با بهره‌گیری از ماکرو و ماژول، بتواند این نیازها را برآورده کند و به صورت تابع‌های قابل استفاده در سلول‌ها عمل کند.
---

چرا نیاز به برنامه‌نویسی در اکسل برای مناسبت‌ها داریم؟




اکسل، ابزار قدرتمندی است که علاوه بر امکانات معمول، قابلیت برنامه‌نویسی با ماکرو و VBA (Visual Basic for Applications) را دارد. با استفاده از این قابلیت‌ها، می‌توان وظایف تکراری و زمان‌بر را خودکار کرد، و در نتیجه، زمان و خطای انسانی را کاهش داد. یکی از کاربردهای مهم، توسعه تابع‌هایی است که بتوانند تاریخ‌های شمسی، قمری و میلادی را به صورت خودکار تبدیل و مناسبت‌ها را بر اساس آن‌ها نمایش دهند.
علاوه بر این، در فرهنگ‌های مختلف، مناسبت‌هایی نظیر عید نوروز، ماه رمضان، و مناسبت‌های مذهبی و ملی، بر اساس این تقویم‌ها تعیین می‌شوند. بنابراین، داشتن ابزاری که این رویدادها را بر اساس تاریخ‌های وارد شده نشان دهد، بسیار ارزشمند است.
---

ساختار کلی برنامه و مفاهیم پایه




ابتدا باید توجه داشت که برنامه‌نویسی در اکسل، نیازمند شناخت توابع VBA است. این توابع، در کنار فرم‌ها و ماژول‌ها، امکانات لازم را برای توسعه برنامه فراهم می‌کنند. در پروژه ما، سه اصل مهم وجود دارد:
  1. ورود تاریخ‌ها: کاربران باید بتوانند تاریخ‌های مورد نظر خود را وارد کنند؛ مثلا تاریخ میلادی، قمری یا شمسی.

  1. تبدیل تاریخ‌ها: برنامه باید بتواند این تاریخ‌ها را به هم تبدیل کند، یا حداقل بر اساس نوع تاریخ، مناسبت‌های مرتبط را پیدا کند.

  1. نمایش مناسبت‌ها: در نهایت، بر اساس تاریخ وارد شده، برنامه باید بتواند رویدادها و مناسبت‌های مربوط را نشان دهد.
    برای دستیابی به این اهداف، نیاز است که چند تابع سفارشی بنویسیم، که هرکدام وظیفه خاصی را انجام دهند. این توابع، در قالب ماژول‌های VBA قرار می‌گیرند و در سلول‌های اکسل قابل استفاده هستند.
    ---

    توسعه تابع‌های پایه در VBA




در ابتدا، باید وارد محیط VBA شویم. این کار از طریق تب Developer و گزینه Visual Basic انجام می‌شود. سپس، یک ماژول جدید اضافه می‌کنیم و توابع مورد نیاز را در آن می‌نویسیم.
برای مثال، می‌توان یک تابع برای تبدیل تاریخ شمسی به میلادی نوشت. یا برعکس، و همچنین، توابعی برای تبدیل تاریخ‌های قمری. این توابع، با توجه به پیچیدگی محاسبات، نیازمند الگوریتم‌های دقیق و معتبر هستند، که معمولا بر پایه جداول و فرمول‌های ریاضی پیچیده ساخته می‌شوند.
در کنار این، می‌توان توابعی برای تشخیص مناسبت‌ها بر اساس تاریخ وارد شده، توسعه داد. مثلا، اگر تاریخ وارد شده در تقویم شمسی، ۱۳ فروردین باشد، برنامه باید تشخیص دهد که این تاریخ، عید نوروز است.
---

نمونه کد VBA برای توابع تاریخ




در ادامه، نمونه‌ای از کد VBA برای تبدیل تاریخ شمسی به میلادی آورده می‌شود:
vba  

Function ShamsiToGregorian(ByVal shamsiDate As String) As Date

Dim y As Integer, m As Integer, d As Integer

Dim gy As Integer, gm As Integer, gd As Integer
' فرض بر این است که تاریخ وارد شده به صورت "YYYY/MM/DD" است

y = CInt(Split(shamsiDate, "/")(0))
... ← ادامه مطلب در magicfile.ir