excel里如何得到当天的农历日期?

网上有个公式是:先在a1里用=today()得出今天的阳历日期,再用=TEXT(A1,"[$-130000]yyyy年m月"&IF(LEN(--TEXT(A1,"[$-1... 网上有个公式是:先在a1里用=today()得出今天的阳历日期,再用=TEXT(A1,"[$-130000]yyyy年m月"&IF(LEN(--TEXT(A1,"[$-130000]dd"))=1,"初","")&"d")算成今天的农历日期。
请问,如何不借助a1,而直接得到当天的农历呢?

我试过把公式里的a1 换成 todya()不行,请问应该怎样写?
展开
 我来答
【名臣】f2
推荐于2021-02-26 · TA获得超过1916个赞
知道大有可为答主
回答量:1594
采纳率:0%
帮助的人:1661万
展开全部

'函数作用: 阴阳历转换和阴阳历生日

'    说    明:适用于1901-2100年间

'    示    例:=lunar("2006-11-1")  求阳历2006-11-1日对应的阴历

'             =solar("2006-1-1")    求阴历2006年正月初一对应的阳历

'             =lunarbirth("1975-5-6")  阴历生日:阳历1975年5月6日出生,今年阴历生日时对应的阳历日期

'             =solarbirth("1975-5-6")   阳历生日:阳历1975年5月6日出生,今年阳历生日时对应的阳历日期



Type ConvDataA
    leapmonth As Integer
    Month(1 To 13) As Integer
    sp_month As Integer 'Solar month of Spring Festival
    sp_day As Integer 'Solar day   of Spring Festival
End Type

Private Function LunarData(q_year) As ConvDataA
    Dim d As Long
    Dim Month(1 To 13) As Integer
    '1901-2100
    LunarCal = Array(&H4AE53, &HA5748, &H5526BD, &HD2650, &HD9544, &H46AAB9, &H56A4D, &H9AD42, &H24AEB6, &H4AE4A, _
               &H6A4DBE, &HA4D52, &HD2546, &H5D52BA, &HB544E, &HD6A43, &H296D37, &H95B4B, &H749BC1, &H49754, _
               &HA4B48, &H5B25BC, &H6A550, &H6D445, &H4ADAB8, &H2B64D, &H95742, &H2497B7, &H4974A, &H664B3E, _
               &HD4A51, &HEA546, &H56D4BA, &H5AD4E, &H2B644, &H393738, &H92E4B, &H7C96BF, &HC9553, &HD4A48, _
               &H6DA53B, &HB554F, &H56A45, &H4AADB9, &H25D4D, &H92D42, &H2C95B6, &HA954A, &H7B4ABD, &H6CA51, _
               &HB5546, &H555ABB, &H4DA4E, &HA5B43, &H352BB8, &H52B4C, &H8A953F, &HE9552, &H6AA48, &H7AD53C, _
               &HAB54F, &H4B645, &H4A5739, &HA574D, &H52642, &H3E9335, &HD9549, &H75AABE, &H56A51, &H96D46, _
               &H54AEBB, &H4AD4F, &HA4D43, &H4D26B7, &HD254B, &H8D52BF, &HB5452, &HB6A47, &H696D3C, &H95B50, _
               &H49B45, &H4A4BB9, &HA4B4D, &HAB25C2, &H6A554, &H6D449, &H6ADA3D, &HAB651, &H93746, &H5497BB, _
               &H4974F, &H64B44, &H36A537, &HEA54A, &H86B2BF, &H5AC53, &HAB647, &H5936BC, &H92E50, &HC9645, _
               &H4D4AB8, &HD4A4C, &HDA541, &H25AA36, &H56A49, &H7AADBD, &H25D52, &H92D47, &H5C95BA, &HA954E, _
               &HB4A43, &H4B5537, &HAD54A, &H955ABF, &H4BA53, &HA5B48, &H652BBC, &H52B50, &HA9345, &H474AB9, _
               &H6AA4C, &HAD541, &H24DAB6, &H4B64A, &H69573D, &HA4E51, &HD2646, &H5E933A, &HD534D, &H5AA43, _
               &H36B537, &H96D4B, &HB4AEBF, &H4AD53, &HA4D48, &H6D25BC, &HD254F, &HD5244, &H5DAA38, &HB5A4C, _
               &H56D41, &H24ADB6, &H49B4A, &H7A4BBE, &HA4B51, &HAA546, &H5B52BA, &H6D24E, &HADA42, &H355B37, _
               &H9374B, &H8497C1, &H49753, &H64B48, &H66A53C, &HEA54F, &H6B244, &H4AB638, &HAAE4C, &H92E42, _
               &H3C9735, &HC9649, &H7D4ABD, &HD4A51, &HDA545, &H55AABA, &H56A4E, &HA6D43, &H452EB7, &H52D4B, _
               &H8A95BF, &HA9553, &HB4A47, &H6B553B, &HAD54F, &H55A45, &H4A5D38, &HA5B4C, &H52B42, &H3A93B6, _
               &H69349, &H7729BD, &H6AA51, &HAD546, &H54DABA, &H4B64E, &HA5743, &H452738, &HD264A, &H8E933E, _
               &HD5252, &HDAA47, &H66B53B, &H56D4F, &H4AE45, &H4A4EB9, &HA4D4C, &HD1541, &H2D92B5, &HD5349)
    startyear = 1901
    ng = LunarCal(q_year - startyear)
    d = &H100000
    LunarData.leapmonth = Int(ng / d)
    ng = ng Mod d
    d = &H80
    mdata = Int(ng / d)
    ng = ng Mod d
    d = &H20
    LunarData.sp_month = Int(ng / d)
    LunarData.sp_day = ng Mod d
    d = &H1000
    i = 1
    Do
        LunarData.Month(i) = 29 + Int(mdata / d)
        mdata = mdata Mod d
        If d = 1 Then Exit Do
        d = d / 2
        i = i + 1
    Loop
    If LunarData.leapmonth = 0 Then LunarData.Month(i) = 0
End Function

Function lunar(Solar_date As Date, Optional Part As Integer = 0) As String
    'Part = 0, all; Part = 1, lunar year; Part = 2, lunar month; Part = 3, lunar day
    Dim a As ConvDataA
    l_year = Year(Solar_date)
    a = LunarData(l_year)
    sp_date = DateSerial(l_year, a.sp_month, a.sp_day)
    If sp_date > Solar_date Then
        l_year = l_year - 1
        a = LunarData(l_year)
        sp_date = DateSerial(l_year, a.sp_month, a.sp_day)
    End If
    l_day = Solar_date - sp_date
    l_month = 1
    IS_lunar_leapmonth = False
    y = a.Month(l_month)
    Do While l_day >= y
        l_day = l_day - y
        If l_month = a.leapmonth Then IS_lunar_leapmonth = (Not IS_lunar_leapmonth)
        If IS_lunar_leapmonth Then
            y = a.Month(13)
        Else
            l_month = l_month + 1
            y = a.Month(l_month)
        End If
    Loop
    l_day = l_day + 1
    lunar = l_year & "-" & l_month & "-" & l_day
    If IS_lunar_leapmonth Then lunar = lunar & "-L"
    lunar = Choose(Part + 1, lunar, l_year, l_month, l_day)
End Function

Function solar(Lunar_date, Optional IS_lunar_leapmonth As Integer = 0) As String
    'IS_lunar_leapmonth = 0, No leap month; IS_lunar_leapmonth = 1, is leap month
    Dim a As ConvDataA
    Lunar_date = Split(Lunar_date, "-")
    s_year = Lunar_date(0)
    For Each C In Lunar_date
        If C = "L" Then IS_lunar_leapmonth = 1
    Next
    a = LunarData(s_year)
    sp_date = DateSerial(s_year, a.sp_month, a.sp_day)
    If Lunar_date(1) <> a.leapmonth Then IS_lunar_leapmonth = 0
    x = Lunar_date(2)
    tm = Lunar_date(1) + IS_lunar_leapmonth - 1
    For i = 1 To tm
        x = x + a.Month(i)
        If i = a.leapmonth And IS_lunar_leapmonth = 0 Then
            x = x + a.Month(13)
        End If
    Next
    s_date = sp_date + x - 1
    solar = s_date
End Function

Function lunarbirth(Solar_birthday As Date, Optional Inquire_year As Integer) As String
    If Inquire_year = 0 Then
        Inquire_year = Left(lunar(Now), 4)
        lunarbirth = solar(Inquire_year & Mid(lunar(Solar_birthday), 5, 10))
        If CDate(lunarbirth) < Now - 1 Then Inquire_year = Inquire_year + 1
    End If
    lunarbirth = solar(Inquire_year & Mid(lunar(Solar_birthday), 5, 10))
End Function

Function solarbirth(Solar_birthday As Date, Optional Inquire_year As Integer) As String
    If Inquire_year = 0 Then
        Inquire_year = Year(Now)
        solarbirth = DateSerial(Inquire_year, Month(Solar_birthday), Day(Solar_birthday))
        If CDate(solarbirth) < Now - 1 Then Inquire_year = Inquire_year + 1
    End If
    solarbirth = DateSerial(Inquire_year, Month(Solar_birthday), Day(Solar_birthday))
End Function
凌文元LWY
高粉答主

2013-11-30 · 每个回答都超有意思的
知道大有可为答主
回答量:3.6万
采纳率:76%
帮助的人:1.6亿
展开全部

经验证,公式中的a1换成today()是可行的,公式里有两个a1,记得都得更换,TODAY后的括号中间没有空格。

输入=TEXT(TODAY(),"[$-130000]yyyy年m月"&IF(LEN(--TEXT(TODAY(),"[$-130000]dd"))=1,"初","")&"d")  得到今天的农历日期。

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
fyyshf
2017-11-02 · 超过12用户采纳过TA的回答
知道答主
回答量:23
采纳率:0%
帮助的人:23万
展开全部

测试这个函数(以及“[$-130000]”格式)已经出现错误,因为没有考虑到农历2017年闰六月、农历2017年八月三十日,现在的月份会比农历大一个月左右,可能还有其他错误,无法用一般公式修正。这个问题同时出现在2010和2016版的excel中,应该是2017年开始微软没有跟进农历内置公式的修正。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式