首页 > 解决方案 > 删除具有 0.00% 值的找到范围内的单元格

问题描述

我有一个问题。我已经编写了代码来查找并选择标题“关联”正下方的表格中的第二列。但是,下一步是遍历选定的单元格/范围,选择值为 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

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

感谢我能得到的任何帮助,我已经做了很多谷歌搜索,现在正在拔头发!

谢谢

标签: excelvbarange

解决方案


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

你可能以前读过类似的东西,我敢肯定你会一次又一次地读到类似的东西。您的代码的问题恰好是一个很好的例子,说明了为什么它是一个好习惯。

考虑一下措辞,“这是一个很好的做法”。

我在说什么,或者更相关的是,我在暗示什么?

我没有明确说你必须限定对象;事实上,我含蓄地说你有一个选择,这不是一个要求。

这正是您对这一行所做的: Rows.Delete

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

所以,隐含地,你写了这个:ActiveSheet.Rows.Delete

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

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

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

为什么?我们修好了,发生了什么?

从索引列表中删除元素是新程序员的常见问题。以棋盘游戏为例。你已经计划好了整个游戏。你做出一个动作,然后另一个动作,以此类推。但是你完全忽视了你的对手。他们也可以轮到!

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

那么发生了什么,您是否删除了一行,Excel 立即将这些行向上移动,第 2 行变为第 1 行。因此,当您前进到第 2 行时,您实际上跳过了第 2 行并降落在第 3 行。

好消息是,这是一个很容易解决的问题。只好倒退。在表格的情况下,这意味着从最后一行开始移动到第一行。

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

例如(双关语一半的意思):

For I = objTable.Listrows.Count to 1 Step -1

不幸的是,您必须使用索引迭代器。 For Each不工作Step

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

但是在下课之前,让我们谈谈Select

一句话:“不要”

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

所以你有它。你的作业是学习如何明确限定对象以避免隐式使用ActiveSheet. 如何StepFor循环中使用。以及如何避免使用Select


推荐阅读