String Excel字符串解析

String Excel字符串解析,string,parsing,excel,vba,String,Parsing,Excel,Vba,我有一个电子表格,它使用字符串约定来传达单个“案例”的详细程度 约定如下:字符串中的数据有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

我有一个电子表格,它使用字符串约定来传达单个“案例”的详细程度

约定如下:字符串中的数据有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标记了多少次? 在一个“case”或字符串上标记的所有元素是什么


我可以构建字符串,但我无法解析它们。请帮忙……:)

您要查找的函数是(此链接用于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类来完成。(请参阅以获取从阵列中筛选重复项的帮助)

上面的代码只是一个示例,展示了需要做什么以及如何完成解析(因为这是您的特定请求)。要将其转化为工作代码,您需要做两件事:

  • 在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
    

    谢谢你的回复,这很有帮助。一个问题:如何将上述代码输入VBA?理想情况下,有一个具有多行代码的列的工作表。我需要提取所有代码并将它们转换为趋势,以进行根本原因分析,然后绘制最高缺陷区域(3a或3l)等。在我的示例中,我刚刚用示例字符串定义了一个字符串:
    inputString=“1:1i;2:2a;3:3a,3d,3l;4:4a”
    。你必须从另一个方法中输入一个特定的字符串,该方法读取你的输入(可能是excel电子表格)@user1005237我在我的答案中添加了一些更基本的用法细节。但其中大部分假设您对excel中的VBA有基本了解,以及如何调用方法和从excel电子表格和其他基本I/O读取/写入数据。