Vba创建发生日(不是星期几),即:按日期的第1天,第2天等

时间:2015-12-07 15:37:19

标签: excel vba excel-vba

一个vba-excel宏,用于在附加的工作表中将我的报告从当前格式修改为所需格式。

摘要

我想添加一列作为"发生日期" ---即:第1天...基于日期/时间列的日期Z,以便能够使用数据透视表来识别每个帐号在整个住宿期间每天使用的所有代码。

有40K行帐号,有不同的服务天数。列数应与示例中的相同。

当前工作表

Current worksheet

所需工作表

Desired Worksheet

5 个答案:

答案 0 :(得分:1)

假设第1天是您日期和日期中最早的一天。时间列和该列位于E列中,那么此公式将执行="Day " & E2-MIN(E:E)+1。显然,这是输入到你想要的任何一列,在第2行,然后填写。

答案 1 :(得分:0)

假设:

  • A栏中的帐号

  • C列中出现的日期

  • 日期& E栏中的时间

并且还假设发生的日期不是"日期",而只是一系列不同的日子(如果不是这样的话,只需使用Scott的评论)。

您可以使用此公式获取所需的日期编号,但不使用" Day"前缀。

在单元格C2中键入此公式,然后将其复制并粘贴到C列的所有单元格中:

= IF(A2<>A1, 1, IF(E2=E1, C1, C1+1))

如果您坚持将其显示为"Day x",则公式稍微复杂一些,但它有效(再次,在单元格C2中输入此公式,然后将其复制/粘贴到C列的其他单元格中):< / p>

=IF(A2<>A1,"Day 1",IF(E2=E1,C1,"Day "& (1+RIGHT(C1,LEN(C1)-4))))

p.s。:我不建议给它添加前缀,因为它是数字数据,所以让它保持数字......

答案 2 :(得分:0)

这可能是矫枉过正......但这就是我想出的......

Function DayOfOccurrence(InputDate As Date) As String

    YearEntry = Year(InputDate)
    MonthEntry = Month(InputDate)
    IsLeapYear = -1
    On Error Resume Next
    IsLeapYear = CDate("2 / 29 /" & YearEntry) 'Hack to see if it's a leap year. Variable IsLeapYear will remain -1 if NOT a leap year.
    On Error GoTo 0

    If IsLeapYear = -1 Then 'Is Not a Leap Year
        If MonthEntry = 1 Then
            Base = 0
        ElseIf MonthEntry = 2 Then
            Base = 31
        ElseIf MonthEntry = 3 Then
            Base = 59
        ElseIf MonthEntry = 4 Then
            Base = 90
        ElseIf MonthEntry = 5 Then
            Base = 120
        ElseIf MonthEntry = 6 Then
            Base = 151
        ElseIf MonthEntry = 7 Then
            Base = 181
        ElseIf MonthEntry = 8 Then
            Base = 212
        ElseIf MonthEntry = 9 Then
            Base = 243
        ElseIf MonthEntry = 10 Then
            Base = 273
        ElseIf MonthEntry = 11 Then
            Base = 304
        ElseIf MonthEntry = 12 Then
            Base = 334
        End If
    Else 'Is a Leap Year
        If MonthEntry = 1 Then
            Base = 0
        ElseIf MonthEntry = 2 Then
            Base = 31
        ElseIf MonthEntry = 3 Then
            Base = 60
        ElseIf MonthEntry = 4 Then
            Base = 91
        ElseIf MonthEntry = 5 Then
            Base = 121
        ElseIf MonthEntry = 6 Then
            Base = 152
        ElseIf MonthEntry = 7 Then
            Base = 182
        ElseIf MonthEntry = 8 Then
            Base = 213
        ElseIf MonthEntry = 9 Then
            Base = 244
        ElseIf MonthEntry = 10 Then
            Base = 274
        ElseIf MonthEntry = 11 Then
            Base = 305
        ElseIf MonthEntry = 12 Then
            Base = 335
        End If

    End If

    DayOfOccurrence = "Day " & Base + Day(InputDate)

End Function

答案 3 :(得分:0)

我将添加这个:

在C:

中使用以下公式
="DAY " & DAY(E2 - MIN(IF(A:A = A2,E:E)))+1

然后订单搞砸了并不重要。

如果要将基础数字保留为数字,请使用@pnuts注释,然后使用以下公式:

=DAY(E2 - MIN(IF(A:A = A2,E:E)))+1

并在范围内使用以下自定义格式:

"Days " 0

它会将单词放在数字前面,但将数字保留为条目,这样就可以在不删除单词的情况下完成任何数学运算。

答案 4 :(得分:0)

您可以在VBA中使用此自定义功能。这会让你在一年中结束这一天。

Function d_day_consequent(my_date As Date)
    d_day_consequent = my_date - DateSerial(Year(my_date), 1, 1)
End Function

enter image description here