gpt4 book ai didi

excel - VBA Excel 单元格中的单独日期范围

转载 作者:行者123 更新时间:2023-12-02 08:42:09 24 4
gpt4 key购买 nike

这让我很头疼。我正在尝试执行以下操作:

这是我拥有的数据,我有元素的名称以及开始日期和结束日期。我想要按天获取这些数据,并且不再在范围内(这样我可以将其上传到我拥有的按天数据库)。

我不知道是否可以在不使用 VBA 的情况下完成此操作,但我想最快的方法是使用 VBA。

当前数据:

╔═══════╦════════════╦════════════╗
║ name ║ start date ║ end date ║
╠═══════╬════════════╬════════════╣
║ foo1 ║ 25-11-2013 ║ 28-11-2013 ║
║ foo2 ║ 25-11-2013 ║ 28-11-2013 ║
║ foo3 ║ 25-11-2013 ║ 28-11-2013 ║
║ foo4 ║ 25-11-2013 ║ 28-11-2013 ║
║ foo5 ║ 25-11-2013 ║ 28-11-2013 ║
║ foo6 ║ 28-11-2013 ║ 28-11-2013 ║
║ foo7 ║ 28-11-2013 ║ 28-11-2013 ║
║ foo8 ║ 28-11-2013 ║ 28-11-2013 ║
║ foo9 ║ 28-11-2013 ║ 28-11-2013 ║
║ foo10 ║ 28-11-2013 ║ 28-11-2013 ║
║ foo11 ║ 29-11-2013 ║ 30-11-2013 ║
║ foo12 ║ 29-11-2013 ║ 30-11-2013 ║
║ foo13 ║ 29-11-2013 ║ 30-11-2013 ║
║ foo14 ║ 29-11-2013 ║ 30-11-2013 ║
║ foo15 ║ 29-11-2013 ║ 30-11-2013 ║
╚═══════╩════════════╩════════════╝

我想按天分隔名称,以获得:

╔═══════╦════════════╗
║ name ║ date ║
╠═══════╬════════════╣
║ foo1 ║ 25-11-2013 ║
║ foo2 ║ 25-11-2013 ║
║ foo3 ║ 25-11-2013 ║
║ foo4 ║ 25-11-2013 ║
║ foo5 ║ 25-11-2013 ║
║ foo1 ║ 26-11-2013 ║
║ foo2 ║ 26-11-2013 ║
║ foo3 ║ 26-11-2013 ║
║ foo4 ║ 26-11-2013 ║
║ foo5 ║ 26-11-2013 ║
║ foo1 ║ 27-11-2013 ║
║ foo2 ║ 27-11-2013 ║
║ foo3 ║ 27-11-2013 ║
║ foo4 ║ 27-11-2013 ║
║ foo5 ║ 27-11-2013 ║
║ foo6 ║ 28-11-2013 ║
║ foo7 ║ 28-11-2013 ║
║ foo8 ║ 28-11-2013 ║
║ foo9 ║ 28-11-2013 ║
║ foo10 ║ 28-11-2013 ║
║ foo11 ║ 29-11-2013 ║
║ foo12 ║ 29-11-2013 ║
║ foo13 ║ 29-11-2013 ║
║ foo14 ║ 29-11-2013 ║
║ foo15 ║ 29-11-2013 ║
║ foo11 ║ 30-11-2013 ║
║ foo12 ║ 30-11-2013 ║
║ foo13 ║ 30-11-2013 ║
║ foo14 ║ 30-11-2013 ║
║ foo15 ║ 30-11-2013 ║
╚═══════╩════════════╝

提前谢谢您。

最佳答案

结合@SorenHoltenHansen的答案,这应该可以让你到达你想去的地方。此类将接受开始和结束日期范围,并将计算您可以在代码中使用的完整日期范围。

创建一个新类,将其命名为“clsDateRange”,并添加以下代码:

Option Compare Database
Option Explicit

Private m_colDates As Collection

Public Sub InitStartEnd(ByVal dtStart As Date, ByVal dtEnd As Date)
Set m_colDates = New Collection
Dim tempDate As Date
For tempDate = dtStart To dtEnd Step 1
m_colDates.Add DateValue(tempDate)
Next
End Sub

Public Property Get Dates() As Collection
Set Dates = m_colDates
End Property

您可以全力以赴地实现集合接口(interface),但这应该足以满足您的需求。如果您要拥有非常大的日期范围并且想要对此保持聪明,您可以仅存储开始日期和结束日期,并仅在需要时生成中间日期,但我希望能够使用For...Each 无需定义 [_NewEnum] 和 Collection 的所有子属性。

以下是模块“mdlMain”中的一些测试,以便您了解如何使用它:

Public Sub Main()
Dim oDateRange As New clsDateRange
Dim varDate As Variant

oDateRange.InitStartEnd "25-11-2013", "27-11-2013"
For Each varDate In oDateRange.Dates()
MsgBox varDate
Next

oDateRange.InitStartEnd "28-11-2013", "28-11-2013"
For Each varDate In oDateRange.Dates()
MsgBox varDate
Next

oDateRange.InitStartEnd "29-11-2013", "30-11-2013"
For Each varDate In oDateRange.Dates()
MsgBox varDate
Next

End Sub
<小时/>

顺便说一下,dates are actually just 64-bit floating point numbers , Doubles 。他们代表the range January 1, 100 to December 31, 9999 。每天为 1,因此整个范围为 [-657434, 2958465]。一天中的时间以小数部分表示。午夜为 *.0,中午为 *.5,3:30 为 ~ *.645833333333333。当前(在我的时区)是 2013 年 12 月 6 日下午 1:27。根据立即窗口 ?CDbl(now()) 中的 VBA,这是 41614.5608680556。

这就是为什么我可以在 for 循环中运行日期范围,每次添加一个以增加日期的原因。

关于excel - VBA Excel 单元格中的单独日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20428227/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com