探している関数はSplitです(このリンクはVB関数用ですが、動作はVBAでも実質的に同じです)。特定の文字列を渡して区切り文字を指定すると、各値の配列が返されます。
あなたの場合、文字列には複数の区切り文字があるため、複数回実行する必要があります。
最初の潜在的な問題は、特定のカテゴリのサブカテゴリがない場合はどうなるでしょうか。文字列内の各カテゴリに少なくともサブカテゴリが常にある場合は問題ありませんが、サブカテゴリがない可能性がある場合は、最高レベルのグループ化が引き続き。で区切られていることを確認する必要があります;
。
情報がユーザーにどのように表示されるかを指定しなかったため、次の例では、Excelの中間ウィンドウで期待しているように聞こえるものに近いものを印刷します。
Option Explicit
Sub SplitExample()
Dim inputString As String
Dim categories() As String
Dim subCategories() As String
Dim individualSubCat() As String
Dim cat As Variant
Dim subCat As Variant
Dim cnt As Integer
inputString = "1:1i;2:2a;3:3a,3d,3l;4:4a"
categories = Split(inputString, ";")
For Each cat In categories
subCategories = Split(cat, ":")
If UBound(subCategories) >= 0 Then
Debug.Print ("Category " & subCategories(0))
If UBound(subCategories) > 0 Then
individualSubCat = Split(subCategories(1), ",")
Debug.Print (vbTab & "Has " & UBound(individualSubCat) - LBound(individualSubCat) + 1 & " flag(s)")
For Each subCat In individualSubCat
Debug.Print (vbTab & subCat & " was flagged " & CountSubCategory(individualSubCat, subCat) & " time(s)")
Next
Else
Debug.Print (vbTab & "No Subcategories flagged")
End If
Debug.Print ("")
End If
Erase subCategories
Erase individualSubCat
Next
End Sub
サブカテゴリを簡単にカウントする機能です
Private Function CountSubCategory(individualSubCategories() As String, ByVal subCat As String) As Integer
Dim cnt As Integer
Dim value As Variant
cnt = 0
For Each value In individualSubCategories
If value = subCat Then cnt = cnt + 1
Next
CountSubCategory = cnt
End Function
また、サンプルの文字列を入力として使用すると、上記のコードは次のように出力されます。
Category 1
Has 1 flag(s)
1i was flagged 1 time(s)
Category 2
Has 1 flag(s)
2a was flagged 1 time(s)
Category 3
Has 3 flag(s)
3a was flagged 1 time(s)
3d was flagged 1 time(s)
3l was flagged 1 time(s)
Category 4
Has 1 flag(s)
4a was flagged 1 time(s)
上記のコードは、重複している場合でも、すべてのフラグを出力します。あなたはそれが望ましい行動であるかどうかを言いませんでした。配列からの重複のフィルタリングまたはグループ化は簡単ではありませんが、VBAのCollectionまたはDictionaryクラスを使用して行うのが最適です。(配列からの重複のフィルタリングについては、この質問を参照してください)。
上記のコードは、実行する必要があることと、解析を実行する方法を示すための単なる例です(これは、特定の要求でした)。これを実際に機能するコードにするには、次の2つのことを行う必要があります。
- 上記のコード(基本的には上記の内部にあるもの)を使用してVBAで関数またはサブを作成し
SplitExample()
、名前(のようなParseErrorCodes
)を付けて、と呼ばれる文字列パラメーターを受け入れますinputString
。次に、文字列を作成するメソッドから呼び出し(すでに実行できると言っています)、その文字列をメソッドに渡します。
- 結果の出力方法を決定します。事実上、
Debug.Print
線をどこかに結果を出力するものに置き換えます(おそらく、探しているグラフを作成できるように、別のExcelスプレッドシートに)。
基本的な考え方は次のとおりです。
Sub OutputErrorCodes()
Dim inputString as String
' You code to read your string values from where-ever you keep them
' and build the inputString
' this source could be a file, or a worksheet in the Excel Workbook
' or could be an external datasource like a database or even an internet
' location
' once you build your inputString, you just need to call ParseErrorCodes
ParseErrorCodes inputString
End Sub
Sub ParseErrorCodes(input as String)
' MyCode from above with some modifications
' - You need to remove the Dim for inputString and the assignment for
' inputString
' - You need to replace the Debug.Print lines with your method of
' defining the output
' * this can be via outputing directly to an excel spreadsheet or
' maybe a global variable
' * outputing to an excel spreadsheet would probably be the best
' option and allow for more dynamic flags, but you need to decide
' where to output it in the code
End Sub
Private Function CountSubCategory(individualSubCategories() As String,
ByVal subCat As String) As Integer)
' this code can probably be taken directly from my example
End Function