三和(&)成为Excel的VBA语句

我试图删除所有的工作表,但三个工作簿中,使用“和”到“如果…然后”的声明,但是删除其中之一。 我写的是以下内容:

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 

但也不工作。 它尊重“收盘价”和“参数”工作表,而不是“股票”工作表。

你知道我该怎么解决它?

非常感谢,一切顺利。 grd_aa

可以使用表格数组一次性删除表格。 在For-Each循环中,将要删除的表的名称收集到数组中。 然后,只需调用Worksheets(sheetsToDeteleArrayHere).delete以便数组中的所有表单都将被立即删除。 HTH

注意:使用Trim(表单名称)确保前导和/或末尾空格不是比较的一部分。)

 Sub delete() Dim sheet Dim sheetsToDetele Application.DisplayAlerts = False For Each sheet In Application.Worksheets If Trim(sheet.name) = "Close Price" Then GoTo continue If Trim(sheet.name) = "Parameters" Then GoTo continue If Trim(sheet.name) = "Stock" Then GoTo continue If IsArray(sheetsToDetele) Then ReDim Preserve sheetsToDetele(1 To UBound(sheetsToDetele) + 1) Else ReDim sheetsToDetele(1 To 1) End If sheetsToDetele(UBound(sheetsToDetele)) = sheet.name continue: Next sheet If Not IsArray(sheetsToDetele) Then _ Exit Sub Application.Worksheets(sheetsToDetele).delete Application.DisplayAlerts = True End Sub 

正如你所说,if语句不尊重第三个,我会将其更改为Select Case ,因为只有当名称与案例陈述中列出的其他名称不匹配时才删除
(我知道我可以把所有的名字放在一行上

  Case "Close Price", "Parameters", "Stock" 

我只是觉得这样看起来更整洁:)

 Sub delete() Application.DisplayAlerts = False For Each Sheet In Application.Worksheets Select Case Sheet.Name Case "Close Price" Case "Parameters" Case "Stock" Case Else Sheet.delete End Select Next Sheet Application.DisplayAlerts = True End Sub 

问题是当你删除工作sheet ,你正在改变枚举到循环无法继续的地步,因为完整性已经被破坏了。

相反,当你需要这样做时,使用基于索引的循环,然后向后工作。 这样,当您删除工作表时,下一次迭代不会受到影响。

 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