三和(&;)和#x27;s转换为if语句VBA for Excel
我试图删除工作簿中的所有工作表,但使用“and”和“if…then”语句删除其中的三个工作表。我写的是:三和(&;)和#x27;s转换为if语句VBA for Excel,excel,vba,if-statement,Excel,Vba,If Statement,我试图删除工作簿中的所有工作表,但使用“and”和“if…then”语句删除其中的三个工作表。我写的是: Sub delete() For Each Sheet In Application.Worksheets Application.DisplayAlerts = False If (Sheet.Name <> "Close Price" And Sheet.Name <> "Parameters" And Sheet.Name <> "Stock"
Sub delete()
For Each Sheet In Application.Worksheets
Application.DisplayAlerts = False
If (Sheet.Name <> "Close Price" And Sheet.Name <> "Parameters" And Sheet.Name <> "Stock") Then
Sheet.delete
End If
Next Sheet
Application.DisplayAlerts = True
End Sub
Sub delete()
For Each Sheet In Application.Worksheets
Application.DisplayAlerts = False
If (Sheet.Name <> "Close Price" And Sheet.Name <> "Parameters") Then
If (Sheet.Name <> "Stock") Then
Sheet.delete
End If
End If
Next Sheet
Application.DisplayAlerts = True
End Sub
子删除()
适用于应用程序中的每张工作表。工作表
Application.DisplayAlerts=False
如果(Sheet.Name“收盘价”和Sheet.Name“参数”和Sheet.Name“股票”),则
Sheet.delete
如果结束
下一页
Application.DisplayAlerts=True
端接头
我还尝试了以下方法:
Sub delete()
For Each Sheet In Application.Worksheets
Application.DisplayAlerts = False
If (Sheet.Name <> "Close Price" And Sheet.Name <> "Parameters" And Sheet.Name <> "Stock") Then
Sheet.delete
End If
Next Sheet
Application.DisplayAlerts = True
End Sub
Sub delete()
For Each Sheet In Application.Worksheets
Application.DisplayAlerts = False
If (Sheet.Name <> "Close Price" And Sheet.Name <> "Parameters") Then
If (Sheet.Name <> "Stock") Then
Sheet.delete
End If
End If
Next Sheet
Application.DisplayAlerts = True
End Sub
子删除()
适用于应用程序中的每张工作表。工作表
Application.DisplayAlerts=False
如果(Sheet.Name“收盘价”和Sheet.Name“参数”),则
如果(Sheet.Name“Stock”),则
Sheet.delete
如果结束
如果结束
下一页
Application.DisplayAlerts=True
端接头
但它也不起作用。它尊重“收盘价”和“参数”工作表,但不尊重“库存”工作表
你知道我怎么解决吗
非常感谢,祝你一切顺利。
grd_aa问题在于,当您删除
工作表时,您正在将枚举更改为循环无法继续的点,因为完整性已受到损害
相反,当您需要这样做时,使用基于索引的循环,然后反向工作。这样,删除图纸时,下一次迭代不会受到影响
Sub delete()
Application.DisplayAlerts = False
Dim i As Integer
' Work backwards so if/when a sheet is deleted,
' the indexes are not changed
For i = Sheets.Count To 1 Step -1
If Sheets(i).Name <> "Close Price" _
And Sheets(i).Name <> "Parameters" _
And Sheets(i).Name <> "Stock" _
Then
Sheets(i).Delete
End If
Next
Application.DisplayAlerts = True
End Sub
子删除()
Application.DisplayAlerts=False
作为整数的Dim i
'向后工作,以便在删除工作表时,
'索引没有更改
对于i=工作表。计数到1步-1
如果是第(i)页,名称为“收盘价”_
和第(i)页。名称“参数”_
和表(i).名称“库存”_
然后
第(i)页。删除
如果结束
下一个
Application.DisplayAlerts=True
端接头
可以使用工作表名称数组立即删除工作表。在For Each
循环中,将要删除的图纸名称收集到一个数组中。然后只需调用工作表(sheetsToDeteleArrayHere)。删除即可立即删除阵列中的所有工作表。嗯
注意:使用Trim(图纸名称),可以确保前导和/或结束空格不属于比较的一部分。)
正如您所说,if语句不涉及第三个和
,我会将其更改为选择Case
,因为只有当名称与Case语句中列出的任何其他名称不匹配时,才会将其删除
(我知道我可以把所有的名字写在一行上
Case "Close Price", "Parameters", "Stock"
我只是觉得这样看起来更整洁:)
也许您的股票表名称有一个前导空格或尾随空格。我刚刚测试了第一个代码块,它按预期工作。我相信@chrisneilsen有你的答案。还要检查是否区分大小写……Jason,问题是他的工作表的名称。我刚刚测试了发布的第一个代码块,它的工作原理与预期的一样。这里没有必要向后循环。OP正在做一个ForEach
而不是For
循环。@ruberduck-我刚刚尝试使用他正在使用的循环构造,结果不稳定。我没有使用他的名字,而是使用Sheet1、Sheet2等。但是改为按索引使用循环是有效的。您是否有足够的工作表,以便始终至少剩下一个?因为我也测试过了,而且OPs代码也能正常工作。它根本不依赖于指数。因此,没有理由向后循环。@RubberDuck-使用4进行测试(因此表4被保留)。第二次循环时,它离开了第1张纸,然后是第3张纸。这很奇怪。我正在使用Excel 2013-您使用的是什么版本?@grd_aa-因此,如果您将“股票”移动到第一个if
条件,并将“收盘价”移动到最后一个,“收盘价”是否被忽略?VBA中是否有“避免使用转到”规则?@Chrismas007没有此类避免使用转到规则。这些规则通常是指导方针。这是典型的解决方法。。。并不是说有必要这样编码。如果你的代码很难阅读,你只需要避免跳转,这不是一个坏跳转/讽刺失败的好例子,先生。还有一个简单的如果x或y或z那么。。。否则
将避免GoTo。随着GoTo的继续,我已尝试减少嵌套,因此代码对我来说更清晰。但是可以使用Ifs,甚至可以选择案例,这是个人偏好的问题。“我只是觉得这样看起来更整洁:)“我们可以在。。。