根据工作表名称

时间:2017-06-22 10:11:57

标签: excel-vba loops if-statement worksheet vba

我正在处理一个宏,它将遍历活动工作簿中的所有工作表,然后根据工作表名称中是否包含其中一个相关关键字来清除特定工作表的某个部分。在每种情况下,工作表名称都会有所不同,但我要清除的任何内容都将包含以下关键词之一。

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

我的最终目标是能够将其应用于众多不同的工作簿,因为我正在处理的项目按区域划分,每个区域都有一个单独的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

1 个答案:

答案 0 :(得分:0)

"什么都没发生" - 使用您的代码解决问题:

您的问题是您正在浏览工作表的编号,但您只是检查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关键字,您只需按上述方式调用潜在客户。

替代解决方案

比拥有多个宏更好的选择可能是创建像

这样的通用子
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

正如评论中所建议的,您可以放弃索引工作表,然后循环遍历工作表对象:

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