excel - 删除具有 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
现在它只是从工作簿中删除所有内容……这并不理想哈哈
感谢我能得到的任何帮助,我已经做了很多谷歌搜索,现在正在拔头发!
谢谢
解决方案
明确限定您正在使用的对象是一种很好的做法。 这是一种花哨的说法,“识别对象”
你可能以前读过类似的东西,我敢肯定你会一次又一次地读到类似的东西。您的代码的问题恰好是一个很好的例子,说明了为什么它是一个好习惯。
考虑一下措辞,“这是一个很好的做法”。
我在说什么,或者更相关的是,我在暗示什么?
我没有明确说你必须限定对象;事实上,我含蓄地说你有一个选择,这不是一个要求。
这正是您对这一行所做的: 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
. 如何Step
在For
循环中使用。以及如何避免使用Select
推荐阅读
- html - 为什么 div 没有在移动设备上占据全部高度
- python - 铬 aw 快速刷新
- javascript - 位置:-webkit-sticky 在 safari 上不起作用
- python - 正则表达式匹配:不区分大小写的带空格的德语单词(Python)
- c# - 如何使用 DataTable 和 Linq 优化代码?
- java - 我想用下面给出的结构将 JSON 反序列化到给定的 Java 类中
- github - 如何在 Github 操作工作流文件中使用片段以避免重复?
- java - 如何在 HH:MM:SS 中显示倒数计时器(小时:分钟:秒)
- python - Python:随机时间的刺激变化
- javascript - ReactJs:尽管事件已正确触发,但下拉事件值仍设置为空字符串