由于公式,缓慢的床单和崩溃

时间:2016-01-08 10:32:16

标签: excel excel-vba excel-formula vba

我在Excel中有一张表,它实际上是一种包含其中人员的数据库。因为我需要有他们的实时年龄,我有一个计算这个的公式。

=IF(I2="";"";IF(MONTH(DATE())>MONTH(I2),YEAR(DATE())-YEAR(I2),
IF(AND(MONTH(DATE())=MONTH(I2),DAY(DATE())>=DAY(I2)),
YEAR(DATE())-YEAR(I2),(YEAR(DATE())-YEAR(I2))-1)))

您可以想象这是一个相对较慢的代码。因为每天都会添加多个人,所以我需要为完整的专栏提供此代码。这是如此密集,以至于我的工作电脑上的擅长崩溃(没有多少内存),我在该表上所做的一切都变慢了。

解决这个问题的最佳方法是什么?我认为每次不进行DATE()计算可能会有所帮助,所以我把它放在另一个单元格中并且每次引用该单元格,但它只会变得更糟。


修改

我的表单格式:

I2-I10:08-01-1994(出生日期)P2-P1048576:公式(将返回22)

列A包含具有文本/字符串数据值的单元格,列B具有默认值

尽管它是荷兰语,但希望这会让它更加清晰:

Example

3 个答案:

答案 0 :(得分:0)

试试这个:

  • =DATEDIF(A1,TODAY(),"Y")这将返回单元格A1中指定日期的年数。 。
  • =DATEDIF(A1,TODAY(),"M")这将返回单元格A1中指定日期的月数。
  • =DATEDIF(A1,TODAY(),"D")这将返回单元格A1中指定日期的天数。

希望得到这个帮助。

答案 1 :(得分:0)

也许有些VBA会在这种情况下工作。测试一下,删除P列中的公式,然后运行此代码,它遍历第一列并将差异放在P列中

Sub DteDif()
    Dim Rws As Long, rng As Range, c As Range
    Dim d As Date

    d = Now
    Rws = Cells(Rows.Count, "I").End(xlUp).Row
    Set rng = Range("I2:I" & Rws)
    Application.ScreenUpdating = 0

    For Each c In rng.Cells
        c.Offset(, 7) = Int(DateDiff("d", c, d) / 365.25)
    Next c

End Sub

答案 2 :(得分:0)

似乎以下是最简单,快速和精确的解决方案。如果你不这么认为,我会很高兴听到它。

Private Sub Workbook_Open()

i = 2

While Sheets("shtData").Cells(i, 1) <> ""
    If Month(Date) > Month(CDate(Sheets("shtData").Cells(i, kolGD))) Then
        Sheets("shtData").Cells(i, kolLT) = Year(Date) - Year(CDate(Sheets("shtData").Cells(i, kolGD)))
    Else
        If Month(Date) = Month(CDate(Sheets("shtData").Cells(i, kolGD))) And Day(Date) >= Day(CDate(Sheets("shtData").Cells(i, kolGD))) Then
            Sheets("shtData").Cells(i, kolLT) = Year(Date) - Year(CDate(Sheets("shtData").Cells(i, kolGD)))
        Else
            Sheets("shtData").Cells(i, kolLT) = Year(Date) - Year(CDate(Sheets("shtData").Cells(i, kolGD))) - 1
        End If
    End If
    i = i + 1
Wend

End Sub