Рассчитать возраст ТОЛЬКО, если присутствует DOB - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть большой файл, над которым я работаю, и мне нужно иметь возможность подсчитать DOB людей.Я приложил образец файла здесь, чтобы получить представление .... но в основном я хочу сделать ТОЛЬКО если данные существуют в столбце "DOB", для расчета "возраста".

DOBбудет отображаться в каждом другом столбце для 18 различных людей (поэтому столбец A, C, E .....). В столбцах B, D, F ..... я рассчитываю, что возраст будет рассчитываться в годах,

Суть в том, что не всегда будут данные для 18 человек, так что это то, что нужно будет только рассчитать, если данные представлены в столбце DOB.

В идеале это будетмакрос, который я запускаю, когда открываю файл, чтобы можно было обновлять все возрасты.

Как мне вообще делать что-то подобное?

Я ожидаю, что на выходе будет просто отображаться возраств годах .... так что, если DOB был 01/01/2001 - возраст будет отображаться как 18

1 Ответ

2 голосов
/ 16 апреля 2019

Я собираюсь сделать предположение, что 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 меняются во время сеанса, возраст будет обновляться на лету.

Чтобы все вышеперечисленное работало, все, что вам нужно сделать, это обновить код в объекте Workbook в редакторе VBA и создать именованный диапазон для заголовка столбца age, как показано ниже.

enter image description here

...