Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.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 正在删除找到的范围内值为0.00%的单元格_Excel_Vba_Range - Fatal编程技术网

Excel 正在删除找到的范围内值为0.00%的单元格

Excel 正在删除找到的范围内值为0.00%的单元格,excel,vba,range,Excel,Vba,Range,我有个问题。我已经编写了代码来查找并选择标题“Association”下表中的第二列。但是,下一步是遍历选定的单元格/区域,选择值为0.00%的所有行,然后删除它们 为此,我写了以下内容: 'Setting Variables Dim cell As Range Dim rngData As Range 'Selecting Range to go through and re-formatting Sheets("Allocations").Select

我有个问题。我已经编写了代码来查找并选择标题“Association”下表中的第二列。但是,下一步是遍历选定的单元格/区域,选择值为0.00%的所有行,然后删除它们

为此,我写了以下内容:


'Setting Variables

    Dim cell As Range
    Dim rngData As Range

'Selecting Range to go through and re-formatting

    Sheets("Allocations").Select
    Columns("A:A").Select
    Selection.Find(What:="Association", After:=ActiveCell, LookIn:=xlFormulas _
        , LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Activate
    Range("A19").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.EntireRow.Hidden = False
    ActiveCell.Offset(0, 1).Range("A1").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Style = "Percent"
    Selection.NumberFormat = "0.0%"
    Selection.NumberFormat = "0.00%"

'Attempting to delete just cells within current selection with a value of Zero

    Set rngData = Selection
    For Each cell In rngData
        If cell.Value = 0 Then
        Rows.Delete
        End If
    Next cell

End Sub

现在它只是删除了工作簿中的所有内容…这不是理想的哈哈

谢谢你对我的帮助,我已经在谷歌上搜索了很多次,现在我正在努力工作

谢谢

明确限定正在使用的对象是一种很好的做法。 这是一种奇特的说法,“识别对象”

你以前可能读过类似的东西,我相信你会一次又一次地读类似的东西。代码的问题恰好是一个很好的例子,说明了为什么这是一个好的实践

考虑一下“这是一个好的实践”这句话

我在说什么,或者更相关地说,我在暗示什么

我并没有明确地说,你必须限定该对象;事实上,我的意思是,你可以选择,这不是一个要求

这正是您对这一行所做的:
行。删除

是工作表对象的属性,属性不存在于真空中,它们始终伴随着它们所属的对象。 您没有显式标识工作表对象,而是隐式允许VBA使用默认工作表对象

因此,您隐式地编写了以下代码:
ActiveSheet.Rows.Delete

这正是宏所做的,它删除活动工作表中的行

我建议在使用以下行替换代码后运行代码:
cell.EntireRow.Delete

如果你这样做,你应该注意到一些有趣的事情。以前,您一直在删除工作表中的每一行,而现在,您要删除的行中只有50%是不一致的

为什么??我们修好了,怎么了

从索引列表中删除元素是新程序员的常见问题。用棋盘游戏作类比。你已经计划好了整个比赛。你做了一个动作,然后又做了一个动作,依此类推。但是你完全忽视了你的对手。他们也要转一圈

让我问你,如果你删除工作表中的第一行,工作表将以什么行号开始

所以现在发生的情况是,删除一行,Excel立即将行向上移动,第2行变为第1行。所以当你前进到第2行时,你实际上跳过了第2行,在第3行着陆

好消息是这是一个容易解决的问题。往回走。对于表,这意味着从最后一行开始,移动到第一行

您可以使用值为-1的可选
Step
参数通过
For
循环执行此操作

例如(双关语):

不幸的是,您必须使用索引迭代器<代码>对于每个都不起作用
步骤

现在,您的代码应该按预期工作

但是在下课之前,让我们先谈谈
选择

一句话:“不要”

正如“你不是宏记录器,所以不要像宏记录器那样编写代码”。这会使你的代码变慢。它仍然使您的代码更容易出错和bug


好了。您的家庭作业是学习如何显式限定对象,以避免隐式使用
ActiveSheet
。如何在
For
循环中使用
步骤。以及如何避免使用
选择

非常感谢您的详细解释!我刚刚开始学习VBA,所以像这样的东西真的很有帮助:)关于“选择”,我可以简单地从代码中完全删除它,还是需要用其他东西替换它?再次感谢!删除
Select
有很多细微差别。没有一刀切的解决方案。你能做的最好的事情就是阅读和练习,并有提高的意图。这里有一个链接让你开始。如果你发现我的答案是有用的,它解决了你的问题,那么请考虑接受它作为你的职位的解决方案。
For I = objTable.Listrows.Count to 1 Step -1