Excel 正在删除找到的范围内值为0.00%的单元格
我有个问题。我已经编写了代码来查找并选择标题“Association”下表中的第二列。但是,下一步是遍历选定的单元格/区域,选择值为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
'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