Jim需要在每个月的14/15(午夜15:00:00)午夜将特定单元格中的日期提前一个月,他想知道如何实现。

与Excel中的许多问题一样,答案取决于所涉及数据的性质以及您要执行的操作。如果该单元格中的日期是今天的日期,而您只想让该单元格显示直到14日的当前月份,然后再显示下个月,则可以使用如下公式:

=CHOOSE(IF(DAY(NOW())>14,MONTH(NOW())+1,MONTH(NOW())), "January","February","March","April","May","June", "July","August","September","October","November", "December","January")

此公式返回月份的名称,而不是日期。如果您希望返回日期,则可以使用以下公式:

=IF(DAY(NOW())>14,DATEVALUE(IF(MONTH(NOW())=12,1, MONTH(NOW())+1) & "/" & DAY(NOW()) & "/" & IF(MONTH( NOW())=12,YEAR(NOW())+1,YEAR(NOW()))),NOW())

当您从12月前进到1月时,这两个公式都说明了“年终折算”。如果使用DATE函数而不是DATEVALUE函数,则可以创建此最后一个公式的简短版本:

=DATE(YEAR(NOW()),MONTH(NOW())+((DAY(NOW())>14)*1),1)

与DATEVALUE示例不同,此公式始终返回一个日期,该日期是任何给定月份的第一天。

如果您确实想提前某个单元格中特定日期的值,则必须使用宏来执行任务。此外,您必须确保该宏每月仅在特定日期的特定时间运行一次。例如,如果您希望宏在每月15日的00:00:00运行,则需要设置宏,以便它检查日期和时间,然后在该特定日期和时间运行。您还需要确保包含宏的工作簿在该日期和时间处于打开状态。

以下宏将从单元格中获取日期,并将日期增加一个月。该宏假定您有一个命名范围DateCell,它引用要更新的单元格。

Sub IncreaseMonth()

Dim dDate As Date     dDate = Range("DateCell").Value     Range("DateCell").Value = _       DateSerial(Year(dDate), _       Month(dDate) + 1, Day(dDate))

End Sub

为确保宏在适当的时间运行,您将需要另一个宏。下面的宏旨在在打开工作簿时运行:

Private Sub Workbook_Open()

If Day(Now) = 14 Then     Application.OnTime ("23:59:59"), "IncreaseMonth"

End If End Sub

请注意,这个特定的宏设置了OnTime方法,以便它在14日的23:59:59处运行GrowthMonth宏。选择该日期和时间是因为它比15号的00:00:00更容易捕获。

请记住,仅当您在14日打开工作簿,然后将工作簿保持打开状态直到15日时,IncrementMonth宏才会运行。

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(2180)适用于Microsoft Excel 97、2000、2002和2003。可以在以下功能区中为Excel的功能区界面(Excel 2007和更高版本)找到本技巧的版本: