#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» был тем, что я искал. Я знал, что есть какой-то способ его идентифицировать, просто не мог придумать его навскидку.