VBA Excel подсчитывает совпадения имен листов

#arrays #vba #excel

#массивы #vba #excel

Вопрос:

Я работаю над макрокомандой VBA, и в одном разделе мне нужно подсчитать количество электронных таблиц, но с изюминкой. Некоторые листы будут иметь одинаковые имена и будут считаться как лист, лист (1), лист (2). Мне нужно, чтобы эти листы считались как одна группа, чтобы листы были = 3, а не по отдельности.

Простой пример кода, который я нашел для иллюстрации:

 Sub aTest()

Dim myArray() As Variant, dict As Object
Dim i As Long, v As Variant
myArray=Array("Apple","Orange","Pineapple",
"Banana","Banana(1)","Apple","Banana(2)",
"Pineapple(1)","Pineapple(2)")
 Set dict = CreateObject("Scripting.Dictionary")

For i = LBound(myArray) To UBound(myArray)
    If dict.exists(myArray(i)) Then
        dict.Item(myArray(i)) = dict.Item(myArray(i))   1
    Else
        dict.Add myArray(i), 1
    End If
Next i

For Each v In dict.keys
    MsgBox v amp; " " amp; dict.Item(v)
Next v

End Sub
  

Яблоки учитываются как 2, а апельсин — как 1, но бананы и ананасы
учитываются по отдельности, а не как группа. Что мне нужно, чтобы
счетчик игнорировал «(#)» в конце этих листов?

Ответ №1:

Посмотрите на элемент массива и проверьте наличие «(«. Если вы его найдете, удалите эту часть текста, прежде чем выполнять саму проверку.

Это должно делать то, что вам требуется. Дайте мне знать, если вам нужна дополнительная информация.

 Sub aTest()

Dim myArray() As Variant, dict As Object
Dim i As Long, v As Variant, bracketPos As Long

myArray = Array("Apple", "Orange", "Pineapple", "Banana", "Banana(1)",  _
            "Apple", "Banana(2)", "Pineapple(1)", "Pineapple(2)")
Set dict = CreateObject("Scripting.Dictionary")

For i = LBound(myArray) To UBound(myArray)
    bracketPos = InStr(myArray(i), "(")
    If bracketPos > 0 Then
        myArray(i) = Left(myArray(i), bracketPos - 1)
    End If

    If dict.Exists(myArray(i)) Then
        dict.Item(myArray(i)) = dict.Item(myArray(i))   1
    Else
        dict.Add myArray(i), 1
    End If
Next i

For Each v In dict.keys
    Debug.Print v amp; " " amp; dict.Item(v)
Next v

End Sub
  

Это приводит к следующему результату:

 Apple 2
Orange 1
Pineapple 3
Banana 3
  

Комментарии:

1. Спасибо, Дэйв! «bracketPos» был тем, что я искал. Я знал, что есть какой-то способ его идентифицировать, просто не мог придумать его навскидку.