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
三和(&;)和#x27;s转换为if语句VBA for Excel_Excel_Vba_If Statement - Fatal编程技术网

三和(&;)和#x27;s转换为if语句VBA for Excel

三和(&;)和#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"

我试图删除工作簿中的所有工作表,但使用“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") 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,甚至可以选择案例,这是个人偏好的问题。“我只是觉得这样看起来更整洁:)“我们可以在。。。