我有一个正在处理的大文件,需要能够计算人员DOB。我在这里附加了一个示例文件以了解...。但基本上,我要做的是仅在“ DOB”列中存在数据时才能计算“ Age”。
DOB将在每隔一列中列出,最多可容纳18个人(因此,A,C,E .....列)在B,D,F .....列中,我希望知道年龄以年计算。
问题在于,并非总是有18个人的数据,因此只需要计算DOB列中是否存在数据即可。
理想情况下,这将是我打开文件时运行的宏,以便所有年龄段的用户都可以更新。
我该如何做这样的事情?
我希望输出只显示年龄(岁)...。因此,如果DOB是2001年1月1日,年龄将显示为18
答案 0 :(得分:2)
我将假设VBA过于严格。这对我有用...
=IF(A1="","",ROUNDDOWN(YEARFRAC(A1,NOW()),0))
如果您正在寻找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列的标题创建一个命名范围,如下所示。