Я собираюсь сделать предположение, что 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 меняются во время сеанса, возраст будет обновляться на лету.
Чтобы все вышеперечисленное работало, все, что вам нужно сделать, это обновить код в объекте Workbook в редакторе VBA и создать именованный диапазон для заголовка столбца age, как показано ниже.