Excel VBA从两个日期在表格中创建和添加多行

Posted

技术标签:

【中文标题】Excel VBA从两个日期在表格中创建和添加多行【英文标题】:Excel VBA Create and Add multiple rows in Table from two dates 【发布时间】:2020-08-27 11:56:41 【问题描述】:

我希望在 Excel 中创建一个 UserForm1,当用户添加开始日期和结束日期时,它将在 table1 中创建新行,使用 VBA 填充如下:

Example: User enters - START DATE: 5/9/2020 & END DATE: 5/16/2020

表返回(添加到表 1 的行和计算):

DATE          COUNT          P1/P2       START DATE      END DATE
5/9/2020        1              1          5/9/2020       5/16/2020
5/10/2020       2              2          5/9/2020       5/16/2020
5/11/2020       3              2          5/9/2020       5/16/2020
5/12/2020       4              2          5/9/2020       5/16/2020
5/13/2020       5              2          5/9/2020       5/16/2020
5/14/2020       6              2          5/9/2020       5/16/2020
5/15/2020       7              2          5/9/2020       5/16/2020

日期列显示:开始日期和 5/9 到 5/16 之间的每一天的一行,但不包括 5/16

计数列:计算从一个输入中添加的行数

P1/P2 列:在命令外添加的第一行(仅记录)显示 1,其余所有行显示 2

开始日期:将输入的日期显示为[开始日期]

结束日期:显示为 [结束日期] 输入的日期

如果有人输入一个包含 365 天的日期,则表格最终会添加 365 行。希望找到一种简单的方法,我可以像使用 SQL 一样执行此操作 - 但我无法在 VBA 中找到任何示例。

我已经能够从用户窗体上的按钮输入数据,该按钮在最后添加到表格中 - 我真的需要有关如何创建多行和操作数据以执行我想要的操作的指导VBA。

感谢您提供的任何帮助。

【问题讨论】:

【参考方案1】:

我无法为您编写整个程序,但这个示例解决方案将为您提供一个工作模型。我将发布一些代码,然后在下面解释它在做什么。

注意:我正在创建一个带有默认工作表名称的新工作簿和一个带有表单及其控件的所有默认名称的新用户窗体。

用户窗体代码:

Private Sub CommandButton1_Click()
Dim StartDate As Date
Dim EndDate As Date
Dim DateRangeLength As Long
Dim LoopCounter As Long
Dim RowAfterLast As Long

StartDate = CDate(Me.TextBox1.Value)
EndDate = CDate(Me.TextBox2.Value)

DateRangeLength = (EndDate - StartDate)

With Sheet1
    For LoopCounter = 1 To DateRangeLength
        RowAfterLast = .Cells(Rows.Count, "A").End(xlUp).Row + 1
        If LoopCounter = 1 Then
            .Range("A" & RowAfterLast).Value = StartDate
            .Range("B" & RowAfterLast).Value = LoopCounter
            .Range("C" & RowAfterLast).Value = 1
            .Range("D" & RowAfterLast).Value = StartDate
            .Range("E" & RowAfterLast).Value = EndDate
        Else
            .Range("A" & RowAfterLast).Value = StartDate + (LoopCounter - 1)
            .Range("B" & RowAfterLast).Value = LoopCounter
            .Range("C" & RowAfterLast).Value = 2
            .Range("D" & RowAfterLast).Value = StartDate
            .Range("E" & RowAfterLast).Value = EndDate
        End If
    Next LoopCounter
End With

End Sub

我使用CDate() 函数将用户窗体中的日期分别传递给StartDateEndDate,该函数将其转换为日期值(否则您可能遇到某些日期的问题) .

我发现日期之间的差异是一个整数,并将其分配给DateRangeLength,它使用Long 数据类型声明。

然后使用 For...Next 循环,以 DateRangeLength 作为循环的上限,我们将数据写入工作表。在我的示例中,范围在列"A""E" 之间。通过在 A 列中找到最后使用的行并将分配给 RowAfterLast 的 1 添加到每个循环迭代的开始,可以找到该行。

截图:

输出范围和用户窗体准备点击“开始!”带有测试数据:

代码运行后的输出:


我应该提一下

明智的做法是为用户输入数据添加某种错误检查,例如确保值是有效日期且格式正确的某些语句或函数。

如果您不太确定该做什么或从哪里开始,Google 就是您的朋友。

为了给你一个很好的例子来说明为什么这很重要,如果我在你的问题中输入日期值在他们的格式 MM/DD/YYYY我结束了由于我的日期设置而没有输出 - 我的 reigon 的正确格式是 DD/MM/YYYY 所以开始日期 05/09/2020 被理解为 September 5th, 2020 和结束日期被理解为 @987654339 @ 但是因为没有第 16 个月,所以转换为您的预期 May 16th, 2020 导致 DateRangeLength 等于 -112,因此循环退出甚至没有开始第一次迭代。

【讨论】:

谢谢塞缪尔!这应该为我指明正确的方向。而且看起来很棒。我有创建错误检查的经验,并且在这种情况下可能是强制性的 - 所以我应该能够处理这些。

以上是关于Excel VBA从两个日期在表格中创建和添加多行的主要内容,如果未能解决你的问题,请参考以下文章

VBA SQL写入语句,从一个表格写入令一个表格?

Access VBA中一列的总和

如何在 NMake 中创建和使用多行字符串变量?

在GBQ中创建和循环日期数组

在excel的VBA里如何获取日期和星期几

Excel vba列表框多列多行从14个文本框