复杂的date操作

我现在必须每天处理不同数量的date(从200到1Mil加),我现在用一个相当冗长的AHK脚本来处理,它使用COM接口来读取date,并写回新的date。 我的脚本适合数量较less(高达5,000的任何内容),但是由于COM固有的缓慢特性,需要花费大量的时间来处理大量数据。

在其他使用VBA或嵌套if语句的任务中,我已经取得了一些成功,但是我的VBA知识却相当缺乏。

我的目标:

要检查当前格式为dd/mm/yyyy ss/mm/hh ,例如22/09/2015 45:12:23并执行以下两项任务之一:

  • 如果inputdate如上例所示,将单元格更改为22/09/2015 (切断时间段)

  • 如果inputdate是一周中的任何一天,则需要更改为下一个星期二的date(仍然中断时间段)。 例如,如果inputdate是2015年9月23日或25/09/2015 ,则需要更改为29/09/2015

我可以通过列循环,但在VBA,这是关于我的技能的程度。

回答

感谢大家的迅速回答。 我已经设法调整下面提供的一个适合我现在的情况。 最终结果是(A1是inputdate):

 =A1+(8-WEEKDAY(A1,12))*(WEEKDAY(A1,12)>1)-MOD(A1+(8-WEEKDAY(A1,12))*(WEEKDAY(A1,12)>1)-3,7) 

我试图通过Excel函数TEXT来解决这个问题,但与VBA函数Format ,它不能返回当前工作日的编号。 所以最好的解决scheme似乎是使用VBA。

这个function应该能解决你的问题:

 Public Function getTuesday(inputDate As Date) If Format(inputDate, "w", vbTuesday) = 1 Then getTuesday = CDate(Int(inputDate)) Else getTuesday = CDate(Int(inputDate) + 8 - Format(inputDate, "w", vbTuesday)) End If End Function 

我不确定如果您的datestring是一个string或“真正的date”,只是在Excel中显示的格式。 下面的VBA函数应该处理这两个实例。

该函数的主要部分是这一行:

 Tuesday = Dt + 7 - Weekday(Dt - 3) 

其中Dt仅仅是相关的date,仅作为一个date(没有时间)。 这也可以用作工作表函数。


 Function Tuesday(ByVal Dt) As Date 'not sure if date is a string or a "real date" ' so will test Select Case VarType(Dt) Case vbString Dt = DateSerial(Mid(Dt, 7, 4), Mid(Dt, 4, 2), Left(Dt, 2)) Case vbDate Dt = Int(Dt) Case Else MsgBox "Date is unknown" Exit Function End Select Tuesday = Dt + 7 - Weekday(Dt - 3) End Function