【问题标题】:Calculate age ONLY if DOB is present仅当 DOB 存在时才计算年龄
【发布时间】:2019-04-15 22:38:09
【问题描述】:

我有一个正在处理的大文件,需要能够计算人们的出生日期。我在这里附上了一个示例文件以获得一个想法....但基本上我要做的是仅当“DOB”列中存在数据时,才能计算“年龄”。

DOB 将在每隔一列列出最多 18 个不同的人(所以列 A、C、E .....)在列 B、D、F ......我希望有年龄以年计算。

问题是,不会总是有 18 人的数据,所以这仅需要计算 DOB 列中是否存在数据。

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

我该怎么做这样的事情?

我希望输出只显示年龄......所以如果 DOB 是 01/01/2001 - 年龄将显示为 18

【问题讨论】:

  • 你有什么理由不只使用公式吗?
  • 我没有看到你提到的附件。
  • 如果您尝试使用 VBA,发布您尝试过的代码并描述您遇到的确切问题总是很有用的。
  • VBA 对此可能是矫枉过正。一个简单的公式就可以了,所以如果起始单元格是 A2,那么 IF(OFFSET(A2,0,1) <> "",DAYS(TODAY(),OFFSET(A2,0,1)) / 365, "") 也可以改进

标签: excel vba date


【解决方案1】:

我将假设 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 对象中使用 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 对象中,并针对年龄列的标题创建一个命名范围,如下所示。

【讨论】:

  • 不想使用公式,因为我担心文件的用户会破坏它....此外,它是一个文件,将有一个用户表单在其上输入信息,因此数据将不断获取更长。
  • @MarkFisher,关于用户表单的信息对这个问题很重要,所以我建议添加它。除此之外,我想我的问题是,如果你有人(也许是你自己)开发了一个用户表单,那么他们肯定知道如何做你要问的事情吗?您正在组合的解决方案的其余部分必须比这个问题直接想要的更复杂。我不是要求您接受答案,而是公式或 VBA,存在逻辑并且可以在 VBA 解决方案中使用确切的逻辑。我已经更新了我的答案,但对你来说可能还不够完整。
  • 如果您担心用户弄乱了公式,只需应用工作表保护和密码保护有问题的单元格(在确保其他场所可以访问密码之后,如果您赢得了抽签并搬到特立尼达,文件不会被顶起)。
  • @Skin,上面的 VBA 非常适合计算我需要做什么。不幸的是,我无法在此处发布工作表的屏幕截图...唯一需要的更新是此 VBA 需要运行一个名为“Age 1, Age 2, Age 3”的整个列,如果仅当“DOB 1、DOB 2、DOB 3、DOB 4 等”列中列出了一个日期,该怎么做?如果有帮助,年龄将始终位于出生日期右侧的 1 列?
  • @MarkFisher,答案更新为“妥协”。我给你的 VBA 将填写一个公式,而不是计算和坚持。这是一个更好的方法。如果您还没有,请随时支持我的答案。 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 2014-05-30
  • 1970-01-01
  • 2023-03-10
  • 2021-10-08
相关资源
最近更新 更多