1、 如何在excel中实现阳历转化阴历 ———————————————————————————————— 作者: ———————————————————————————————— 日期: 10 个人收集整理 勿做商业用途 步骤一
2、在Excel工作表界面下按<ALT+F11>组合键翻开VBA窗口,进入VBA编辑环境,在其窗口的菜单栏上依次单击“插入〞→“模块〞,可在当前VBA工程中插入模块,并直接进入此模块的代码编辑区域。可在此编辑区域中输入自定义函数的程序代码,如图: Public Function NongLi(Optional XX_DATE As Date) Dim MonthAdd(11), NongliData〔99), TianGan〔9〕, DiZhi〔11), ShuXiang(11), DayName(30), MonName(12) Dim curTime, curYear, cur
3、Month, curDay Dim GongliStr, NongliStr, NongliDayStr Dim i, m, n, k, isEnd, bit, TheDate ﻫ'获取当前系统时间 curTime = XX_DATE '天干名称 TianGan(0〕 = "甲" ﻫTianGan(1) = "乙" TianGan(2) = "丙" TianGan〔3) = "丁" TianGan〔4〕 = "戊" TianGan〔5) = "己" TianGan〔6) = "庚" ﻫTianGan(7) = "辛" ﻫTianGan(8) =
4、"壬" ﻫTianGan(9〕 = "癸" '地支名称 DiZhi〔0〕 = "子" DiZhi(1) = "丑" DiZhi(2〕 = "寅" DiZhi(3) = "卯" ﻫDiZhi(4) = "辰" DiZhi〔5〕 = "巳" DiZhi〔6) = "午" ﻫDiZhi(7〕 = "未" ﻫDiZhi(8) = "申" DiZhi(9〕 = "酉" ﻫDiZhi(10) = "戌" ﻫDiZhi〔11) = "亥" ﻫ'属相名称 ShuXiang〔0) = "鼠" ﻫShuXiang(1〕 = "牛" ﻫShuXiang(2) = "虎" ﻫShu
5、Xiang(3〕 = "兔" ShuXiang(4) = "龙" ﻫShuXiang〔5) = "蛇" ﻫShuXiang(6) = "马" ﻫShuXiang(7) = "羊" ShuXiang(8) = "猴" ShuXiang(9〕 = "鸡" ﻫShuXiang(10) = "狗" ﻫShuXiang(11) = "猪" '农历日期名 DayName(0) = "*" DayName(1) = "初一" ﻫDayName(2) = "初二" DayName〔3) = "初三" ﻫDayName(4) = "初四" ﻫDayName(5) = "初五" ﻫDa
6、yName〔6〕 = "初六" ﻫDayName(7) = "初七" DayName(8) = "初八" ﻫDayName〔9) = "初九" ﻫDayName(10) = "初十" ﻫDayName(11) = "十一" ﻫDayName(12) = "十二" DayName(13) = "十三" ﻫDayName〔14〕 = "十四" ﻫDayName(15〕 = "十五" ﻫDayName〔16) = "十六" ﻫDayName(17) = "十七" DayName(18) = "十八" ﻫDayName(19) = "十九" ﻫDayName(20) = "二十" ﻫDay
7、Name(21〕 = "廿一" ﻫDayName〔22) = "廿二" ﻫDayName(23〕 = "廿三" ﻫDayName〔24) = "廿四" ﻫDayName(25) = "廿五" ﻫDayName(26) = "廿六" ﻫDayName〔27) = "廿七" DayName(28) = "廿八" DayName〔29〕 = "廿九" DayName〔30) = "三十" '农历月份名 ﻫMonName〔0) = "*" ﻫMonName(1〕 = "正" ﻫMonName(2) = "二" ﻫMonName(3) = "三" ﻫMonName(4) = "四" ﻫM
8、onName(5) = "五" MonName(6) = "六" ﻫMonName(7) = "七" ﻫMonName〔8) = "八" ﻫMonName(9) = "九" MonName(10) = "十" MonName〔11) = "十一" MonName(12) = "腊" ﻫ'公历每月前面的天数 MonthAdd〔0〕 = 0 ﻫMonthAdd〔1) = 31 MonthAdd(2) = 59 ﻫMonthAdd(3〕 = 90 ﻫMonthAdd〔4) = 120 ﻫMonthAdd(5) = 151 ﻫMonthAdd(6) = 181 ﻫMonthAd
9、d(7) = 212 MonthAdd(8) = 243 ﻫMonthAdd(9) = 273 MonthAdd〔10) = 304 MonthAdd(11) = 334 ﻫ'农历数据 NongliData(0) = 2635 NongliData(1) = 333387 NongliData(2〕 = 1701 ﻫNongliData(3) = 1748 NongliData(4) = 267701 NongliData(5) = 694 NongliData(6) = 2391 ﻫNongliData(7) = 133423 ﻫNongliData(8〕
10、 = 1175 NongliData(9) = 396438 ﻫNongliData(10) = 3402 NongliData(11) = 3749 ﻫNongliData(12) = 331177 NongliData〔13) = 1453 ﻫNongliData(14) = 694 NongliData(15) = 202126 ﻫNongliData(16) = 2350 ﻫNongliData〔17〕 = 465197 ﻫNongliData〔18) = 3221 ﻫNongliData(19) = 3402 ﻫNongliData〔20) = 400202 No
11、ngliData(21〕 = 2901 NongliData(22〕 = 1386 NongliData(23) = 267611 ﻫNongliData(24) = 605 ﻫNongliData(25) = 2349 NongliData(26〕 = 137515 NongliData(27) = 2709 ﻫNongliData(28〕 = 464533 NongliData(29) = 1738 NongliData(30) = 2901 ﻫNongliData(31〕 = 330421 ﻫNongliData(32) = 1242 ﻫNongliData(33
12、) = 2651 NongliData(34) = 199255 ﻫNongliData〔35) = 1323 NongliData(36) = 529706 NongliData(37) = 3733 ﻫNongliData(38) = 1706 ﻫNongliData〔39) = 398762 NongliData(40) = 2741 ﻫNongliData〔41) = 1206 ﻫNongliData(42) = 267438 ﻫNongliData(43) = 2647 ﻫNongliData(44〕 = 1318 NongliData(45) = 204070
13、ﻫNongliData(46) = 3477 ﻫNongliData(47〕 = 461653 NongliData(48) = 1386 NongliData(49) = 2413 NongliData(50) = 330077 ﻫNongliData(51) = 1197 ﻫNongliData(52) = 2637 ﻫNongliData(53) = 268877 NongliData(54〕 = 3365 ﻫNongliData(55) = 531109 ﻫNongliData(56) = 2900 NongliData(57〕 = 2922 NongliDat
14、a(58) = 398042 ﻫNongliData(59) = 2395 ﻫNongliData(60) = 1179 ﻫNongliData〔61) = 267415 NongliData(62) = 2635 NongliData(63) = 661067 ﻫNongliData(64〕 = 1701 ﻫNongliData(65) = 1748 NongliData〔66) = 398772 ﻫNongliData(67) = 2742 ﻫNongliData(68) = 2391 ﻫNongliData〔69) = 330031 ﻫNongliData(70) = 117
15、5 ﻫNongliData(71〕 = 1611 ﻫNongliData(72〕 = 200010 ﻫNongliData〔73) = 3749 ﻫNongliData(74) = 527717 ﻫNongliData(75) = 1452 ﻫNongliData(76) = 2742 NongliData〔77〕 = 332397 NongliData(78〕 = 2350 NongliData〔79) = 3222 NongliData〔80) = 268949 ﻫNongliData(81〕 = 3402 NongliData(82) = 3493 ﻫNongliDa
16、ta(83) = 133973 NongliData〔84〕 = 1386 ﻫNongliData(85) = 464219 NongliData(86) = 605 NongliData(87〕 = 2349 NongliData(88) = 334123 NongliData(89) = 2709 NongliData(90) = 2890 NongliData(91) = 267946 ﻫNongliData(92) = 2773 NongliData(93〕 = 592565 NongliData(94〕 = 1210 ﻫNongliData〔95)
17、 = 2651 ﻫNongliData(96) = 395863 NongliData〔97) = 1323 NongliData〔98) = 2707 NongliData〔99) = 265877 ﻫ'生成当前公历年、月、日 ==> GongliStr curYear = Year(curTime) ﻫcurMonth = Month(curTime) ﻫcurDay = Day〔curTime) GongliStr = curYear & "年" ﻫIf (curMonth < 10〕 Then GongliStr = GongliStr & "0" & curM
18、onth & "月" Else ﻫGongliStr = GongliStr & curMonth & "月" End If ﻫIf (curDay < 10〕 Then ﻫGongliStr = GongliStr & "0" & curDay & "日" Else GongliStr = GongliStr & curDay & "日" End If ﻫ'计算到初始时间1921年2月8日的天数:1921-2-8(正月初一) TheDate = (curYear - 1921) * 365 + Int〔〔curYear - 1921) / 4〕 + curDay +
19、MonthAdd〔curMonth - 1) - 38 If 〔(curYear Mod 4) = 0 And curMonth > 2) Then TheDate = TheDate + 1 End If '计算农历天干、地支、月、日 isEnd = 0 ﻫm = 0 ﻫDo ﻫIf (NongliData〔m) < 4095〕 Then k = 11 ﻫElse k = 12 End If ﻫn = k Do If 〔n < 0〕 Then Exit Do ﻫEnd If ﻫ'获取NongliData(m)的第n个二进制位的值 ﻫbit = No
20、ngliData(m) For i = 1 To n Step 1 bit = Int(bit / 2) ﻫNext ﻫbit = bit Mod 2 ﻫIf (TheDate <= 29 + bit〕 Then ﻫisEnd = 1 Exit Do ﻫEnd If TheDate = TheDate - 29 - bit n = n - 1 Loop If (isEnd = 1) Then Exit Do ﻫEnd If m = m + 1 ﻫLoop ﻫcurYear = 1921 + m curMonth = k - n + 1 curDay
21、 TheDate ﻫIf (k = 12〕 Then If 〔curMonth = (Int(NongliData(m) / 65536) + 1〕) Then curMonth = 1 - curMonth ElseIf (curMonth > (Int(NongliData(m) / 65536) + 1)〕 Then curMonth = curMonth - 1 ﻫEnd If End If ﻫ'生成农历天干、地支、属相 ==> NongliStr NongliStr = "农历" & TianGan(((curYear - 4) Mod 60〕 Mod 10
22、) & DiZhi(((curYear - 4) Mod 60) Mod 12) & "年" NongliStr = NongliStr & "(" & ShuXiang〔((curYear - 4) Mod 60) Mod 12) & ")" '生成农历月、日 ==> NongliDayStr If (curMonth < 1) Then ﻫNongliDayStr = "闰" & MonName〔-1 * curMonth〕 Else NongliDayStr = MonName(curMonth) End If NongliDayStr = NongliDay
23、Str & "月" ﻫNongliDayStr = NongliDayStr & DayName〔curDay) ﻫNongLi = NongliStr & NongliDayStr End Function 步骤2,单击窗口右上角的“关闭〞按钮关闭VBA编辑窗口,返回到工作表窗口中。此时即可在当前工作簿中使用刚刚创立的自定义函数,并且可以在函数列表的“用户定义〞类别中找到此自定义函数。如图 步骤3,要使自定义函数能够应用在其他工作簿中,需要将这个包含自定义函数的工作簿另存为“加载宏〞。依次单击“Office按钮〞→“另存为〞→“其他格式〞,翻开“另存为〞对话框,在“保存类型〞下拉列表中选择“Excel 加载宏〞,然后为此加载宏命名后单击“保存〞按钮进展保存。 ﻫﻫ 步骤4,保存后需要在加载项中添加加载宏。单击“Office按钮〞→“Excel选项〞,翻开“Excel选项〞对话框,在左侧类别中选择“加载项〞,然后在右侧下方的“管理〞下拉列表中选择“Excel 加载项〞,再单击“转到〞按钮,翻开“加载宏〞对话框,在其中勾选之前所保存的包含自定义函数的加载宏前面的复选框,最后单击“确定〞即可完成加载项的添加。 步骤五,做好阳历列后,在另外一列选择插入自定义函数,确定,然后大功告成。






