【问题标题】:Generating a list of dates given the start and end dates在给定开始和结束日期的情况下生成日期列表
【发布时间】:2014-03-12 18:10:08
【问题描述】:

之前我发现了一些由 Andy Brown 编写的 VBA 代码,它生成一个列表,并将每个日期设为另一个用户的第一个或第 15 个日期。我试图根据我的需要调整这段代码,但我很挣扎。目前,代码一旦运行,只是一遍又一遍地输入相同的日期,我必须结束 Excel。

Sub GenerateDates()

Dim FirstDate As Date
Dim LastDate As Date
Dim NextDate As Date

FirstDate = Range("A1").Value
LastDate = Range("a2").Value

NextDate = FirstDate
Range("B1").Select

Do Until NextDate >= LastDate

    ActiveCell.Value = NextDate
    ActiveCell.Offset(1, 0).Select

    If Day(NextDate) = 1 Then
        NextDate = DateAdd("d", NextDate, 14)
    Else
        NextDate = DateAdd("d", NextDate, 20)
        NextDate = DateSerial(Year(NextDate), Month(NextDate), 1)
    End If

Loop

上面列出了我基于模型的以前的代码,下面是我最有可能糟糕的代码:

Sub GenerateDates()

Dim FirstDate As Date
Dim LastDate As Date
Dim NextDate As Date

FirstDate = Range("startdate").Value
LastDate = Range("enddate").Value

NextDate = FirstDate
Range("tripdays").Select
'selection of columns within one row
Do Until NextDate >= LastDate

    ActiveCell.Value = NextDate
    ActiveCell.Offset(1, 0).Select

    If Day(NextDate) = 1 Then
        NextDate = DateAdd("d", NextDate, 14)

    End If

Loop

End Sub

我需要的是在给定的开始日期和结束日期之间生成 每个 日期,而不仅仅是 15 日和 1 日。这是怎么做到的?

【问题讨论】:

  • 您到底需要什么?我们不知道你想用他的代码做什么。如果您主要将其调整为您的命名范围,那么您不必从他的代码中删除 Else 块。将其添加并调整到您的范围。 :)
  • 我希望输出是范围之间的每个日期,而不是每个日期由第一个和第十五个分隔,所以:开始日期 = 1/1/2014 结束日期 = 1/6/2014输出= 1/1/2014 1/2/2014 1/3/2014 1/4/2014 1/5/2014 1/6/2014 .....另外,我如何正确地为代码做灰色你在那里吗?我大约一周前开始使用 VBA,所以我希望能够学习并能够为以后的其他人做出贡献。
  • 现在好多了。在下面修改我的答案。等一下。
  • 请参阅下面的修改后的答案。要将文本转换为编辑器中的代码块,只需将其粘贴、突出显示并选择代码块选项。或者,在一行之前添加四 ​​(4) 个空格会将该行变成一个代码块。无论如何,您的问题的解决方案很简单:您只需要+1 开始日期,直到它到达结束日期。 :)

标签: vba date excel


【解决方案1】:

编辑:

这显然是您所需要的,正如 cmets 中所讨论的那样。

Sub GenerateDates()

Dim FirstDate As Date
Dim LastDate As Date
Dim NextDate As Date

FirstDate = Range("startdate").Value
LastDate = Range("enddate").Value

NextDate = FirstDate
Range("tripdays").Select
'selection of columns within one row
Do Until NextDate > LastDate

    ActiveCell.Value = NextDate
    ActiveCell.Offset(1, 0).Select
    NextDate = NextDate + 1

Loop

End Sub

或者,For 循环也可以。

截图:

进一步编辑:

按要求提供水平版本。

Sub GenerateDatesH()

Dim FirstDate As Date
Dim LastDate As Date
Dim NextDate As Date
Dim DateOffset As Range
Dim DateIter As Date

FirstDate = Range("startdate").Value
LastDate = Range("enddate").Value
Set DateOffset = Range("tripdays")

For DateIter = FirstDate To LastDate
    DateOffset.Value = DateIter
    Set DateOffset = DateOffset.Offset(0, 1)
Next DateIter

End Sub

截图:

注意:我还修复了垂直版本在提供的结束日期停止。

【讨论】:

  • 非常感谢!我还有两个问题,我觉得对你来说很容易。有没有办法让输出水平而不是向下一列?另外,有没有办法让最后日期成为结束日期?
  • 可行。请稍等,我将添加一个变体。 :)
  • 太慢了。永远不要使用 .Select。
  • @EducateMe 这是非常古老的代码。但我同意。虽然我现在不使用 Excel,但如果 VB 仍然相同,那么.Select 仍然很糟糕。
【解决方案2】:

避免在代码中使用 select 效率非常低:)

Sub p()
Dim FirstDate As Date
Dim LastDate As Date
Dim NextDate As Date
Dim r As Long
FirstDate = Range("A1").Value
LastDate = Range("a2").Value
r = 1
Do
 FirstDate = FirstDate + 1
 Cells(r, 2) = FirstDate
 r = r + 1
Loop Until FirstDate = LastDate
End Sub 

要连续执行,将单元格(r,2) 替换为单元格(1, r) 并开始 r=2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    相关资源
    最近更新 更多