【问题标题】:How to update date n times for n number of rows?如何更新 n 行的日期和时间?
【发布时间】:2018-09-15 00:49:09
【问题描述】:

我目前正在处理一个 16 000 行的 excel 文件

  • B 列是我要更​​新的日期
  • H 列是开始日期
  • 第一列是结束日期
  • K 列是日期需要更新的次数(更新 n 行)

想法是在 B 列中显示从开始日期到结束日期的所有日期(每列一个日期)。

您会在下面找到我当前的代码。我是初学者,它可能包含很多错误。能否请您帮帮我,我不断收到小错误:91、1004、5...

Sub Dates()
    Dim i As Long
    Dim k As Long
    Dim MyDate As Long
    Dim EndDate As Long
    Dim EndRowA As Long
    Dim EndRowB As Long
    Dim EndRowH As Long
    Dim StartDate As Long
    Dim ws As Worksheet
    Set ws = Worksheets("Sheet1")

    StartDate = ws.Cells(ws.Rows.Count, "H").Value
    MyDate = ws.Cells(ws.Rows.Count, "B").Value
    EndDate = ws.Cells(ws.Rows.Count, "I").Value
    EndRowA = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    EndRowB = ws.Cells(ws.Rows.Count, 2).End(xlUp).Row
    EndRowH = ws.Cells(ws.Rows.Count, 8).End(xlUp).Row

    Do While (i <= EndRowH And i <= EndRowA And i <= EndRowB)
        If ws.Cells(i, "H").Value = ws.Cells(i, "I").Value Then
            GoTo Continue
        ElseIf ws.Cells(i, "H").Value = ws.Cells(i, "I").Value Then
            For k = 1 To ws.Cells(i, k).Value
                ws.Cells(i + 1, "B").Select
                ws.Cells(i, "B").Value = ws.Cells(i - 1, "H").Value + 1
            Exit For
Continue:
        Next k
    End If
Loop
End Sub

电子表格中的主要列应如下所示:

Type    Date     Start date   End Date   #

A   01/01/2018  01/01/2018  01/10/2018  10
A   01/02/2018  01/01/2018  01/10/2018  10
A   01/03/2018  01/01/2018  01/10/2018  10
A   01/04/2018  01/01/2018  01/10/2018  10
A   01/05/2018  01/01/2018  01/10/2018  10
A   01/06/2018  01/01/2018  01/10/2018  10
A   01/07/2018  01/01/2018  01/10/2018  10
A   01/08/2018  01/01/2018  01/10/2018  10
A   01/09/2018  01/01/2018  01/10/2018  10  
A   01/10/2018  01/01/2018  01/10/2018  10
B   02/06/2018  02/06/2018  02/10/2018  5
B   02/07/2018  02/06/2018  02/10/2018  5
B   02/08/2018  02/06/2018  02/10/2018  5
B   02/09/2018  02/06/2018  02/10/2018  5
B   02/10/2018  02/06/2018  02/10/2018  5

提前谢谢你

【问题讨论】:

  • 我不断收到小错误:91、1004、5 - 所以您收到多个不同的错误?
  • 在你的代码中你说StartDate = ws.Cells(ws.Rows.Count, "H").Value,但你在任何时候都没有设置ws。此外,这条线Date = ws.Cells(ws.Rows.Count, "B").Value 毫无意义。 Date 是 VBA 中的保留字。你应该使用类似 MyDate
  • 感谢您的评论@FoxfireAndBurnsAndBurns,我没有注意到日期功能并将其更改为 MyDate。我分配了我的工作表,但我知道我收到一个带有“$H$1048576”的弹出窗口,你知道它来自哪里吗?我的 EndRow 似乎有问题
  • 当你说 popup 时,你的意思是你得到了一个 Msgbox?
  • 另外,关于您的数据。我不明白你想得到什么。我想# 列是Start dateEnd date 之间几个月的区别???因为在这种情况下,所有类型为 B 的数据都是错误的(6 月到 10 月之间只有 4 个月,而不是 5 个月)

标签: vba excel excel-2010 excel-2007


【解决方案1】:

只要试试这段代码,你就会看到你正在犯的错误:

Sub Dates()
    Dim ws As Worksheet
    Dim i As Long
    Dim k As Long
    StartDate = ws.Cells(ws.Rows.Count, "H").Value
    Date = ws.Cells(ws.Rows.Count, "B").Value
    EndDate = ws.Cells(ws.Rows.Count, "I").Value
    EndRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    MsgBox ws.Cells(ws.Rows.Count, "H").Address
    MsgBox ws.Cells(ws.Rows.Count, "B").Address

End Sub

我猜你在“H”列的最后一行没有任何价值。这是$H$1048576。 一般来说,通过EndRowEnd(xlUp) 传递的方式是一个不错的选择,请尝试在任何地方模仿它。


一些改进思路:

  • 在模块顶部写Option Explicit。它会强制您声明变量并在执行前进行快速检查。
  • 您应该将ws 分配给工作表。最简单的方法是Set ws = Worksheets("NameOfTheWorksheet")
  • 您正在执行的循环应该以预期的方式结束。例如,对于每个Do While,都应该写一个Loop"Do While" "Loop" and "While" "Wend" Loop. What's the difference?
  • VBA 中的GoTo 语句最好只用在句子On Error GoTo ErrHandler 中。一般来说,如果您从代码中删除GoTo Continue,它仍然会避免第二个循环。

【讨论】:

  • 嘿@vityata 感谢您的回答。您对 H 列是正确的,我之前的代码的一部分一直在创建行。我只是尝试了您的代码并分配了我的工作表。但是我不断弹出这个“$H$1048576”,你知道它是从哪里来的吗?
  • @ClémentHurel - $H$1048576H 中最后一行的地址。您不需要最后一行,您需要最后使用的行。看看你是如何在你自己的代码中为第一列实现的。 EndRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row H 也应如此。
  • 好的,我明白了,谢谢!我按照你的解释做了,但是“如果 ws.Cells(i, "H").Value = Cells(i, "I").Value Then" 生成错误 1004
  • 我更新了主要问题中的代码,你可以看看,它会给你一个更好的主意
  • 我不能等于零。它必须是 1 或更大。
猜你喜欢
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 2019-07-01
  • 1970-01-01
  • 2014-06-24
  • 2011-08-22
  • 2016-04-27
相关资源
最近更新 更多