如何转到上一个单元并使此代码更快?

如何解决如何转到上一个单元并使此代码更快?

运行删除EntireRow的代码时,转到下一个单元格将不会基于相同的参数删除下一个单元格,因为该单元格将向下移动到当前插槽中。

IE:

for each cell in r
if cell.value = "A" then cell.entirerow.delete
next cell

如果A1 =“ A”,则上面的代码将删除A1,但是如果A2也=“ A”,则不会删除它,因为当它转到下一个单元格A2时,它已移至A1。现在,当它查看A2时,该单元格就是A3,因此充其量是查看其他所有单元格。

要解决这个问题,我要做这样的事情:

DoItAgain:
For Each cell In r
    If cell.Value = "A" Then
        cell.EntireRow.Delete
        GoTo DoItAgain
    End If
next cell

这很好用,但是在10万行上运行此代码时,它花费的时间太长。我想这是因为我的DoItAgain方法将其带回到第一个单元格,如果要查看的单元格为100k或更多,则有很多单元格要循环通过。

这是我现在正在使用的全部代码。直到我开始接收更多数据,然后才花费太长时间才有用:

Private Sub Ford_Inventory_Variance_File_CleanUp()
Call ScreenOff

If IsEmpty(Range("A2")) Then Range("A2").EntireRow.Delete
If IsEmpty(Range("A1")) Then Range("A1").EntireRow.Delete

LastRow = ActiveWorkbook.ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row

DoItAgain2:
Set r = ActiveWorkbook.ActiveSheet.Range("A20:A" & LastRow)
For Each cell In r
    If cell.Value = "**** End Of Report ****" Then GoTo ItsTrimmed
    cell.Value = Trim(cell.Value)
    If IsEmpty(cell.Value) Then
        cell.EntireRow.Delete
        GoTo DoItAgain2
    End If
Next cell

ItsTrimmed:
DoItAgain:
For Each cell In r
    If cell.Value = "**** End Of Report ****" Then Exit Sub
    If InStr(1,(cell.Value),"/") = 0 And InStr(1,"Total of Inventory") = 0 Then
        cell.EntireRow.Delete
        GoTo DoItAgain
    End If
    If Not IsNumeric(Left(cell.Value,1)) And InStr(1,"Total of Inventory") = 0 Then
        cell.EntireRow.Delete
        GoTo DoItAgain
    End If
Next cell

Call ScreenOn
End Sub

Screenupdating已关闭,但是此代码将永远存在。我可以使用Next cell代替Previous cell吗?前一个单元格是一回事吗?也许我可以使用previous cell代替GoTo DoItAgain吗?

任何有关如何加快此速度的输入将不胜感激。我使用GoTo DoItAgain方法编写了很多这样的代码,我可能有100个这样的宏,但是我可能需要更好的方法。我的老板委托我做更多的工作,但我需要加快这一过程。

谢谢。

解决方法

请尝试下一个代码。它未经测试,但可以正常工作。从根本上说,它适用于下一个机制:在定义范围的所有单元格之间进行迭代,并根据设置的条件检查每个单元格。如果条件为name 'collided_left' is not defined,则它将单元格标记为需要删除的单元格(使布尔变量True)。之后,在True的情况下,将其相应的单元格添加到boolToDelete = True(要删除的范围)。最后,使用rngDel,一次删除所有行(非常快):

rngDel
,

FaneDuru回答我的问题获得100%的积分。

但是,我要发布正在使用的完整修改代码:

Private Sub Ford_Inventory_Variance_File_CleanUp()

Dim sh As Worksheet,lastRow As Long,i As Long,rngDel As Range,boolToDelete As Boolean

If IsEmpty(Range("A2")) Then Range("A2").EntireRow.Delete
If IsEmpty(Range("A1")) Then Range("A1").EntireRow.Delete

lastRow = ActiveWorkbook.ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row

Set r = ActiveWorkbook.ActiveSheet.Range("A1:N" & lastRow)
For Each cell In r
    cell.Value = Trim(cell.Value)
Next cell

  Set sh = ActiveSheet 'use here your sheet
  lastRow = sh.Range("A" & Rows.Count).End(xlUp).Row
  For i = 20 To lastRow
    If sh.Range("A" & i).Value = "" Then
        boolToDelete = True
    ElseIf InStr(sh.Range("A" & i).Value,"/") = 0 And InStr(sh.Range("A" & i).Value,"Total of Inventory") = 0 And sh.Range("A" & i).Value <> "**** End Of Report ****" Then
        boolToDelete = True
    ElseIf Not IsNumeric(Left(sh.Range("A" & i).Value,1)) And InStr(sh.Range("A" & i).Value,"Total of Inventory") = 0 And sh.Range("A" & i).Value <> "**** End Of Report ****" Then
        boolToDelete = True
    End If
    If boolToDelete Then
        If rngDel Is Nothing Then
            Set rngDel = sh.Range("A" & i)
        Else
            Set rngDel = Union(rngDel,sh.Range("A" & i))
        End If
    End If
    boolToDelete = False
  Next i
  If Not rngDel Is Nothing Then rngDel.EntireRow.Delete xlUp

End Sub

Dane撰写的所有内容都很快。现在,代码中最长的部分是我编写的trim函数,用于修剪其中的所有单元格(“ A1:N”和LastRow)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?