设为首页收藏本站

 找回密码
 立即注册

只需一步,快速开始

搜索
查看: 120|回复: 3

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

[复制链接]
累计签到:18 天
连续签到:11 天
灌水成绩
2
158
2551
主题
帖子
积分

等级头衔

ID : 845

初级技术员

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

勋章
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
累计签到:16 天
连续签到:1 天
灌水成绩
3
171
1876
主题
帖子
积分

等级头衔

ID : 900

测量学徒

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

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

使用道具 举报

累计签到:21 天
连续签到:1 天
灌水成绩
2
155
2462
主题
帖子
积分

等级头衔

ID : 806

初级技术员

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

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

使用道具 举报

累计签到:18 天
连续签到:3 天
灌水成绩
1
159
2172
主题
帖子
积分

等级头衔

ID : 886

初级技术员

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

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

使用道具 举报

快速回复换一批
好贴支持!
感谢楼主,好人一生平安
顶顶顶
强无敌
马克一下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-5-23 11:04 , Processed in 0.104779 second(s), 35 queries .

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