【问题标题】:Deleting Worksheets Based on Multiple Worksheet Criteria根据多个工作表条件删除工作表
【发布时间】:2015-01-30 22:07:04
【问题描述】:

我将继续构建与从大型机检索的数据相关的宏,类似于我在previous questions 中提到的内容。

我正在生成大量工作表,使用基于我在 here 讨论的自动过滤条件的宏扩展。供参考,此代码的精简版如下:

Sub AddSheets()

Dim RngOne As Range, cell As Range

For Each cell In RngOne

Sheets.Add After:=Sheets(1)

Sheets(2).Select

Sheets(2).Name = cell.Value

Next


End Sub

在我处理数据集时,我的用户似乎可以在导出到所选目的地后删除生成的工作表。但是,为了便于使用,我试图保留那些与我的宏相关的工作表。对于 OR 条件,保留的工作表数量超过 2,并且出于讨论目的可能多达 10 个或更多。我当前的代码改编自这个site。我还查看了这个SO article

我的代码如下:

Sub DeleteAllButNotedSheets()

Dim IndividualWorkSheet As Worksheet

Application.DisplayAlerts = False

For Each IndividualWorkSheet In ThisWorkbook.Worksheets

    If IndividualWorkSheet.Name <> "Sheet1" Or "Criteria" Or "TemplateSheet" Or "TemplateSheet2" Then
        IndividualWorkSheet.Delete
    End If

Next

Application.DisplayAlerts = True

End Sub

目前,代码会导致类型不匹配错误。我正在寻求解决这个错误困境的方法。

除此之外,考虑到可能条件的数量,我还试图确定是否可以使用列表、集合甚至数组(给定循环)来代替巨大的OR 列表,这看起来很笨拙大部头书。我正在寻求解决方案或什至建议来解决此列表问题。

【问题讨论】:

    标签: vba excel


    【解决方案1】:
    tmp = IndividualWorkSheet.Name  
    If tmp <> "Sheet1" And tmp <> "Criteria" And _
       tmp <> "TemplateSheet" And tmp <> "TemplateSheet2" Then 
          IndividualWorkSheet.Delete     
    End If
    

    基于数组的方法:

    Dim arr
    arr = Array("Sheet1", "Criteria", "TemplateSheet", "TemplateSheet2")
    
    If IsError(Application.Match(IndividualWorkSheet.Name, arr, 0)) Then
        IndividualWorkSheet.Delete    
    End If
    

    【讨论】:

    • 当然! If And 语句。我应该想到的。关于将 If And 语句压缩到列表的任何建议?
    • 嗯,很有创意!我会搜索 =!,即 类型的条件,而不是使用错误检查机制。 VBA 似乎需要一个非常不同的思维方式来处理循环、数组等条件......再次感谢蒂姆! =)
    猜你喜欢
    • 2023-03-20
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2015-10-29
    相关资源
    最近更新 更多