循环使用具有特定名称的工作表

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

汤姆
2.危险的人
三十
4.丹格兰

我希望我的代码能够find名称中包含危险文本string的所有工作表,并执行我的代码

我已经尝试了以下两个实例:

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 

即使没有错误,第一个代码也不会执行任何操作。 第二个代码只有在名称与我写下的内容完全匹配时才会执行某些操作。

任何帮助是必要的。

我想你的第一个代码将工作,如果你改变这个:

  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 

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

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

 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 

这是一个简单的修复(我所做的只是在每个Range()之前添加ws. ),但在处理多个工作表时非常重要 。 使用多个范围时一定要明确。 如果你正在使用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 DangerDoom ,那么你需要使用... Like "*danger*" Then

或者没有循环

 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