仅当存在DOB时才计算年龄

时间:2019-04-15 22:38:09

标签: excel vba dob

我有一个正在处理的大文件,需要能够计算人员DOB。我在这里附加了一个示例文件以了解...。但基本上,我要做的是仅在“ DOB”列中存在数据时才能计算“ Age”。

DOB将在每隔一列中列出,最多可容纳18个人(因此,A,C,E .....列)在B,D,F .....列中,我希望知道年龄以年计算。

问题在于,并非总是有18个人的数据,因此只需要计算DOB列中是否存在数据即可。

理想情况下,这将是我打开文件时运行的宏,以便所有年龄段的用户都可以更新。

我该如何做这样的事情?

我希望输出只显示年龄(岁)...。因此,如果DOB是2001年1月1日,年龄将显示为18

1 个答案:

答案 0 :(得分:2)

我将假设VBA过于严格。这对我有用...

=IF(A1="","",ROUNDDOWN(YEARFRAC(A1,NOW()),0))

enter image description here

如果您正在寻找VBA解决方案,则上述公式可直接转换为VBA。相对于您的上下文而言,它还不完整,但这是一个更大的块,如果没有当前的代码,很难将其插入...

Public Sub WriteAgeToCell()
    If Range("A1").Text <> "" Then
        Range("A2") = WorksheetFunction.RoundDown(WorksheetFunction.YearFrac(Range("A1"), Now), 0)
    End If
End Sub

在工作簿对象中使用Workbook_Open()可用于自动重新计算所需的内容。

因此,将它们放在一起,并进行一些折衷,您可以执行以下操作...

Private Sub Workbook_Open()
    Dim objSheet As Worksheet, lngAgeCol As Long, lngEndRow As Long, i As Long
    Dim lngStartRow As Long

    With Range("rngHeaderAge")
        Set objSheet = .Worksheet
        lngAgeCol = .Column
        lngStartRow = .Row + 1
    End With

    lngEndRow = objSheet.Cells.SpecialCells(xlLastCell).Row

    For i = lngStartRow To lngEndRow
        objSheet.Cells(i, lngAgeCol).FormulaR1C1 = "=IF(RC[-1]="""","""",ROUNDDOWN(YEARFRAC(RC[-1],NOW()),0))"
    Next
End Sub

打开工作簿时,它将在标题列下方的行中填充公式,然后,如果在会话期间更改DOB,则年龄将即时更新。

要完成上述工作,您需要做的就是将代码更新到VBA编辑器中的Workbook对象中,并为age列的标题创建一个命名范围,如下所示。

enter image description here