执行操作如果活动工作表是(或不是)在一组工作表中

时间:2016-10-27 19:55:30

标签: excel vba excel-vba macros

我是VBA的新手,所以如果这是一个愚蠢的问题,我很抱歉,但我试图设置一个宏,根据最后一天清除工作表中的行报告的运行月份。

我发现很简单:

ActiveSheet.Range(范围).Clear

这对我来说很完美但是我在工作簿中有类似的工作表,我试图保护自己不会在错误的工作表中意外地测试宏并删除我需要的东西,所以我试图以一种方式添加到宏检查活动工作表是否是工作簿中的7个工作表之一。如果不是这7个中的一个,那么就不要清楚了。如果是,请清楚。

我发现如果我做了这样的事情:

If Not ActiveSheet.Name = Worksheets("014").Name Then

Else

ActiveSheet.Range("40:42").Clear

End If

这适用于单个工作表,但我需要检查另外6个工作表名称。我知道我可以使用多个" IF NOT"检查每个工作表的语句,但有一个更简洁,更清晰的方法来检查相同的所有七个工作表名称" IF NOT"声明?

谢谢你, 降压

2 个答案:

答案 0 :(得分:2)

我会使用Scripting.Dictionary来保存您有兴趣检查的工作表的名称:

Dim dict As New Scripting.Dictionary
dict.Add("Sheet1", 1) 'the actual values don't matter; we want to check against the keys
dict.Add("Sheet2", 1)
dict.Add("Sheet3", 1)
dict.Add("014", 1)

然后我们可以检查字典中是否存在密钥:

If dict.Exists(ws.Name) Then
    ws.Range("40:42").Clear
End If

您也可以使用数组:

Dim sheetNames(4) As String
sheetNames(0) = "Sheet1"
sheetNames(1) = "Sheet2"
sheetNames(2) = "Sheet3"
sheetNames(3) = "014"

但由于没有内置方法来检查数组中是否存在项目,因此您必须自己编写这样的函数:

Function ContainsItemm(col As Variant, item As Variant) As Boolean
    Dim x As Variant
    For Each x In col
        If x = item Then
            ContainsItem = True
            Exit Function
        End If
    Next
End Function

并使用它:

If ContainsItem(sheetNames, ws.Name) Then
    ws.Range("40:42").Clear
End If

答案 1 :(得分:0)

将所有工作表名称放入一个字符串中,然后使用它。

Dim strSheetNames as String
Dim ws As Worksheet
Set ws = ActiveSheet
strSheetNames = ",Sheet1,Sheet2,Sheet3,014..," 'include all sheet names
If InStr(strSheetNames,"," & ws.Name & ",") <> 0 Then
      ws.Range("40:42").Clear
End If

逗号搜索技巧是Zev Spitz。