【问题标题】:Comparing worksheet Name in workbook to get total no of matched sheets比较工作簿中的工作表名称以获得匹配工作表的总数
【发布时间】:2017-09-23 12:41:10
【问题描述】:

我有以下代码来计算工作簿中特定工作表的总数。我使用 vbTextCompare 运算符(比较运算符)来匹配工作表的名称,如果它在那里,那么它将计算工作表的数量。但不幸的是,这与字符串不匹配。有什么帮助吗? 工作表名称按以下顺序 BQ1、BQ2、BQ3 ..... 以此类推..

Dim tSheets As Long
Dim WS As Worksheet

 i = 1
For Each WS In ThisWorkbook.Worksheets
    If StrComp(Left(WS.Name, 1), "BQ" & i, vbTextCompare) = 0 Then
        tSheets = tSheets + 1
        MsgBox WS.Name
            i = i + 1
    End If

Next WS

【问题讨论】:

    标签: vba excel vb6


    【解决方案1】:

    在这里,我使用 Left、Right 和 Len 重构了您的代码。

    Sub CountBQSheets()
        Const WSPrefix As String = "BQ"
        Dim tSheets As Long
        Dim ws As Worksheet
    
        For Each ws In ThisWorkbook.Worksheets
            If Left(UCase(ws.Name), Len(WSPrefix)) = WSPrefix Then
                If IsNumeric(Right(ws.Name, Len(ws.Name) - Len(WSPrefix))) Then
                    tSheets = tSheets + 1
                    MsgBox ws.Name
                End If
            End If
        Next ws
    End Sub
    

    我认为使用集合来收集名称会更有用。

    Sub Test_getWSPrefixList()
        Dim list As Object
        Set list = getWSPrefixList(ThisWorkbook, "BQ")
    
        Debug.Print Join(list.ToArray, ",")
    
    End Sub
    
    Function getWSPrefixList(wb As Workbook, WSPrefix As String) As Object
        Dim list As Object
        Dim ws As Worksheet
        Set list = CreateObject("System.Collections.ArrayList")
    
        For Each ws In ThisWorkbook.Worksheets
            If Left(UCase(ws.Name), Len(WSPrefix)) = WSPrefix Then
                If IsNumeric(Right(ws.Name, Len(ws.Name) - Len(WSPrefix))) Then
                    list.Add ws.Name
                End If
            End If
        Next ws
        Set getWSPrefixList = list
    End Function
    

    BQ20,BQ19,BQ18,BQ17,BQ16,BQ15,BQ14,BQ13,BQ12,BQ11,BQ10,BQ9,BQ8,BQ7,BQ6,BQ5,BQ4,BQ3,BQ2,BQ1
    

    【讨论】:

      【解决方案2】:

      您的代码有两个问题...

      1. 您正在将工作表名称的第一个字母与字符串变量“BQ”& i 进行比较。所以无论如何它都不会匹配。
      2. 第二个问题是,你在错误的地方增加了 i。它应该在 IF 块之外。

      试试这样的...

      Dim tSheets As Long
      Dim WS As Worksheet
      Dim i As Integer
      i = 1
      For Each WS In ThisWorkbook.Worksheets
          If StrComp(WS.Name, "BQ" & i, vbTextCompare) = 0 Then
              tSheets = tSheets + 1
              MsgBox WS.Name
          End If
          i = i + 1
      Next WS
      

      【讨论】:

      • 故意将 i 放入 if 块中。所以它应该只在找到匹配的字符串后增加 i 。顺便说一句,我找到了解决方案.. 我正在比较工作表名称的 1 个字母而不是 1,应该是 3
      • @Hola 在这种情况下,您应该使用计数器变量,一个用于动态构造工作表名称,另一个用于计算找到的工作表的出现次数,因为您只使用了一个计数器变量。是的,这就是我指出的,您只比较了工作表名称的第一个字母。如果您的问题已解决,请花一点时间接受答案,将您的问题标记为已解决。
      猜你喜欢
      • 1970-01-01
      • 2017-04-17
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多