當前位置:編程學習大全網 - 編程語言 - EXCEL公歷轉農歷公式?

EXCEL公歷轉農歷公式?

excel內置函數是無法完美實現的,至少閏月的情況會有問題。

只能考慮用VBA編程的方式,自定義壹個函數。

圖壹:效果展示圖:

效果展示圖

圖二:步驟示意思圖:

步驟示意圖

圖三:完整代碼圖:

步驟:

1、如果文件是.xlsx格式,須另存為 .xlsm格式 即啟用宏的工作簿。

2、按Alt+F11打開代碼編輯器,

3、點“插入”--“模塊”,

4、在左側欄中雙擊模塊,

5、在右側的編輯區中粘貼代碼,

6、檢查代碼是否報錯變紅,

7、關閉代碼編輯器。

重要說明:

說明1、從這裏復制的代碼,行與行之間會被百度額外插入空白行,如果導致代碼報錯變紅,妳就把行與行之間的空白行刪掉即可。

說明2、此代碼也不是萬能的,它有日期範圍的限制,只能轉化 1921年的正月初壹 至 2100年的臘月三十 這個範圍,對應的公歷範圍是 1921/2/8 至 2100/2/8

說明3、在表格中使用公式時,可以直接在公式中寫明壹個日期,也可以引用某單元格中的日期。

例1,轉化具體的日期:

=iNlStr(DATE(2020,8,18))

例2,永遠轉化今天當天的日期:

=iNlStr(TODAY())

例3,從單元格引用日期進行轉化:

=iNlStr(A1)

代碼如下,供君復制:

Option Explicit

Public tf As Boolean '

Public sZhouJ As Variant '星期數組

Public sTiGan As Variant '十個天幹數組

Public sDiZhi As Variant '十二地支數組

Public sSXiao As Variant '十二生肖數組

Public sNlMon As Variant '農歷月份數組

Public sNlDay As Variant '農歷日份數組

Public sNlShu As Variant '農歷數據數組

Sub 加載數組們()

sZhouJ = Split("*/壹/二/三/四/五/六/日", "/") '星期數組

sTiGan = Split("甲/乙/丙/丁/戊/己/庚/辛/壬/癸", "/") '天幹數組

sDiZhi = Split("子/醜/寅/卯/辰/巳/午/未/申/酉/戌/亥", "/") '地支數組

sSXiao = Split("鼠/牛/虎/兔/龍/蛇/馬/羊/猴/雞/狗/豬", "/") '生肖數組

sNlMon = Split("*/正月/二月/三月/四月/五月/六月/七月/八月/九月/十月/冬月/臘月", "/") '月份數組

sNlDay = Split( _

"*/初壹/初二/初三/初四/初五/初六/初七/初八/初九/初十" _

& "/十壹/十二/十三/十四/十五/十六/十七/十八/十九/二十" _

& "/廿壹/廿二/廿三/廿四/廿五/廿六/廿七/廿八/廿九/三十", "/") '日份數組

sNlShu = Split( _

"002635/333387/001701/001748/267701/000694/002391/133423/001175/396438/" & _

"003402/003749/331177/001453/000694/201326/002350/465197/003221/003402/" & _

"400202/002901/001386/267611/000605/002349/137515/002709/464533/001738/" & _

"002901/330421/001242/002651/199255/001323/529706/003733/001706/398762/" & _

"002741/001206/267438/002647/001318/204070/003477/461653/001386/002413/" & _

"330077/001197/002637/268877/003365/531109/002900/002922/398042/002395/" & _

"001179/267415/002635/661067/001701/001748/398772/002742/002391/330031/" & _

"001175/001611/200010/003749/527717/001452/002742/332397/002350/003222/" & _

"268949/003402/003493/133973/001386/464219/000605/002349/334123/002709/" & _

"002890/267946/002773/592565/001210/002651/395863/001323/002707/265877/" & _

"001706/002773/133557/001206/397998/002638/003366/335142/003411/001450/" & _

"200042/002413/723293/001197/002637/399947/003365/003410/334676/002906/" & _

"001389/133467/001179/464023/002635/002725/333477/001746/002778/199350/" & _

"002359/526639/001175/001611/396618/003749/001714/267628/002734/002350/" & _

"203054/003222/465557/003402/003493/330581/001386/002669/264797/001325/" & _

"529707/002709/002890/399018/002773/001370/267450/002651/001323/202023/" & _

"001683/462419/001706/002773/330165/001206/002647/264782/003366/531750/" & _

"003410/003498/396650/001389/001198/267421/002637/003349/138021", "/") '農歷數據

tf = True '打標記,數組已加載

End Sub

Function iNlStr(iDate As Date) As String '公歷轉農歷

If Not tf Then Call 加載數組們

Dim i%, t&, k%, m%, n%, ext%, bit&

'計算從1921-2-8(即1921年的正月初壹)至目標日期的總天數

t = iDate - #2/8/1921# + 1

'計算農歷年月日的數值

Do

If Val(sNlShu(m)) < 4095 Then k = 11 Else k = 12

n = k

Do

'獲取sNlShu(m)的第n個二進制位的值

bit = Val(sNlShu(m))

For i = 1 To n

bit = bit \ 2

Next

bit = bit Mod 2

'計算農歷天的數值

If t <= 29 + bit Then

ext = 1

Exit Do

End If

t = t - 29 - bit

n = n - 1

Loop Until n < 0

If ext Then Exit Do

m = m + 1

Loop Until False

'計算農歷三個數值

Dim cy%, cm%, cd%

cy = 1921 + m? '農歷年的數值

cm = k - n + 1 '農歷月的數值

cd = t ?'農歷日的數值

If k = 12 Then

Select Case Val(sNlShu(m)) \ 65536 + 1 '修正cm的數值

Case Is = cm

cm = 1 - cm

Case Is < cm

cm = cm - 1

End Select

End If

'計算漢化文本

Dim ar(1 To 5) As String

m = ((cy - 4) Mod 60) Mod 10 '天幹索引值

n = ((cy - 4) Mod 60) Mod 12 '地支和生肖索引值

If cm < 1 Then ar(1) = "閏"

ar(1) = ar(1) & sNlMon(Abs(cm)) '農歷月份

ar(2) = sNlDay(cd) '農歷日份

ar(3) = sTiGan(m) & sDiZhi(n) ?'農歷幹支

ar(4) = sSXiao(n) ?'農歷生肖

ar(5) = sZhouJ(Weekday(iDate, 2)) '星期漢字

'搭配輸出結果(提示:數組ar(1 to 5)***5個元素,可根據需要自由搭配輸出結果)

iNlStr = ar(3) & "年 生肖" & ar(4) & " " & ar(1) & ar(2) & " 周" & ar(5) '輸出結果

End Function

  • 上一篇:鬼谷算法的基本介紹
  • 下一篇:有哪6種人不適合學習java
  • copyright 2024編程學習大全網