2016-10-04 13 views
0

私はVBAマクロで作業していますが、1つのセクションでスプレッドシートの数を数えるために必要です。ワークシートの中には、シート、シート(1)、シート(2)と同じ名前でカウントされるものがあります。これらのシートは に1つのグループとしてカウントされるので、シートは個別にではなく3つになります。VBA Excelのカウント同じシート名Occurences

Iを示すことが見出されたコードの簡単な例:

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 & " " & 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 & " " & dict.Item(v) 
Next v 

End Sub 

これは次の出力を生成します。!。

Apple 2 
Orange 1 
Pineapple 3 
Banana 3 
+1

おかげデイブ「bracketPosは、」私が探していたものだった、私はちょうどcouldn、それを識別するためのいくつかの方法があることを知っていました思うそれはオフハンドです。 –

関連する問題