设为首页收藏本站

 找回密码
 立即注册

只需一步,快速开始

搜索
查看: 149|回复: 3

解决计算1900/01/01以前年龄问题

[复制链接]
累计签到:36 天
连续签到:3 天
灌水成绩
3
209
5209
主题
帖子
积分

等级头衔

ID : 845

助理工程师

积分成就 测量币 : 5209
在线时间 : 0 小时
注册时间 : 2026-2-18
最后登录 : 2026-7-7

勋章
UID勋章测量学徒测量员
发表于 2024-9-21 07:51:00 来自手机 | 显示全部楼层 |阅读模式 IP:香港
Public Function AgeFunc(stdate As Variant, endate As Variant)
    Dim stvar$, stmon$, stday$, styr$
    Dim endvar$, endmon$, endday$
    Dim endyr$, stmonf%, stdayf%
    Dim styrf%, endmonf%, enddayf%
    Dim endyrf%, years%, fx%


    fx = 0
    stvar = sfunc("/", stdate)
    stmon = Left(stdate, sfunc("/", stdate) - 1)
    stday = Mid(stdate, stvar + 1, sfunc("/", stdate, sfunc("/", stdate) + 1) - stvar - 1)
    If Len(stday) = 1 Then fx = fx + 1
    If Len(stmon) = 2 Then fx = fx + 1
    styr = Right(stdate, Len(stdate) - (sfunc("/", stdate) + 1) - stvar + fx)
    stmonf = CInt(stmon)
    stdayf = CInt(stday)
    styrf = CInt(styr)
    If stmonf < 1 Or stmonf > 12 Or stdayf < 1 Or stdayf > 31 Or styrf < 1 Then
        AgeFunc = &quot;Invalid Date&quot;
        Exit Function
    End If


    fx = 0
    endvar = sfunc(&quot;/&quot;, endate)
    endmon = Left(endate, sfunc(&quot;/&quot;, endate) - 1)
    endday = Mid(endate, endvar + 1, sfunc(&quot;/&quot;, endate, sfunc(&quot;/&quot;, endate) + 1) - endvar - 1)
    If Len(endday) = 1 Then fx = fx + 1
    If Len(endmon) = 2 Then fx = fx + 1
    endyr = Right(endate, Len(endate) - (sfunc(&quot;/&quot;, endate) + 1) - endvar + fx)
    endmonf = CInt(endmon)
    enddayf = CInt(endday)
    endyrf = CInt(endyr)
    If endmonf < 1 Or endmonf > 12 Or enddayf < 1 Or enddayf > 31 Or endyrf < 1 Then
        AgeFunc = &quot;Invalid Date&quot;
        Exit Function
    End If


    years = endyrf - styrf
    If stmonf > endmonf Then
        years = years - 1
    End If
If stmonf = endmonf And stdayf > enddayf Then
        years = years - 1
    End If
    If years < 0 Then
        AgeFunc = &quot;Invalid Date&quot;
    Else
        AgeFunc = years
    End If
End Function

Public Function sfunc(x As Variant, y As Variant, Optional z As Variant)
sfunc = Application.WorksheetFunction.Search(x, y, z)
End Function

Sub abc() '使用示例
    Dim startdate, enddate
    startdate = &quot;01/01/1887&quot;
    enddate = &quot;02/02/1945&quot;
    af = AgeFunc(startdate, enddate)
End Sub
累计签到:26 天
连续签到:4 天
灌水成绩
3
204
3461
主题
帖子
积分

等级头衔

ID : 900

助理工程师

积分成就 测量币 : 3461
在线时间 : 0 小时
注册时间 : 2026-1-12
最后登录 : 2026-6-12

勋章
UID勋章测量学徒测量员
发表于 2024-9-21 09:44:00 | 显示全部楼层 IP:香港
大哥,你这是求助还是分享还是炫技还是保存“云盘”啊?友情提示一下,代码即使再优秀,一个字的注释也没有,后期看起来也费劲,倒不如重新敲。
回复

使用道具 举报

累计签到:33 天
连续签到:2 天
灌水成绩
2
182
3960
主题
帖子
积分

等级头衔

ID : 806

助理工程师

积分成就 测量币 : 3960
在线时间 : 0 小时
注册时间 : 2025-10-6
最后登录 : 2026-6-14

勋章
UID勋章测量学徒测量员
发表于 2024-9-21 09:50:00 | 显示全部楼层 IP:香港
做笔记以备份
回复

使用道具 举报

累计签到:30 天
连续签到:4 天
灌水成绩
1
195
3271
主题
帖子
积分

等级头衔

ID : 886

助理工程师

积分成就 测量币 : 3271
在线时间 : 0 小时
注册时间 : 2026-4-19
最后登录 : 2026-7-6

勋章
UID勋章测量学徒测量员
发表于 2026-4-27 09:59:00 | 显示全部楼层 IP:香港
1900以前的日期,都设置不了格式吧?EXCEL只能到1900
回复

使用道具 举报

快速回复换一批
遇见神贴岂能不顶
路过留名
楼主好人一生平安
业界良心! 楼主这波操作太牛了,细节拉满,顶起来让更多人看到! 🌟👏
催更小分队上线! 楼主分析得太透彻了,期待下一篇更新! ⏳🔥
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|精密测量技术论坛 ( 桂ICP备2026007449号-1 )

GMT+8, 2026-7-7 19:38 , Processed in 0.135164 second(s), 45 queries .

Powered by 精密测量技术论坛

© 2025-2026 联系站长

快速回复 返回顶部 返回列表