循环显示具有特定名称的工作表

时间:2015-12-15 20:36:41

标签: excel vba excel-vba

假设我有10个工作表,4个名称非常相似:

  1.panger tom
  2.danger man
  3.danger十   4.danger lan

我希望我的代码能够在其名称中找到所有带有文本字符串 danger 的工作表并执行我的代码

我已尝试过以下两种情况:

Public Sub SubName()

Dim ws As Worksheet

For Each ws In ActiveWorkbook.Worksheets

    If ws.Name Like "danger" Then
       *Also tried this version: If ws.Name Like "danger" = True Then*

        Range("A1").Interior.ColorIndex = 37
    End If

Next ws

End Sub 

拿2

Sub WorksheetLoop()

Dim ws  As Worksheet

For Each ws In ActiveWorkbook.Worksheets
    If InStr("danger", ws.Name) > 0 Then
        Range("A1").Interior.ColorIndex = 37
    End If
Next ws

End Sub

即使没有错误,第一个代码也没有做任何事情。如果名称与我写下的名称完全匹配,则第二个代码只会执行某些操作。

需要任何帮助。

4 个答案:

答案 0 :(得分:5)

我很确定你只需要明确添加你正在使用的工作表。

Public Sub SubName()
Dim ws As Worksheet

For Each ws In ActiveWorkbook.Worksheets
    If ws.Name Like "danger" Then
      ' *Also tried this version: If ws.Name Like "danger" = True Then*
        ws.Range("A1").Interior.ColorIndex = 37
    End If
Next ws

End Sub

Sub WorksheetLoop()

Dim ws  As Worksheet

For Each ws In ActiveWorkbook.Worksheets
    If InStr("danger", ws.Name) > 0 Then
        ws.Range("A1").Interior.ColorIndex = 37
    End If
Next ws

End Sub

这是一个简单的修复(我所做的只是在每个ws.之前添加Range()),但在处理多个工作表时非常重要。使用多个范围时始终明确。如果您使用Cells()Row()Column()等,则应添加您正在使用的工作表。

另一种布局是使用With(例如,参见下面的SubName()例程):

Public Sub SubName()
Dim ws As Worksheet

For Each ws In ActiveWorkbook.Worksheets
    With ws
    If .Name Like "danger" Then
      ' *Also tried this version: If ws.Name Like "danger" = True Then*
        .Range("A1").Interior.ColorIndex = 37
      ' For illusatration, this will color the range A1:B10
      ' .Range(.Cells(1,1),.Cells(10,2)).Interior.ColorIndex = 37
    End If
    End with
Next ws

End Sub

请注意,使用With可以让您使用“占位符”.来引用WS(或With后面的任何内容)。请参阅我添加的使用Range(Cells(),Cells())的行作为一个很好的示例。

修改:使用If ws.Name like "danger" Then只会 在名为danger的工作表上运行(小写,无空格)。如果您希望此功能适用于名为DangerMouseDangerDoomCarlos Danger的工作表,那么您需要使用... Like "*danger*" Then

答案 1 :(得分:2)

我认为如果你改变这个,你的第一个代码就会起作用:

 If ws.Name Like "danger" Then
   *Also tried this version: If ws.Name Like "danger" = True Then*

    Range("A1").Interior.ColorIndex = 37
End If

到此:

If ws.Name Like "danger" & "*" Then    
     ws.Range("A1").Interior.ColorIndex = 37
End If

只是你可以使用“危险*”。

答案 2 :(得分:1)

或没有循环

Sub GetSheets()
Dim strIn As String
Dim X, xArr

strIn = Application.InputBox("Search string", "Enter string to find", "*List*", , , , , 2)
If strIn = "False" Then Exit Sub

ActiveWorkbook.Names.Add "shtNames", "=RIGHT(GET.WORKBOOK(1),LEN(GET.WORKBOOK(1))-FIND(""]"",GET.WORKBOOK(1)))"
X = Filter([index(shtNames,)], strIn, True, 1)

For Each xArr In X
Sheets(xArr).Range("A1").Interior.ColorIndex = 37
Next

End Sub

答案 3 :(得分:0)

*名称前添加星号like。例如。Name Like "*danger"

Asterisk *是Excel的通配符