gpt4 book ai didi

excel - 根据日期删除行

转载 作者:行者123 更新时间:2023-12-04 22:12:16 26 4
gpt4 key购买 nike

我对 Excel 中的 VBA 和宏非常陌生。我有一个非常大的 Excel 电子表格,其中 A 列保存日期。我正在尝试删除只有今天日期的行,这就是我到现在为止的想法。

Sub DELETEDATE()
Dim x As Long
For x = 1 To Cells.SpecialCells(xlCellTypeLastCell).Row
Debug.Print Cells(x, "A").Value
If CDate(Cells(x, "A")) < CDate("Now()") Then
Cells(i, "A").EntireRow.Delete
End If
Next x
Next i
End Sub

最佳答案

您的代码存在许多问题。如果您是 VBA 新手,那么您应该将 Option Explicit 放在每个类/表单/模块的开头,以便您可以更快地获得有关您所犯错误的反馈。
您应该始终通过工作表限定 excel 引用,以便您不使用隐式事件表,例如您需要 myWb.Range 而不仅仅是 Range。如果你用谷歌搜索这个主题,会有很多例子。
您可以使用宏记录器来记录代码,以查看 Excel 在使用方面的预期。宏记录器生成的代码通常不是很好的代码,所以只能用它来澄清,而不是一种向往的风格。
当您要删除一行时,您也犯了一个典型的错误,那就是您正在更改您正在使用的集合。
VBA 和 Excel(或任何其他应用程序)是两个独立的实体。除非他们通过一组定义明确的接口(interface)相互传递消息,否则他们都不知道对方在做什么。这些接口(interface)由应用程序提供。例如。你告诉 Excel 你想通过使用 Range 'interface' 等来处理一个 range 对象。
当您查看 for 循环时,您已经告诉 VBA 它将循环 x 次,其中 x 是从 excel 获得的值。
VBA 给出了 x 的最终数字,但完全不知道该值与 Excel 中的一组对象相关联。
在您的 for 循环中,您删除 Excel 中的一行。这意味着您删除的行之后的所有行都将重新编号为比原来少一。但是 VBA 不知道这一点,它只知道它将 x 增加 1,直到达到您之前设置的最大值。
问题是,既然您已经删除了一行,那么该最大值不再代表您正在处理的行数。
更可怕的是,例如那一行。第 4 行现在是第 3 行,因为您删除了旧的第 3 行,但是当前为 3 的 x 将增加到 4,但旧的第 4 行现在是第 3 行,因此 x=4 现在正在查看旧行5 是新的第 4 行。这意味着每次删除一行时,您将跳过比您删除的行多一个的行。
通过倒数而不是数数,很容易避免这个问题。所以你的 for 循环应该是

For x = Cells.SpecialCells(xlCellTypeLastCell).Row to 1 step -1
你也应该使用有意义的变量名。在这种情况下,我建议使用 myRow 而不是“x”。
另外两个好的做法是
  • 在尝试运行代码之前,请始终执行 Debug.Compile 项目。这将检查您的整个代码是否存在语法错误。
  • 为 VBA 安装免费且出色的 Rubberduck 插件。您可以在代码编译干净后使用此插件。使用代码检查来找出你在哪里做了你不知道的假设。
  • 关于excel - 根据日期删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72010191/

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