Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 使用VBA对不同选项卡中的不同数据进行排序和删除_Excel_Vba - Fatal编程技术网

Excel 使用VBA对不同选项卡中的不同数据进行排序和删除

Excel 使用VBA对不同选项卡中的不同数据进行排序和删除,excel,vba,Excel,Vba,我使用宏将数据从4个选项卡拉入一个选项卡。当数据返回时,我正试图删除几百行零。我遇到的主要问题是,每次拉它时,行数都会发生变化,因此如果我使用下面的行(如第二个场景中的1570:1570),我会丢失一些数据或删除一些日期。如果我识别并运行(如第一个场景中所示),循环将永远无法运行。我在下面使用了这两种代码,并说明了我不喜欢它们的原因。感谢任何帮助(顺便说一句,我是VBA的新手) -这是场景1,循环需要很长时间(通常是8K-10K行数据),场景2如下:-这是场景2,工作速度很快,但要么删除有效数据

我使用宏将数据从4个选项卡拉入一个选项卡。当数据返回时,我正试图删除几百行零。我遇到的主要问题是,每次拉它时,行数都会发生变化,因此如果我使用下面的行(如第二个场景中的1570:1570),我会丢失一些数据或删除一些日期。如果我识别并运行(如第一个场景中所示),循环将永远无法运行。我在下面使用了这两种代码,并说明了我不喜欢它们的原因。感谢任何帮助(顺便说一句,我是VBA的新手)

-这是场景1,循环需要很长时间(通常是8K-10K行数据),场景2如下:-这是场景2,工作速度很快,但要么删除有效数据,要么不删除所有0行数据。正如你所知道的,这一次我在excel中录制了宏

Application.CutCopyMode = False 

Dim wbkX As Workbook
Dim wksX As Worksheet
Set wbkX = ActiveWorkbook
Set wksX = wbkX.Worksheets("Merge")
    lRow = wksX.UsedRange.Rows.Count 
    lCol = wksX.UsedRange.Columns.Count 

wksX.Range(Cells(1, 1), Cells(1, lCol)).AutoFilter Field:=1 

For x = 1 To lRow 'Loop's through every row from 1 to Last Row.  
    If wksX.Cells(x, 1).Value = 0 Then 
        wksX.Rows(x).Delete 
        x = x - 1 
    End If
Next x


Sub DeleteZeros()

' DeleteZeros Macro
ActiveSheet.Range("$A$1:$G$27997").AutoFilter Field:=1, Criteria1:="0"
Rows("1571:1571").Select
Range(Selection, Selection.End(xlDown)).Select
Application.CutCopyMode = False
Selection.Delete Shift:=xlUp
Range("A1").Select
ActiveSheet.Range("$A$1:$G$6277").AutoFilter Field:=1
End Sub

在第一种方法中,我认为如果从集合中删除,那么对于x=1到lRow是错误的,必须向后迭代,
对于x=lRow到1步骤-1
。否则,您将跳过迭代,因为集合将在每次
删除时重新编制索引。您能否修改对第二种方法的错误解释?您认为这与您硬编码范围(“A1:G2797”和“1571”)有关吗?是的,大卫,谢谢。这是因为它们是从宏记录中硬编码的。基本上,当我录制宏时,我在第1行添加了一个过滤器,在a列中按“0”排序,并删除了所有这些行。当时正好是1571排,但每天都会有很大的变化。关于A1:G2797,基本相同,我选择了相关的列和行,列总是A:G,但行也总是不同。关于快速删除行,还有很多其他的Q/A。一个好的答案——不要只看被接受的答案,另一个也很好。应用过滤器后,可以从
Find
方法导出值为0的第一行。如果该宏的其余部分正常工作,只要正确标识了该行,这是与修改另一种方法相比最简单的解决方案。