کاربرد VBA در اکسس ( Access Programming )



تعیین تاریخ میلادی  و معادل شمسی آن بعنوان مبنا فرضا اگر ۱۲۰۰/۱/۱  معادل ۳/۲۱/۱۸۲۱ باشد ( چهارشنبه روز ۵ ام هفته )


یک NumDay تعریف میکنیم قبل از شروع توابع 


ابتدا باید اختلاف تاریخ میلادی گرفته شده با مبنا که ۲۱ مارس ۱۸۲۱ اعلام شده را بگیرید که در اکسس با DateDiff امکان پذیر است و آرگومان اولش n میشود 


مرحله بعد ایجاد تابع AddDay که تعداد n بدست ِآمده را با تاریخ شمسی مبنا جمع کند و وقتی به n رسید تابع به پایان رسیده و عبارت تاریخ را برگرداند 


نحوه ی عملکر تابع AddDay :     

(Function(Dt,n

۱-اظهار متغیر Counter ,Y,M 

2-جدا کردن سال و ماه و روز و گذاشتن به ترتیب در متغیرهای Y  و M و  D

3-یک روز یک روز به  متغیر D  اظهار شده که  روز عبارت  Dt  را در خودش قرار میدهد اضافه میکند اگر D بزرگتر از روزهای  M ( تعداد روزهای M باید در تابعی گرفته شود و کبیسه هم در نظر گرفته شود )  که متغیر ماه عبارت Dt هست  شد دوباره D صفر میشود و یکی به M اضافه میگردد 

4-اگر متغیر M از ۱۲ عبور کرد یک عدد به متغیر Y که  سال عبارت Dt را در خود نگه میدارد اضافه خواهیم کرد 

5-اگر NumDay بزرگتر از ۷ شد NumDay ( شماره ی روز بدست آمده ) برابر صفر شود

5-یک عدد به Conuter اضافه می کنیم 


تابع Dif هم که اختلاف بین دو تاریخ را نشان میدهد اگر بخواهیم ایجاد کنیم روشش بدینگونه خواهد بود .


۱-که لوپ زده میشود بین  StartDate و EndDate  یعنی یکی به روز StartDate اضافه میکند دقیقا مثل تابع بالا و اگر روز از روز ماه بالاترشد صفر میشود و به ماه یکی اضافه میگردد و همچنان ماه اگر بزرگتر از ۱۲ شد ۱ شده و یک واحد به سال اضافه میگردد تا جایی پیش میرود که Start Date و EndDate برابر شوند  . برای شمارش هم از Counter استفاده میشود.


۱۲۰۰/۱/۱  معادل  ۱۸۲۱/۳/۲۱  

مرحله ی اول اختلاف تاریخ ها از مبدا شون  :سال منهای یک  در ۳۶۵ باضافه ی عددماه منهای یک ( جمع تعدادما ه ها در این بازه ) باضافه ی روز باضافه ی تقسیم سال بر ۴ فرضا برای سال میلادی بالا ۱۸۲۱ منهای یک میشود ۱۸۲۰ . ماه میلادی ۳ منهای یک میشود ۲ ( جمع روزهای ماه های ۱ و ۲ میلادی : ۳۱+۲۸ اگر سال ۱۸۲۰ کبیسه بود ۲۸ میشود ۲۹ ) 

 برای تاریخ شمسی بالا میشود  ۴۳۷۹۳۵ و برای میلادی میشود ۶۶۴۸۳۵  و اختلاف دو تاریخ ۲۲۶۹۰۰ که کلید معماست 

برای تبدیل شمسی به میلادی  از تقسیم سال بدست آمده ی بالا بعنوان مبنا استفاده می کنیم 

حال تاریخ ۱۳۹۸/۲/۱۸ را به میلادی تبدیل بنمائید :

حاصل جمع  ۱۳۹۷ منهای یک در ۳۶۴ + تعدادی روزهای ( ماه منهای یک ) ۳۱ + ۱۸ + ۲۹۹ =  ۵۱۰۲۵۳  یا ۲۲۶۹۰۰ جمع می کنیم میشود ۷۳۷۱۵۳ و دوباره از ۴۵۵  ( منظور سال میلادی منهای یک تقسیم بر ۴ )  و عدد ۷۳۶۶۹۸ بدست می آید عدد ۷۳۶۶۹۸ را بر ۳۶۵ تقسیم کرده و عدد حاصله که ۲۰۱۸ هست را باضافه ی یک می نمائیم . سال بدست می آید ( ۲۰۱۹ ) . 

بدست آوردن روز اختلاف ۳۶۵در۲۰۱۸ با عدد ۷۳۶۶۹۸ : ۱۲۸ و عدد ۱۲۸ را از تعداد روزهای ماه های میلادی کسر میکنیم تا به عدد روز برسیم    ۳۰-۳۱-۲۸-۳۱-۱۲۸  در نتیجه عدد حاصله ۸ میشود و عدد تعداد ماه های کسر شده باضافه یک میشود ماه میلادی یعنی ۵  

 



[ادامه مطلب را در اینجا بخوانید .]

در حالت (  Unicode  ( 16 bit 

0

1

2

3

4

5

6

7

8

9

A   معادل 10

B  معادل 11

C معادل   12

D معادل   13

E  معادل   14 

F  معادل   15

اگر شماره ی موبایل شامل + باشد قبل از شماره تلفن 91 و اگر نباشد 81 مع اعداد شماره ی موبایل دورقم دورقم فرضا شماره ی  موبایل 09009000001 میشود  900009000F1 چون رقم آخر تک رقم میشود بجایش F قرار میدهیم  چون کلا شمارش تعداد بایت  بر اساس دو رقم دورقم محاسبه میشود .  محاسبه ی  تعداد بایت  شماره ی موبایل فرضا  09009000001    اول با اضافه کردن 81 به شماره ی موبایل مع شده طبق گفته ی بالا☝   شمارش تعداد اعداد  شماره ی موبایل  و تبدیل به کد   طبق دستورالعمل ذیل 

Int(11/16)=0   و 11 منهای   int(11/16)*16  که میشود 11 و  معادل آن که B هست طبق اعداد ذکرشده در ا ول  یادداشت  و در آخر جوین کردن   0 و B  که  عبارت 0B81900009000F1  بدست می آید. چون شماره مرکز پیام مشخص نیست از عبارت 001100 در ارسال تکی و 005500 در ارسال چند پارتی استفاده می کنیم  و نتیجه برای ارسال پیامک چندپارتی درغالب یک پیامک ( حداکثر طول پیام 603 کاراکتر ) 

User31.dll


اکسس برای فرم ها و گزارشات خاصیتی رو اعمال کرده ولی برای  باتن کلوز اپلیکیشن اکسس تابعی وجود ندارد و با توابع API  اینکار امکانپذیر است که باید تابعی نوشت و زمان لود شدن فرم اصلی آنرا فراخوانی نمود .


WM_SYSCOMMAND message


یک پنجره وقتی که یوزر کامند را از پنجره ی منو انتخاب میکند این پیام را دریافت میکند 


 

SC_CLOSE=&HF060&  ' Close The Window

SC_MAXIMIZE=&HF030&  ' Maximize The Window 

SC_MINIMIZE=&HF020& ' Minimize The Window

MF_BYCOMMAND=&H0&      ' Indicates that the uPositi

parameter gives the identifier of the menu item

غیرفعال کردن آیتم منو و خاکستری کردن آن بطوریکه نشود انتخاب کرد 

MF_GRAYED=&H1&   ' Disables the menu item and grays it so that it cannot be selected.


Window Styles

WS_MAXIMIZEBOX=&10000

WS_MINIMIZEBOX=&20000

پنجره در نوار عنوان منودارد که میتوان با این آیتم آنرا برداشت هم کلوز هم باکس Min و Max

WS_SYSMENU=&80000  ' The window has a windomenu

on its title bar.

WS_BORDER=&800000


GetSystemMenu hWnd(A handle to the window that

will own a copy of the window menu.),bRevet(it can be 

modified. If this parameter is TRUE)


تابع بالا برنامه را برای دسترسی به منوی پنجره (همچنین به عنوان منوی سیستم یا منوی کنترل) برای کپی کردن و اصلاح، فعال می کند.

  نام فرم یا اپلیکیشن اکسس  =hWnd

تابع بالا= hMenu


تابع زیر آیتم منوی مشخص شده را فعال یا غیرفعال می کند.


EnableMenuItem hMenu,uIDEnableItem(The menu

item to be enabled, disabled, or grayed : Like )

(SC_CLOSE),uEnable(MF_GRAYED)



FORM.hWnd

شما می توانید از ویژگی hWnd برای تعیین دسته (یک مقدار Integer Long Integrated) که مایکروسافت ویندوز را به پنجره فعلی اختصاص داده است، استفاده کنید.


مثال زیر از ویژگی hWnd با عملکرد API و تابع IsZoomed برای تعیین اینکه آیا یک پنجره Maximize می شود استفاده می شود.


Declare Function IsZoomed Lib "user32" (ByVal hWnd

As Long) As Long


()Sub Form_Activate

Dim intWindowHandle As Long

intWindowHandle = Screen.ActiveForm.hWnd

If Not IsZoomed(intWindowHandle) Then DoCmd.Maximize 
End If 
End Sub




باز کردن فرم یا گزارش در نمای دیزاین باز کردن پراپرتی سکشن Detail رفتن به تب Format و انتخاب گزینه های انتخابی  خاصیت  AlterNate Back Color  که اگر None شود رنگ پیش زمینه برداشته میشود .


راهنمای انجام کار سایت آفیس به آدرس ذیل  و سطرهای آخر


 https://support.office.com/en-us/article/change-the-appearance-of-a-control-by-using-conditional-formatting-6ba9e9fa-4347-4183-b335-44e43b05e22ff



استفاده از توابع ویندوز API 

در اکسس تابعی برای این موضوع در نظر گرفته نشده ولی میشود با این توابع و هندل کردن ویندو پنجره ای را بست کامند باتن هایی که در Title Bar هست را برداشت مثل خاصیت MinMax Button =No در پراپرتی شیت فرم اکسس  ، یا تغییر پوزیشن نمایش Msgbox  سیستمی  و یا Icon را در Title Bar فرم انداخت ویا پوزیشن پنجره را تغییر داد و خیلی کارهای دیگر یا حتی گرفتن تکست در Title Bar که همان Caption هست و یا تغییر 


Declare Function ShowWindow Lib "User32" ( Byval Hwnd As Long , Byval ncmdShow As Long ) As Long 



نحوه ی نگارش تابع در ( Win64 و Win32 )  فرق میکند و باید  در Win64 قبل از فانکشن Ptrsafe را قرار داد و کل دیتا تایپ Long در تابع به LongPtr تبدیل  شوند  اگر باید در هر دو 32 بیت و 64 کار کند باید از if Win64 Then # و Else End If استفاده کرد که قبل از Else با PtrSafe و LongPtr طبق روش بالا و برای بعد از  Else همان تابع بدون PtrSafe و Long قرار می گیرد 


Hwnd نام کنترل مثلا  فرم یا اپلیکیشن اکسس ؛ مثلا در اکسس  


 نکته : قبل از گذاشتن تابع زیر جهت مخفی شدن پنجره ی اصلی اکسس حواستان باشد در رویداد کلوز فرم حتما دستور خروج از اپلیکیشن که Quit هست با Docmd را بدهید وگرنه برای بستن باید از Task Manager ویندوز استفاده کنید چون برنامه ی شما هنوز باز است و ویندوز تنها با دریافت مسیج حاصل از زدن دکمه ی کلوز پنجره ی اصلی اپلیکیشن اکسس را خواهد بست !!!


ShowWindow Application.hWndaccessApp , 0 


Hide  0 

Normal 1

Minimized 2

Maximized 3 




مثال زیر اکتیو کنترل را به متغیر ctlCurrentControl تخصیص میدهد و اعمال خاصی را بسته به  Value ی خاصیت Name  کنترل  فوکس داده شده انجام میدهد.


 Dim ctlCurrentControl As Control

Set ctlCurrentControl=Screen.ActiveControl

If ctlCurrentControl.Name="txtCustomerId" Then

انجام عمل خاصی  وقتی فوکس به تی اکس تی کاستمرآیدی برسد

"ElseIf ctlCurrentControl.Name="btnCustomerDetail

 Then 

انجام عمل خاصی وقتی فوکس به باتن کاستمر دیتیل برسد 

End If


تذکر :  اگر فوکس  به کنترلی انجام نشود در حال استفاده از   ActiveControl یا  اگر تمام کنترل های فرم هاید یا  غیرفعال  شوند  خطا اتفاق می افتد 




تعیین تاریخ میلادی  و معادل شمسی آن بعنوان مبنا فرضا اگر

 ۱۲۰۰/۱/۱  معادل ۳/۲۱/۱۸۲۱ باشد ( چهارشنبه روز ۵ ام هفته )


یک NumDay تعریف میکنیم قبل از شروع توابع 


ابتدا باید اختلاف تاریخ میلادی گرفته شده با مبنا که ۲۱ مارس ۱۸۲۱ اعلام شده را بگیرید که در اکسس با DateDiff امکان پذیر است و آرگومان اولش n میشود 


مرحله بعد ایجاد تابع AddDay که تعداد n بدست ِآمده را با تاریخ شمسی مبنا جمع کند و وقتی به n رسید تابع به پایان رسیده و عبارت تاریخ را برگرداند 


نحوه ی عملکر تابع AddDay :     

(Function(Dt,n

۱-اظهار متغیر Counter ,Y,M 

2-جدا کردن سال و ماه و روز و گذاشتن به ترتیب در متغیرهای Y  و M و  D

3-یک روز یک روز به  متغیر D  اظهار شده که  روز عبارت  Dt  را در خودش قرار میدهد اضافه میکند اگر D بزرگتر از روزهای  M ( تعداد روزهای M باید در تابعی گرفته شود و کبیسه هم در نظر گرفته شود )  که متغیر ماه عبارت Dt هست  شد دوباره D صفر میشود و یکی به M اضافه میگردد 

4-اگر متغیر M از ۱۲ عبور کرد یک عدد به متغیر Y که  سال عبارت Dt را در خود نگه میدارد اضافه خواهیم کرد 

5-اگر NumDay بزرگتر از ۷ شد NumDay ( شماره ی روز بدست آمده ) برابر صفر شود

5-یک عدد به Conuter اضافه می کنیم 


تابع Dif هم که اختلاف بین دو تاریخ را نشان میدهد اگر بخواهیم ایجاد کنیم روشش بدینگونه خواهد بود .


۱-که لوپ زده میشود بین  StartDate و EndDate  یعنی یکی به روز StartDate اضافه میکند دقیقا مثل تابع بالا و اگر روز از روز ماه بالاترشد صفر میشود و به ماه یکی اضافه میگردد و همچنان ماه اگر بزرگتر از ۱۲ شد ۱ شده و یک واحد به سال اضافه میگردد تا جایی پیش میرود که Start Date و EndDate برابر شوند  . برای شمارش هم از Counter استفاده میشود.


برای تبدیل شمشی به میلادی هم اختلاف تاریخ شمسی و تاریخ شمسی مبنا یعنی ۱۲۰۰/۱/۱ با تابع Dif بدست می آید و n بدست آمده با تابع AddDay به تاریخ میلادی مبنا که ۲۱ مارس ۱۸۲۱ است اضافه میشود عبارت بدست آمده معادل میلادی تاریخ شمسی است 


روش بالا بسیار دقیق است چون توسط کانتر و با احتساب کبیسه ها انجام میشود . 


برای تقویم هم می توانید بدین شکل عمل بنمائید 


فرضا تقویم شما روی سال ۹۶ و ماه ۳ میرود با تابع می توانید شماره روز یا NumDay  اول ماه خرداد ۹۶ را بگیرید و  باکس  های مورد نظر با توجه به کبیسه بودن ماه یا نبودن آن پر کنید منظور کپشن  . 


ش   ی   د  س  چ  پ ج  . هدرتان میشود و در زیر حدود ۴۲ باتن یا Toggle باتن ایجاد می کنید و به هدر هم شماره میدهید فرضا در تگ مربوطه که همشون Lable هستن فرضا اگر اول خرداد ۹۶ سه شنبه شد طبق تگ هدر باید از NumDay که ۴ بدست آمده ۱ شروع شده و تا ۳۱ پر کند چون خرداد ۳۱ روزه است و اگر روزهای باقیمانده در باکس های 35 ببعد باید جا گرفته شود از ردیف اول نسبت به تغییر کپشن اقدام بنماید تا به ۳۱ برسد. ( ۳۵ تاگل باتن در ۵ ردیف و ۷ ستون  )


این میشود مهندسی مع درست است که محاسبه ی زمانبر دارد ولی محاسبات بیشتر از ۳ ثانیه طول نخواهد کشید شما می توانید برای سرعت برگشت بهتر مبنا را فرضا ۱۳۷۰ تا ۱۳۸۰ در نظر بگیرید .


موید و پیروز باشید .




برای تبدیل میلادی به شمسی تعداد روزهای سپری شده ی میلادی را بدست می آوریم  اگر کوچکتر از ۷۹ بود با ۲۸۶ جمع می کنیم اگر بزرگتر از ۷۹ شد ۷۹ را ازش کم می کنیم 

۱۹۷۸/۹/۱۱ 

(۳۱+۲۸+۳۱+۳۰+۳۱+۳۰+۳۱+۳۱+۱۱)=۲۵۴ 

۲۵۴--۷۹=۱۷۵   . ۱۷۵>79 

۱۷۵-(۵×۳۱)=۲۰ 

میشود ۶/۲۰


حتما در سال کبیسه ی میلادی فوریه ۲۹ در نظر گرفته شود !!! 




فرضا تبدیل  ۱۳۵۰/۱۲/۳۰  


سال ۱۳۵۰ سال  کبیسه هست و برای سال کبیسه عدد ۳۶۶ و غیر کبیسه ۳۶۵ را درنظر میگیریم . اختلاف بین  اول ژانویه تا آخر اسفند هم ۷۹ ثابت در نظر میگیریم به هیچ عنوان این عدد تغییر نخواهد کرد 


اولین مرحله تعداد محاسبه تعداد روزهای سپری شده از فروردین تا سی ام اسفند ۱۳۵۰ که می شود . ۶  ماه اول سال ۳۱ روزه هست و ۵ ماه دوم ۳۰ روزه و ماه آخر اگر کبیسه باشد ۳۰ روزه در غیراینصورت ۲۹ روزاست . نهایتا میشود ۳۶۶ روز 


۳۶۶ روز را با ۷۹ جمع کرده و ۳۶۶ که در ابتدا گفته شد را از حاصلش کم می کنیم که همان ۷۹ میشود  نکته اگر حاصل جمع  با عدد ۷۹ از عدد ۳۶۵ کوچکتر شد همان را در نظر می گیریم و از ماه های میلادی به ترتیب از برج یک کسر می کنیم .


حال ۷۹ را از  روزهای ماه های میلادی کم می کنیم ماه اول ۳۱ و ماه دوم ۲۸ روزه است فلهذا میشود  ۲۰  در نتیجه روز ۲۰ و ماه سوم  بدست می آید یعنی ۲۰ مارس 


برای تقویم  : 


فرضا اگر میخواهیم اردیبهشت ۹۸ را بیاوریم کافیست با این روش معادل میلادی اول اردیبهشت ۹۸ را بدست آورده و با تابع  WEEKDAY روز موردنظر را بگیریم  و طبق آن چینش در باتن ها یا لیبل ها با لوپ زدن داخل آنها اعمال گردد . روشی آسان کاملا دقیق و سریعتر از محاسبه س اختلاف یا قرار دادن مبناها


مثال بعد معادل میلا ی تاریخ  ۱۳۵۰/۰۸/۲۰


6×31+30+20+793128
313031303131
3031

که عدد روز ۱۱ بدست می آید و تعداد ماه ها هم تعداد ماه های میلادی کم شده باضافه ی یک .

در مثال بالا حاصل جمع روزهای شمسی از فروردین تا ۲۰ آذر ۲۳۶ است و جمعش یا ۷۹ میشود ۳۱۵ که از ۳۶۵ کمتر است پس همان ۳۱۵ را در نظر گرفته و از ماه های میلادی ( از اولین ماه تا جائی که کمتر از صفر نشود ادامه می دهیم ) 

طبق گفته ی بالا روز میلادی ۱۱ و ماهش میشود ۱۱ ( از بعد از ۷۹ را بشمرید تعداد ما ه های میلادی کسر شده ۱۰ است که گفتیم باضافه ی یک میکنیم تا ماه میلادی بدست آید ) 


اگر عد از ۷۹ کمتر باشد ماه شمسی را باضافه ی ۶۲۲ میکنیم تا سال میلادی بدست آید و اگر از ۷۹ بیشتر بود با ۶۲۱ جمع می کنیم در مثال  ۱۳۵۰/۰۸/۲۰  چون ۳۱۵ از ۷۹ بیشتر است سال شمسی با ۶۲۱ جمع میشود و نتیجه ۱۹۷۱ است در حالیکه در ۱۳۵۰/۱۲/۳۰ سال شمسی را چون از ۷۹ کمتر است یا ۶۲۲ جمع کرده و عدد حاصله ۱۹۷۲ است .


موارد بالا بسیار ارزشمند است و  برای انجام آن وقت گذاشته شده .


برای مورد بالا سال ۲۰۰۴ کبیسه هست ولی اگر ماه دوم را خواستیم کم کنیم و در محاسبات باشد که هست جای ۲۸ عدد ۲۹ را جاگذاری خواهیم نمود. و سال ۸۲ هم که کبیسه نیست


6×31+5×30+9+(79)365
(31)=28


همانطور که گفته شد . روز ۲۸ بدست آمد و ماه هم فقط یک ماه  میلادی کسر شد ؛   برای بدست آوردن ماه هم که گفته شد تعداد ماه کسر شده باضافه ی یک را در نظر میگیریم یعنی عدد ۲  سال هم چون حاصل جمع تعدادروزهای شمسی باضافه ی عدد ثابت ۷۹ از ۳۶۵ کمتر است سال شمسی را با۶۲۲  جمع میکنیم  که میشود  سال ۲۰۰۴ میلادی پس معادل ۹ اسفند ۱۳۸۲ شد ۲۰۰۴/۰۲/۲۸



تبدیل میلادی به شمسی 


اگر دوسال کبیسه بودند عددها میشود ۸۰ و ۲۸۶ 

اگر دوسال کبیسه نبودند عددها میشود ۸۰ و ۲۸۵ 

اگر سال شمسی کبیسه بود میشود ۷۹ و ۲۸۷

اگر جمع روزهای محاسبه شده ی میلادی از عدد ثابت کوچکتر ذکر شده در بالا کوچکتر یا مساوی بود به عدد ثابت دوم اضافه کرده و تا جائی روزهای شمسی را کم می کنیم تا روز بدست آید و برای ماه تعداد ماه های کسر شده باضافه ی یک .







تعیین عدد هفته ی ماه در سال مورد نظر فرضا ۵ لیبل بصورت عمودی در کنار اون ۵ ردیف بگذارید و از فرمول زیر استفاده نمائید

عدد+( عدد ماه منهای یک ) ضربدر ۴  فرضا عدد هفته ی سوم برج ۵ میشود    






دقیق ترین روش تبدیل میلادی به شمسی محاسبه ی اختلاف است بقیه روش ها  با اختلاف یک روز نتیجه را نشان میدهد 


۲۰۰۹/۱/۱ . ۱۳۸۷/۱۰/۱۲

۲۰۱۳/۱/۱ . ۱۳۹۱/۱۰/۱۲

۱۹۷۲/۱/۱ ۱۳۵۰/۱۰/۱۱

۱۹۲۳/۱/۱ ۱۳۰۱/۱۰/۱۰ 

۱۹۳۱/۱/۱ ۱۳۰۹/۱۰/۱۰ 

۲۰۰۶/۱/۱ ۱۳۸۴/۱۰/۱۱ 


طبق موارد بالا که از گاه شمار ایران استخراج شده رابطه ی کاملا دقیقی نمی توان بدست آورد نتیجتا مجبورید با اختلاف های شمسی و میلادی نسبت به تبدیل استفاده کنید .


۲۲ مارس ۶۲۲ معادل جمعه  اول فروردین سال یک و غیر کبیسه 


(Datediff("d","3/22/622","5/18/2019=510301


فرضا اختلاف ۳/۲۲/۶۲۲ که معادل  جمعه اول فروردین سال یک است با ۵/۱۸/۲۰۱۹ بدون احتساب دو روز ۲۲ و ۱۸ میشود ۵۱۰۳۰۱ لذا عدد ۲ را به آن اضافه می کنیم که میشود ۵۱۰۳۰۳  بر ۳۶۵ تقسیم می کنیم و  تعداد سال های کبیسه منهای یک ( ۱۳۹۸-۱ )سپری شده  که ۳۳۹ هست را   کم می کنیم که میشود ۵۰۹۹۶۴ و نتیجه را بر ۳۶۵ تقسیم می کنیم که ۱۳۹۷  در میاد یکی بهش اضافه می کنیم سال شمسی ۱۳۹۸ بدست می آید .   نتیجه را از حاصل ضرب ۳۶۵ در عدد ۱۳۹۷ کسر می کنیم که مانده ۵۹ در می آید حال با توجه به ماه های میلادی ۵۹-۳۱ میشود ۲۸ و به عدد ماه که کسر کردیم یکی اضافه می کنیم تا عدد ماه بدست آید . یک ماه شمسی فقط توانستیم از ۵۹ کم کنیم در نتیجه ماه میشود ۲ و روز هم که ۲۸ بدست آمد .  







تعیین عدد هفته ی ماه در سال مورد نظر فرضا ۵ لیبل بصورت عمودی در کنار اون ۵ ردیف بگذارید و از فرمول زیر استفاده نمائید

عدد+( عدد ماه منهای یک ) ضربدر ۴  فرضا عدد هفته ی سوم برج ۵ میشود    




اختلاف ۱/۱/۱  تا ۱۳۹۸/۲/۲۸ میشود 

۵۱۰۳۰۱ 

اگر بخواهیم ۱۳۹۸/۲/۲۸ را به میلادی تبدیل کنیم می توانیم به مبدا میلادی که ۳/۲۲/۶۲۲ است اضافه کنیم 

۳۳۷  : تعددا کبیسه از سال یک تا ۱۳۹۷ 

۴۹=(۲۰۱۸*۳۶۵)-(۵۱۰۳۰۱+۲۲۶۸۹۶-۵۷۸)

۱۸=۴۹-۳۱

روز ۱۸ . ماه ۲ سال ۲۰۱۹


تبدیل  ۱۳۰۱/۱/۱  به میلادی  : 

اختلاف ۱/۱/۱ تا ۱۳۰۱/۱/۱ میشود ۴۷۴۸۱۵  

اختلاف تاریخ شمسی و میلادی ۲۲۶۸۹۶

تعداد کبیسه از ۶۲۲ تا ۱۹۲۱ ۴۶۵

۸۱=(۱۹۲۱*۳۶۵)-(۴۷۴۸۱۵+۲۲۶۸۹۶-۴۶۵)

۲۲=۸۱-۳۱-۲۸  

روز ۲۲ . ماه ۳ سال  ۱۹۲۲ 



ww.bahesab.ir/time/age


تاریخ   ۳/۲۱/۱۹۷۸  معادل ۱۳۵۷/۱/۱   تعداد کبیسه از ۶۲۲ تا ۱۹۷۷ عدد ۴۷۹ است. 


عدد بدست آمده در ماشین حساب اختلاف ۳/۲۲/۶۲۲  ( روز جمعه اول فروردین سال یک  )  و ۳/۲۱/۱۹۷۸ است.



عدد ثابت : ۲۲۶۸۹۶ 


مثال   اول  : 12/31/1919  معادل  1298/10/9


(1,918×365+334+31+464

226,896314+1)÷365=1297


(1,918×365+334+31+464
226,896314+1)(1,297
×365)=285


     285-6×31-3×30=9


تبدیل  1/1/1920 معادل    1298/10/10 

        


 

(1,919×365+1+464
226,896314+1)÷365=1297


(1,919×365+1+464
226,896314+1)(1,297
×365)=286


286-6×31-3×30=10


مثال سوم  ۱۰/۲۲/۱۹۲۱


(1,920×365+273+22+465
226,896-314+1)÷365=1300


(1,920×365+273+22+465
226,896314+1)(1,299
×365)=216


216-6×31=30 


سال ۱۲۹۹ باضافه ی یک ماه ۷ و روز ۳۰ 


تبدیل 9/11/1978  معادل 1357/6/20

1,977×365+243+11+479
226,896329+1)(1,356
×365)5×31=19 

در مثال بالا اختلاف یکروز مشاهده میشود .


✔ تبدیل  4/22/1922  معادل 1301/2/1 شمسی  : 


1,921×365+90+22+465
226,896315+1)÷365=1300


1,921×365+90+22+465

226,896315+1)(1,299
×365)=397


397-365=32


در این مورد یک عدد به سال ۱۳۰۰  اضافه شده 



فرمول :  در نظر داشتن عدد ثابت ۲۲۶۸۹۶ 

۱-بدست آوردن  تعداد روزهای سپری شده از ۱/۱/۱ تا  تاریخ شمسی موردنظر   فرضا به نام  ShamsiDiff  : 

سال شمسی منهای یک در ۳۶۵ باضافه ی  تعداد روزهای سپری شده از اول هر تاریخ  باضافه ی تعداد سال های کبیسه از سال یک تا آن تاریخ شمسی . سپس دو عدد حاصله را از هم کم کرده و منهای یک می کنیم 

۲- اضافه کردن اختلاف دو تاریخ شمسی  به عدد ثابت منهای عدد ۱۵۰ (تعداد سال های کبیسه تا سال ۶۲۲ میلادی ) 

۳-تقسیم عدد شماره ی ۳ بر ۳۶۵   فرضا    Y=Ret\365

۴-کم کردن  عدد ( سال شمسی منهای یک در ۳۶۵  منهای تعداد کبیسه ی میلادی بدست آمده از شماره ی ۳  منهای ۱۵۰) از  عدد شماره ی ۲ 

۵-عدد بدست آمده را از تعداد روزهای میلادی آنقدر کم می کنیم تا ان عدد کوچکتر مساوی جمع روزهای میلادی گردد .

۶-اگر ما بزرگتر از ۱۲ شد ماه یک میشود و سال میلادی یکی به آن اضافه می گردد

مثال ها : 

("GetMiladi1("1379/1/1

معادل     ۲۰۰۰/۳/۲۰

("GetMiladi1("۱۳۷۸/۱۰/۱۰

معادل     ۱۹۹۹/۱۲/۳۱

("GetMiladi1("۱۳۷۸/۱۰/۱۱

معادل    ۲۰۰۰/۱/۱

("GetMiladi1("۱۳۷۸/۶/۲۰

معادل      ۱۹۷۸/۹/۱۱

("GetMiladi1("۱۲۹۸/۱۰/۹

معادل     ۱۹۱۹/۱۲/۳۱


فرضا تبدیل ۱۲۹۸/۱۰/۹  :  نهم دیماه ۱۲۹۸

اختلاف ۱/۱/۱ تا ۱۲۹۸/۱۰/۹ میشود ۴۷۴۰۰۳ که می توانید صحت آنرا با DateDiff تابع خود اکسس امتحان کنید 

("DateDiff("n","۳/۲۲/۶۲۲","۱۲/۳۱/۱۹۱۹

قابل توجه : ۳/۲۲/۶۲۲ معادل جمعه اول فروردین یک است 

فرمول : 

                                                معادله ی اول 

۳۶۵=(۴۶۴+۱۵۰)-(۳۶۵×۱۹۱۸)-(۴۷۴۰۰۳+۲۲۶۸۹۶-۱۵۰)


۱-عدد ۴۷۴۰۰۳  تعداد روزهای سپری شده از۱/۱/۱ تا تاریخ ۱۲۹۸/۱۰/۹ است یا اختلاف دو تاریخ ۱/۱/۱ و تاریخ شمسی که میخواهیم به میلادی تبدیل کنیم.

۲-عدد ۲۲۶۸۹۶ تعداد روزهای سپری شده تا ۳/۲۲/۶۲۲ است و ثابت 

۴-عدد ۱۵۰ تعداد کبیسه های تا سال ۶۲۲ است و ثابت 

۵-عدد ۱۹۱۸ از تقسیم معادله ی اول بر ۳۶۵ حاصل شده که عدد صحیح آن باید گرفته شود و منهای یک شود .

۶-عدد ۴۶۴ تعداد کبیسه های تا سال ۱۹۱۷ است و متغیر

۷-عدد ۴۶۴-۱۵۰ همان تعداد کبیسه های  تا سال  ۱۲۹۷ است 

✔عدد حاصله  از معادله ی بالا ۳۶۵ است

✔ سال بدست آمده از تقسیم معادله ی اول بر ۳۶۵ هم ۱۹۱۹ خواهد بود.

باید  عدد ۳۶۵ را در لوپ ماه اول تا ماه آخر میلادی قراردهیم تا جائی که عددهای کسرشده کوچکتر مساوی عدد ماه لوپی شود در اینجا وقتی لوپ زده میشود و عدد روزهای ماه میلادی به ترتیب از یک تا ۱۲ از ۳۶۵ کسر میشود عددی لوپ میدهد تعداد روزهای ماه دسامبر است یعنی ۳۱ و ماه هم میشود ۱۲ 

✔بنابراین  سال ۱۹۱۹  ماه ۱۲ و روز ۳۱ خواهد بود 

ℹℹℹاگر عدد ۳۶۶ شود در ماژول باید بنویسیم یک عدد به سال اضافه شود و ماه هم یک شو د  مهم است  ) 


معادله : 


حتما چک کنید تعداد کبیسه ها تا قبل از سال موردنظر درست باشد وگرنه اختلاف یک یا دو روز حتمی است .





این دست نویس ها بسیار ارزشمند است  تعداد روزهای سپری شده از اول تا ۲۲ مارس ۶۲۲ عدد ۲۲۶۸۹۶ است 



سال میلادی منهای یک +  جمع روزهای ( ماه میلادی منهای یک )  + روز + تعداد کبیسه های سپری شده از سال یک تا سال میلادی منهای یک  - ۲۲۶۸۹۶ 


مثال های زیر در ایجاد تقویم شمسی کمک خواهند کرد فقط با محاسبه ی روزهای سپری شده از جمعه ۱/۱/۱ 


از جمعه ۱/۱/۱  تا دوشنبه ۱۳۹۸/۲/۳۰   میشود ۵۱۰۳۰۳


510303 mod 7 = 3    

اگر مانده ی تقسیم صفرشد یعنی جمعه هست . ۳ یعنی دوشنبه 

۱۳۷۸/۱۰/۱۱    :  ۵۰۳۲۲۴  

معادل شنبه یک ژانویه ی ۲۰۰۰

503224 mod 7 = 1

یک یعنی شنبه


۱۳۷۹/۱۰/۱۲ : ۵۰۳۵۹۰     

معادل دوشنبه ۱ ژانویه ۲۰۰۱

۵۰۳۵۹۰ mod ۷ = ۳

۳ یعنی دوشنبه


۱۳۵۷/۶/۲۰ : ۴۹۵۴۴۲

معادل  دوشنبه ۱۱ سپتامبر ۱۹۷۸ 

۴۹۵۴۴۲ mod ۷ = ۳

۳ یعنی دوشنبه


۱۲۹۸/۱۰/۱۰ : ۴۷۴۰۰۴

معادل پنج شنبه ۱ ژانویه ۱۹۲۰

۴۷۴۰۰۴ mod ۷ = ۶ 

۶ یعنی پنج شنبه


۱۳۹۸/۱/۱ : ۵۱۰۲۴۳

معادل پنج شنبه ۲۱ مارس ۲۰۱۹

۵۱۰۲۴۳ mod ۷ = ۶ 

۶ یعنی پنج شنبه


لینک محاسبه گر روز و اختلافhttps://www.bahesab.ir/time/age/ 


لینک مانده ی تقسیمhttps://www.omnicalculator.com/math/modulo  


 https://fa.m.wikipedia.org/wiki/گاه‌شماری_رسمی_ایران 


از قائده ی خاصی پیروی نمیکند  لیست زیر طبق لینک بدست آمده از ۴ تا ۱۴۷۳ طبق گاه شمار رسمی بعد از هر عدد یک کبیسه ی پنج ساله است و بعد از آن تا شروع عدد بعدی هر چهار واحدی که اضافه میشود.


اعداد زیر طبق جدول گاه شمار رسمی  همان لینک بالا بدست آمده .


ARRAY(4,37,66,99,132,165,198,231,264,297,326,359,392,425,458

491,524,553,586,619,656,685,718,751,784,817,850,883,916,

949,978,1011,1044,1077,1110,1143,1176,1209,1238,1275,

,1308,1341,1370,1403,1436,1473,1502,1535,1568,1601

1634,1667,1696,1733




اعداد بالا را در تابع Array  قرار میدهیم  بدون دابل کوتیشن  فرضا اگر بخواهیم کبیسه بودن سال ۱۳۸۰ را بسنجیم 

۱-عددی  در آرایه  را که از عدد ۱۳۸۰ کوچکتر باشد را پیدا میکنیم که در اینجا ۱۳۷۰ را نمایش خواهد داد

۲-همانطور که گفته شد بعد از اعداد یاد شده عدد بعدی باضافه ی ۵ کبیسه ی ۵ ساله میشود و اعداد بعدی آن هر چهار واحد اضافه کبیسه ی چهار ساله میشود . پس بین  عدد ۱۳۷۰  تا ۱۳۸۰ لوپ میزنیم  یا در همان دو لوپ ایجاد شده در لوپ اول یک C بعنوان کانتر میزنیم و میگوئیم  C=C+1


 لوپ  اول می تواند تا زمانی  ادامه یابد که سال  داخل تابع کوچکتر مساوی عدد داخل آرایه باشد. ( فرضا میخواهید چک کنید چند سال کبیسه را تا قبل از سال ۱۳۷۰ پشت سر گذاشته اید : برای اختلاف تاریخ شمسی حتما باید تعداد کبیسه تا  یکسال قبل محاسبه شود ولی برای توتال روزهای گذشته از سال کنونی خود سال باید مشخص شود که کبیسه هست یا خیر عددی در آرایه  که کوچکتر از ۱۳۷۰ باشد را میگیریم و طبق آنچه  گفته شد ۵ سال به عدد آرایه اضافه می کنیم که کبیسه ی ۵ ساله است و کبیسه های بعدی چهار تا چهارتا اضافه میشود)


برای لیست کردن سال های کبیسه طبق آرایه ی بالا اگر Ubound و Lbound جواب دهد میتوان سال های کبیسه را لیست کرد چه در اکسل چه در اکسس طوری عمل میشود که عدد اول را باضافه ی ۵ میکند و بقیه را بعلاوه ی چهار تا به   عدد بعدی در آرایه برسد  اگر عدد آخر با pointer ( یا عدد بعدی آرایه )  برابر نبود عددها را چاپ کند ، فرضا 

4+5=9  و بعد چهار تا چهارتا جلو میرود ۹+۴ ، ۱۳+۴ ، ۱۷+۴ ، ۲۱+۴ 

۲۵+۴ ، ۲۹+۴ ، ۳۳ +۴  که ۳۷ میشود 


بدست آوردن دقیق کبیسه برای کسانیکه میخواهند تقویم دقیقی داشته باشند یا محاسبه ی دقیق از سال یک تا ۱۵۰۰ پیروی از این سبک اامیست وگرنه اختلاف یک یا دو روز حداکثر حتمی است.                 مرجع  گاشمار_رسمی_ایران 



روش : 

1-جداکردن  ماه ، روز و سال و ذخیره در  Alias ها ی M,D,Y که برای تاریخ میلادی بسیار آسان است 

(Y=Year(Dt

(M=Month(Dt

(D=Day(Dt

و اگر تاریخ ورودی اعتبار نداشته باشد فرضا ماهی که ۲۹ روزه است را سی روزه وارد کنید یا ماه را بیشتراز ۱۲ تایپ کنید یا  فرمت اشتباه باشد خودش ارور را اعلام میکند احتمالا بعنوان Type Mismatch . از توابع بالا برای ماه شمسی نمی توانید استفاده کنید چونکه روزهای ماه شمسی با میلادی فرق میکند.

۲-لوپ زدن از یک تا تعداد روزی که باید به تاریخ اضافه شود یعنی n  منهای یک 

۳-D=D+1

4-اگر D بزرگتر از تعداد روزهای میلادی شد D برابر یک خواهد شد  ( (البته باید طبق سال کبیسه باشد )  و  M=M+1 

5-اگر Y بزرگتر از ۱۲ شد Y=Y+1 و  M=1  

البته این کانتراست و بسیاردقیق ، اگر فواصل تاریخی زیاد باشد این روش مناسب نیست چون حدود ۳ ثانیه طول میکشد تا جواب را برگرداند .


اضافه کردن  474003  روز به ۲۲ مارس ۶۲۲ که برابر روز جمعه اول فروردین سال یک است .

بدست آوردن شمسی : (البته با DateDiff میتوان اختلاف بین ۲۲ مارس ۶۲۲ تا ۳۱ دسامبر ۱۹۱۹ را بدست آورد که همین عدد است)

۱-تعداد روزهای سپری شده از اول ماه شمسی که اینجا یک فروردین سال یک است معادل ۲۲ مارس ۶۲۲ موردنظر که اینجا ۱ است 

۲-تعداد کبیسه های میلادی که ۳۱۴ است 

474,003(1,298×365)314+
1

 در معادله ی بالا عدد منفی شده که با ۳۶۵ اگر جمع کنیم عدد ۲۸۵ حاصل میگردد که هدف ماست بعد از کم کردن تعداد ماه های شمسی از عدد تا زمانیکه منفی نشده روز بدست می آید که همان ۹ است و تعداد ماه های کم شده باضافه ی یک هم ماه مذبور 

میشود یعنی ۱۰ . پس تاریخ ۹ دیماه ۱۲۹۸ خواهد شد


 : بدست آوردن میلادی

اگر عدد کوچکتر مساوی صفر شد با ۳۶۵ جمع میزنیم

474,003(1,298×365)314

+81+365=365

اضافه کردن ۴۳۰۸ روز به ۳/۲۱/۲۰۰۶ یا معادل شمسی ۸۵/۱/۱

تعداد کبیسه ی ۲۰۰۶ تا ۲۰۱۷ سه است و برای شمسی تعدا د روز را یک فروردین میگیریم در ۸۵/۱/۱

4,308(11×365)3+1=291

میلادی ۲۰۰۶

تعدادکبیسه ی ۲۰۰۶ تا ۲۰۱۷ سه است و روزهای سپری شده ی سال ۲۰۰۶ هم عدد ۸۰ است 

4,308(11×365)3+80=370

که یکی به سال اضافه میشود و ماه یک میشود ، روز میلادی هم ۵ خواهدشد





19 جولای سال 622  شروع تاریخ قمری است و مصادف با 27 تیر سال یک شمسی 

Dim D(12) As Long

D(1)=30 : D(2)=59 : D(3)=89 : D(4)=118 : D(5)=148  D(6)=177 : D(7)=207 : D(8)=236 : D(9)=266 : D(10)=295 : D(11)=325 : D(12)=354

یک در میان ماه ها ی قمری را بصورت قراردادی 29 مشخص کرده اند یعنی ماه اول که محرم است 30 روز و ماه بعدی 29  و با این منوال ماه های فرد را 30 روز و ماه های زوج را 29 روزه گرفته اند و در صورت کبیسه بودن سال طبق جدول ، روش رایج در گاه شمار قراردادی ماه آخر بجای 29 روزه 30 روزه در نظر خواهند گرفت.


با کانتر براحتی میتوان تاریخ دقیق را بدست آورد اگر کبیسه دقیق و طبق جدول، روش رایج  ،که اقتباس شده بدست آید ،  ولی در فواصل طولانی حدودا ۳ ثانیه بازگشت بطول خواهد انجامید پس باید دنبال راهی باشید که کمترین زمان برگشتی را داشته باشد.


18 ژانویه سال 624 معادل 27 دی سال 2 ، اختلاف با تابع DateDiff اکسس بین  19 جولای 622 که شروع قمری است  تا تاریخ 18 ژانویه ی 624 موردتبدیل ما 549 روز است  که یک واحد به آن اضافه می کنیم .


در اینجا 550  از 354 بزرگتر است پس  D12 را از آن کم میکنیم میشود 195 و سال هم  بالطبع یک واحد بدان اضافه شده و 2 خواهد شد  ،  طبق آرایه ی بالا 195 بین D6 و D7 است پس کوچکتر از عدد 195 را انتخاب میکنیم  177-195 که میشود 18 ( روز )   و  عدد آرایه ی  177  6 است که آنرا باضافه ی یک می کنیم که ماه عدد 7 می شود


بنابراین سال شد 2 ماه  7 و روز هم 18 


2/4/14  -  6 جولای 623  و  28 ذی الحجه سال  ۱ قمری ، 352

2/4/15  -  7 جولای 623  و  29 ذی الحجه سال  ۱ قمری ، 353

2/4/16  -  8 جولای 623  و  1 محرم سال  2 قمری ، 354

2/4/17  -  9 جولای 623  و  2 محرم سال 2 قمری ، 355



۱۲ تیر سال ۵ شمسی معادل ۴ جولای ۶۲۶ و ۳۰ محرم (۱) سال ۵ . اختلاف ۱۴۴۶ روز 

۷ تیر سال ۵ شمسی معادل ۲۹ جون ۶۲۶ و ۲۵ محرم (۱) سال ۵ . اختلاف ۱۴۴۱


۲۷ تیر سال یک شمسی آغار سال قمری و ۱۹ جولای ۶۲۲ آغاز سال قمری اختلاف ها با DateDiff

                                     

1446=("Dif=DateDiff("n","7/19/622","7/4/626

Ret=Dif=1446+1=1447

 ( If 1447>354 (True

Y=2 Ret=1447-354=1093

 ( If 1093>354 (True

2=Kabiseh Y=3 Ret=1093-355=738

( If 738>354 (True

3=NoKabiseh Y=4 Ret=738-354=384

( If 384>354 (True

4=Nokabiseh Y=5 Ret=384-354=30

(If 30>354 (False

(If Ret=D(1) , M=۰ : Ret=D(1

If Ret<D(1) , M=۰ : Ret=D(1)-Ret

 .   If

  .   If

M=M+1

تا زمانی لوپ ادامه می یابد که Ret کوچکتر مساوی (D(M شود

Ret=30 , M=1

Year : 5  , M : 1 , D : 30 

۳۰ محرم سال ۵


باحسابhttps://www.bahesab.ir/time/conversion/


لینک بالا ۱۴۳۶ تا ۱۴۳۸ را کبیسه ی قمری نشان میدهد در حالیکه در تقویم های آنلاین دیگر ۱۴۳۶ کبیسه ولی ۱۴۳۷ کبیسه نیست  ؟؟!!!! ولی ما بر حسب همان رایج استفاده می کنیم که قابل اعتمادتر است . انشالله باحساب توضیح قانع کننده برای کبیسه بودن ۳ سال پشت سر هم در سایتش داشته باشد ( ۲۰ رمضان )







گاه شمار قمریhttps://fa.m.wikipedia.org/wiki/گاه‌شماری_هجری_قمری 

 از شکافتن هسته ی اتم هم ساده تر است اگر تلاش کنید محتاج چون منی نخواهید بود ( امام خمینی ره )

قسمت گاه شماری هجری قمری قراردادی  جدول مربوطه ( رایج )

طبق رایج . تعداد روزهای ماه های قمری یکی در میان ۲۹ یا ۳۰ روزه هستند و از ۲۹ روز شروع میشود اگر سال کبیسه بود ماه آخر بجای ۳۰ روزه ۲۹ روزه میشود  با Mod میشود تعداد روزهای ماه قمری را مشخص کرد در لوپی که مانده باید از روزهای قمری کم شود 

فرضا  i mod 2  اگر صفرشود ماه ۳۰ روزه واگر یک شود ماه ۲۹ روزه است 

تبدیل میلادی به قمری  :    ۲۶ می ۲۰۱۹ معادل ۵ خرداد ۹۸

اختلاف را با DateDiff اکسس میشود بدست آورد از ۱۹ جولای ۶۲۲ تا تاریخ میلادی درج شده .( روز اول در تابع DateDiff ثابت است ) 

که در اینجا اختلاف روزها  را ۵۱۰۱۹۰ نشان میدهد 

معادله البته اگر عدد منفی شد به سال بدست آمده اضافه نمیشود

سال را منهای یک کرده و در ۳۵۴ ضرب می کنیم تعداد کبیسه که اینجا ۵۲۸ است مربوط به یک قمری تا سال ۱۴۳۹ است ( ۳۵۴ جمع روزهای یکسال قمری در شرایط غیر کبیسه است )

۹۷-=۵۲۸-(۱۴۳۹×۳۵۴)-(۵۱۰۱۹۰-۳۵۳)

عدد منفی شده با ۳۵۳ جمع میکنیم ( عدد ۳۵۳ اختلاف روز یک قمری تا آخرماه همان سال است )

سال همان ۱۴۴۰ باقی می ماند 

عدد آخر ۲۵۶ بدست می آید 

از ماه اول قمری به همان شکل که گفته شد انقدر کم میکنیم تا از تعداد روز آن ماه کمتر یا مساوی باشد

۲۰=۲۵۶-۲۹-۳۰-۲۹-۳۰-۲۹-۳۰-۲۹-۳۰

خود تقویم  سال ۹۸ یکشنبه ۵ اردیبهشت ۹۸ را ۲۱ رمضان چاپ کرده


 https://fa.m.wikipedia.org/wiki/گاه‌شماری_رسمی_ایران 


از قائده ی خاصی پیروی نمیکند  لیست زیر طبق جدول لینک بالا از سال ۴ تا سال ۱۴۷۳ می باشد ، بعد از هر عدد یک کبیسه ی پنج ساله است و بعد از آن تا شروع عدد بعدی هر چهار واحدیک کبیسه ی چهارساله است.


اعداد زیر طبق جدول گاه شماری_رسمی_ایران  ( لینک بالا  ) استخراج شده .


ARRAY(4,37,66,99,132,165,198,231,264,297,326,359,392,425,458

491,524,553,586,619,656,685,718,751,784,817,850,883,916,

949,978,1011,1044,1077,1110,1143,1176,1209,1238,1275,

,1308,1341,1370,1403,1436,1473,1502,1535,1568,1601

1634,1667,1696,1733




اعداد بالا را در تابع Array  قرار میدهیم  بدون دابل کوتیشن  فرضا اگر بخواهیم کبیسه بودن سال ۱۳۸۰ را بسنجیم 

۱-عددی  در آرایه  را که از عدد ۱۳۸۰ کوچکتر باشد را پیدا میکنیم که در اینجا ۱۳۷۰ را نمایش خواهد داد

۲-همانطور که گفته شد بعد از اعداد یاد شده عدد بعدی باضافه ی ۵ کبیسه ی ۵ ساله میشود و اعداد بعدی آن هر چهار واحد اضافه کبیسه ی چهار ساله میشود . پس بین  عدد ۱۳۷۰  تا ۱۳۸۰ لوپ میزنیم  یا در همان دو لوپ ایجاد شده در لوپ اول یک C بعنوان کانتر میزنیم و میگوئیم  C=C+1


لوپ اول هم  در آرایه یکی یکی اعداد را میگیرد و بازه ی لوپ دوم عدد آرایه در لوپ اول و عدد  بعد از آن خواهد شد .


قسمتی ازکد بقیه توسط الگوریتم باید انجام شود : 


DO 

.

DO

DEBUG.PRINT J

IF J>A+5 THEN J=J+4  ELSE J=J+5

 (LOOP UNTIL J>=ARR(I+1 ؟؟؟ >

X=J

I=I+1

(LOOP UNTIL I=Ubound(J


 لوپ  دوم می تواند تا زمانی  ادامه یابد که سال  داخل تابع کوچکتر مساوی عدد داخل آرایه باشد. ( فرضا میخواهید چک کنید چند سال کبیسه را تا قبل از سال ۱۳۷۰ پشت سر گذاشته اید : برای اختلاف تاریخ شمسی حتما باید تعداد کبیسه تا  یکسال قبل محاسبه شود ولی برای توتال روزهای گذشته از سال کنونی خود سال باید مشخص شود که کبیسه هست یا خیر عددی در آرایه  که کوچکتر از ۱۳۷۰ باشد را میگیریم و طبق آنچه  گفته شد ۵ سال به عدد آرایه اضافه می کنیم که کبیسه ی ۵ ساله است و کبیسه های بعدی چهار تا چهارتا اضافه میشود)




برای لیست کردن سال های کبیسه طبق آرایه ی بالا اگر Ubound و Lbound جواب دهد میتوان سال های کبیسه را لیست کرد چه در اکسل چه در اکسس طوری عمل میشود که عدد اول را باضافه ی ۵ میکند و بقیه را بعلاوه ی چهار تا به   عدد بعدی در آرایه برسد  اگر عدد آخر با pointer ( یا عدد بعدی آرایه )  برابر نبود عددها را چاپ کند ، فرضا 

4+5=9  و بعد چهار تا چهارتا جلو میرود ۹+۴ ، ۱۳+۴ ، ۱۷+۴ ، ۲۱+۴ 

۲۵+۴ ، ۲۹+۴ ، ۳۳ +۴  که ۳۷ میشود 


بدست آوردن دقیق کبیسه برای کسانیکه میخواهند تقویم دقیقی داشته باشند یا محاسبه ی دقیق از سال یک تا ۱۵۰۰ پیروی از این سبک اامیست وگرنه اختلاف یک یا دو روز حداکثر حتمی است.                        


              مرجع: گاه شماری_رسمی_ایران 



سال‌های کبیسه رسمی یک قرن اخیر با توجه به دوره‌ها:
(دورهٔ ۳۳ساله): ۱۲۸۰ - ۱۲۸۴ - ۱۲۸۸ - ۱۲۹۲ - ۱۲۹۶ - ۱۳۰۰ - ۱۳۰۴ - ۱۳۰۸ 
(دورهٔ ۳۳ساله): ۱۳۱۳ - ۱۳۱۷ - ۱۳۲۱ - ۱۳۲۵ - ۱۳۲۹ - ۱۳۳۳ - ۱۳۳۷ - ۱۳۴۱ 
(دورهٔ ۲۹ساله): ۱۳۴۶ - ۱۳۵۰ - ۱۳۵۴ - ۱۳۵۸ - ۱۳۶۲ - ۱۳۶۶ - ۱۳۷۰ 
(دورهٔ ۳۳ساله): ۱۳۷۵ - ۱۳۷۹ - ۱۳۸۳ - ۱۳۸۷ - ۱۳۹۱ - ۱۳۹۵ - ۱۳۹۹ - ۱۴۰۳.


جدول زیر از وب گرفته شده و باید  طبق جدول داخل لینک طبق ردیف هاچک کنید .


گاهی محاسبات بهم میریزد مثل ۷ خرداد ۱۳۹۸ که باید ۲۳ رمضان باشد ولی ۲۲ رمضان میشود چون ماه قبلی ۳۰ روزه شده    


آیتم اول را اگر به ترتیب از اولین ماه قمری که 30  هست و یک درمیان 29 میشود کم کنیم تا مانده از تعداد روزهای ماه کوچکتر شود عدد 23 حاصل میشود 

2593029302930293029=23 

در این مثال می توان در ماژول نوشت اگر سال ۱۴۴۰ شد جای تعداد روزهای ماه ۸ و ماه ۹ قمری جابجاشوند تا ۲۳ رمضان به ۲۲ رمضان تبدیل شود

510,192+11,440×354528+354=259

508,161+11,434×354526+355=355

508515+1-1435×354-526+354=354

495323+1-1398×354-513+355=274

506627+1-1430×354-524+354=237

506714+1-1430×354-524+354=325

506393+1-1429×354-524=4

508870+1-1436×354-527+355=355

506743+1-1430×354-524+354=354

505,326+11,426×354523+355=355


در مثال های بالا

عدد اول اختلاف 19 جولای 622  شروع قمری و  تاریخ میلادی۱موردنظر است که به ترتیب 28 می 2019 ، 4  نوامبر 2013 ، 24 اکتبر 2014 ،11 سپتامبر  1978 ،23 اوت 2009 ، 18 نوامبر 2009 ، 1 ژانویه 2009 ، 14 اکتبر 2015 و 17 دسامبر 2009  ، 30 ژانویه 2006 می باشد


عدد دوم  : یک واحد به اختلاف اضافه می شو

 عدد سوم : حاصل ضرب 354 در ( تقسیم  جمع عدد اول و دوم

 (بر354  منهای یک است

عدد چهارم : تعداد کبیسه ی سپری شده تا عدد سوم است.

اگر عدد نهایی کوچکتر مساوی صفر شد اگر عدد سوم که سال است کبیسه بود با 355 اگر نه با 354 جمع میشود ، اگر عدد نهائی بزرگتر از صفر بود که یک واحد به سال اضافه میشود و ماه هم یک و یا بالاتر .

در جائی که عدد 354 یا 355 اضافه نشده یعنی عدد مثبت شده


لینک محاسباتhttps://keisan.casio.com/exec/system/1346122065   ذهنتون رو در گیر نکنید چون قمری هم قائده ی خاصی ندارد و دقیق ترین محاسبه باید نجومی باشد که  آنهم نمیشود مال چند 

سال دیگر را حدس زد


برای تبدیل شمسی به قمری تنها کافیه اختلاف تاریخ شمسی موردنظر تا تاریخ ۱/۱/۱ شمسی  را بدست آوردید و منهای ۱۱۹  

کنید  (  اختلاف ۲۷ تیر یک شمسی تا ۱ول  قمری ۱۱۹ است

فرضا اختلاف ۱ شمسی تا ۸ خرداد ۹۸ عدد ۵۱۰۳۱۲ عدد ۱۱۹ را که از آن کم کنیم میشود همان عدد ۵۱۰۱۹۳ و طبق مثال های بالا عمل 

میکنیم 

 : آرایه  

1 : 29 ,  2 : 59 , 3 : 89 , 4 : 118 , 5 : 148 , 6 : 177 , 7 : 207 

8 : 236 , 9 : 266 , 10 : 295 , 11 : 325 , 12 : 354 

اگر سال کبیس شد ماه آخر در آرایه یعنی ۱۲ به ۳۵۵ تغییر می یابد

: معادله

510,193+11,440×354528+354=260


چون سال ۱۴۴۰ قمری محاسبات را بهم زد و فرضا بجای ۲۳ رمضان ۲۲ رمضان شد در نتیجه در بالا می توانیم ا عداد ۸ و ۹ را عوض  کنیم  ( آرایه ی بالا  ) در مورد ۲۶۰ در حالت عادی وقتی از ۲۳۶ کم می کنیم  عدد روز قمری ۲۴ در می آید که طبق تغییرات در ماه قبل رمضان این روز ۲۳ رمضان خواهد شد نتیجتا باید در ماژول بنویسیم اگر سال ۱۴۴۰ قمری شد عدد ۸ به۲۳۷ و عدد ۹ به۲۶۵ تغییر یابد که اگر بدین منوال اقدام شود اختلاف عدد ۲۶۰ بدست 

آمده و عدد۸ که  ۲۳۷ شده  ۲۳ می شود.

طبق تصویر پائین ماه های قمری ترتیب خاصی ندارد



19 جولای سال 622  شروع تاریخ قمری است و مصادف با 27 تیر سال یک شمسی 

Dim D(12) As Long

D(1)=30 : D(2)=59 : D(3)=89 : D(4)=118 : D(5)=148  D(6)=177 : D(7)=207 : D(8)=236 : D(9)=266 : D(10)=295 : D(11)=325 : D(12)=354

یک در میان ماه ها ی قمری را بصورت قراردادی 29 مشخص کرده اند یعنی ماه اول که محرم است 30 روز و ماه بعدی 29  و با این منوال ماه های فرد را 30 روز و ماه های زوج را 29 روزه گرفته اند و در صورت کبیسه بودن سال طبق جدول ، روش رایج در گاه شمار قراردادی ماه آخر بجای 29 روزه 30 روزه در نظر خواهند گرفت.


در رایج‌ترین تقویم هجری قمری حسابی طی یک دوره سی ساله کبیسه منظم از قرار زیر محاسبه شده‌است:
بر اساس این کبیسه‌گیری، چنانچه باقی‌ماندهٔ حاصل تقسیم سال قمری به عدد ۳۰ یکی از اعداد (۲، ۵، ۷، ۱۰، ۱۳، ۱۶، ۱۸، ۲۱، ۲۴، ۲۶ و ۲۹) باشد، سال مذکور کبیسه و طول آن (۳۵۵ روزه) می‌باشد.


با کانتر براحتی میتوان تاریخ دقیق را بدست آورد اگر کبیسه دقیق و طبق جدول، روش رایج  ،که اقتباس شده بدست آید ،  ولی در فواصل طولانی حدودا ۳ ثانیه بازگشت بطول خواهد انجامید پس باید دنبال راهی باشید که کمترین زمان برگشتی را داشته باشد.


18 ژانویه سال 624 معادل 27 دی سال 2 ، اختلاف با تابع DateDiff اکسس بین  19 جولای 622 که شروع قمری است  تا تاریخ 18 ژانویه ی 624 موردتبدیل ما 549 روز است  که یک واحد به آن اضافه می کنیم .


در اینجا 550  از 354 بزرگتر است پس  D12 را از آن کم میکنیم میشود 195 و سال هم  بالطبع یک واحد بدان اضافه شده و 2 خواهد شد  ،  طبق آرایه ی بالا 195 بین D6 و D7 است پس کوچکتر از عدد 195 را انتخاب میکنیم  177-195 که میشود 18 ( روز )   و  عدد آرایه ی  177  6 است که آنرا باضافه ی یک می کنیم که ماه عدد 7 می شود


بنابراین سال شد 2 ماه  7 و روز هم 18 


2/4/14  -  6 جولای 623  و  28 ذی الحجه سال  ۱ قمری ، 352

2/4/15  -  7 جولای 623  و  29 ذی الحجه سال  ۱ قمری ، 353

2/4/16  -  8 جولای 623  و  1 محرم سال  2 قمری ، 354

2/4/17  -  9 جولای 623  و  2 محرم سال 2 قمری ، 355



۱۲ تیر سال ۵ شمسی معادل ۴ جولای ۶۲۶ و ۳۰ محرم (۱) سال ۵ . اختلاف ۱۴۴۶ روز 

۷ تیر سال ۵ شمسی معادل ۲۹ جون ۶۲۶ و ۲۵ محرم (۱) سال ۵ . اختلاف ۱۴۴۱


۲۷ تیر سال یک شمسی آغار سال قمری و ۱۹ جولای ۶۲۲ آغاز سال قمری اختلاف ها با DateDiff

                                     

1446=("Dif=DateDiff("n","7/19/622","7/4/626

Ret=Dif=1446+1=1447

 ( If 1447>354 (True

Y=2 Ret=1447-354=1093

 ( If 1093>354 (True

2=Kabiseh Y=3 Ret=1093-355=738

( If 738>354 (True

3=NoKabiseh Y=4 Ret=738-354=384

( If 384>354 (True

4=Nokabiseh Y=5 Ret=384-354=30

(If 30>354 (False

(If Ret=D(1) , M=۰ : Ret=D(1

If Ret<D(1) , M=۰ : Ret=D(1)-Ret

 .   If

  .   If

M=M+1

تا زمانی لوپ ادامه می یابد که Ret کوچکتر مساوی (D(M شود

Ret=30 , M=1

Year : 5  , M : 1 , D : 30 

۳۰ محرم سال ۵


تبلیغات

محل تبلیغات شما

آخرین مطالب

محل تبلیغات شما محل تبلیغات شما

آخرین وبلاگ ها

آخرین جستجو ها

Colleen هوای شرجی _ محمدامین آقایی موویس استارس | Movies Stars لیوان کاغذی ایران(Green bird) نمونه سوالات و جزوات دانشجویی و دانش اموزی زیست شناسی دیزل ژنراتور - قیمت دیزل ژنراتور دکوراسیون زیبا