0

文字列の規則を使用して、個々の「ケース」に関する詳細レベルを伝えるスプレッドシートがあります。

規則は次のとおりです。文字列内のデータには5つの主要なカテゴリがあります。1 =カテゴリ、2 =ツール、3 =ドキュメント、4 =プロセス、5=ジョブエイド。

各カテゴリには、5つのカテゴリごとに1a、1b、1cまたは2a、2b、2cなどで分類された複数のサブカテゴリを含めることができます。

メインカテゴリは「:」でサブカテゴリから分離され、サブカテゴリは「」でサブカテゴリから分離されますが、サブカテゴリは「;」で新しいメインカテゴリから分離されます。

文字列の例: "1:1i; 2:2a; 3:3a、3d、3l; 4:4a"

値のカテゴリの内訳の例を次に示します。

CATEGORY    1
Incorrect:VG:QOC    1i

TOOLS   2
Macro:Used  2a

DOCUMENTATION   3
TAT:Missing 3a
ROUTING:Missing 3d
STORY:Missing Impact to Health  3i

PROCESS 4
CNX Checklist Not Used  4a

フラグが立てられたメインカテゴリとサブカテゴリをテキスト形式で引き出すことができるようにしたいと思います。

クエリの例:
すべての文字列のうち、メインカテゴリ4にフラグが立てられたのは何回ですか?フラグが立てられた4つすべてのうち、4aにフラグが立てられたのは何回ですか?1つの「ケース」または文字列でフラグが立てられたすべての要素は何でしたか?

文字列を作成することはできますが、解析することはできません。助けてください... :)

4

1 に答える 1

1

探している関数は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つのことを行う必要があります。

  1. 上記のコード(基本的には上記の内部にあるもの)を使用してVBAで関数またはサブを作成しSplitExample()、名前(のようなParseErrorCodes)を付けて、と呼ばれる文字列パラメーターを受け入れますinputString。次に、文字列を作成するメソッドから呼び出し(すでに実行できると言っています)、その文字列をメソッドに渡します。
  2. 結果の出力方法を決定します。事実上、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
于 2012-09-18T07:44:01.313 に答える