VBA 根据工作表名称的一部分调用不同宏的代码

VBA code to call different macro depending on part of Worksheet name

我正在开发一个宏,它将循环浏览活动工作簿中的所有工作表,然后根据工作表名称中是否包含相关关键字之一来清除特定工作表的特定部分。在每种情况下,工作表名称都会不同,但我要清除的任何工作表名称都将包含以下关键字之一。

我已经设置了一个单独的宏来清除每种情况下的单元格范围。如果工作表名称不包含任何关键字,我希望宏移动到下一个工作表。

我的最终目标是能够将其应用于许多不同的工作簿,因为我正在处理的项目按地区划分,每个地区有一个单独的 Excel 文件。

我一直在尝试的代码如下。当我 运行 代码时没有出现错误,代码似乎也没有 运行,实际上什么都没有发生!

任何指导或建议将不胜感激。

Sub Loop_Customer_Sheets()

    Dim ws As Integer
    Dim i As Integer

    ws = ActiveWorkbook.Worksheets.Count

    For i = 1 To ws
        If ActiveSheet.Name Like "*ABC*" Then
            Call ABCInfoClear
        ElseIf ActiveSheet.Name Like "*DEF*" Then
            Call DEFInfoClear
        ElseIf ActiveSheet.Name Like "*GHI*" Then
            Call GHIInfoClear
        Else:
        End If
    Next i
End Sub

“什么都没有发生”- 用您的代码修复问题:

您的问题是您正在循环 sheet 的 ,但您只检查 ActiveSheet,它永远不会改变!将您的代码替换为

ws = ActiveWorkbook.Worksheets.Count
For i = 1 To ws
    With ActiveWorkbook.WorkSheets(i)
        If .Name Like "*ABC*" Then
            ABCInfoClear
        ElseIf .Name Like "*DEF*" Then
            DEFInfoClear
        ElseIf ActiveSheet.Name Like "*GHI*" Then
            GHIInfoClear
        End If
    End With
Next i

注意:您不需要 Call 关键字,您可以像上面介绍的那样调用 subs。


替代解决方案

比拥有大量宏更好的选择可能是创建一个通用子类

Sub ClearRangeInSheet(rangeAddress As String, sh As WorkSheet)
    Dim myRange As Range
    Set myRange = sh.Range(rangeAddress)
    myRange.ClearContents
    ' Any other cell clearing code e.g. for formatting here
End Sub 

然后循环调用

Dim wsCount as Long
wsCount = ActiveWorkbook.WorkSheets.Count
For i = 1 to wsCount
    With ActiveWorkbook
        If .WorkSheets(i).Name Like "*ABC*" Then
            ' Always pass ".WorkSheets(i)", but change the range address as needed
            ClearRangeInSheet("A1:A20", .WorkSheets(i))
        ElseIf ' Other worksheet name conditions ...

        End If
    End With
Next I

正如评论中所建议的那样,您可以放弃 索引 sheets,而只循环遍历 sheet 对象本身:

Dim wksht as WorkSheet
For Each wksht In ActiveWorkbook.WorkSheets
    If wksht.Name Like "*ABC*" Then
        ' Always pass wksht but change the range address as needed
        ClearRangeInSheet("A1:A20", wksht)
    ElseIf ' Other worksheet name conditions ...

    End If
Next wksht