首页>Program>source

我有一个电子表格,该电子表格使用字符串约定来传达有关各个"案例"的详细程度。

约定如下:字符串中的数据有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月前
    1 #

    您要查找的函数是Split(此链接用于VB函数,但其​​行为在VBA中实际上是相同的).您可以向其传递一个特定的字符串并指定分隔符,它将返回每个值的数组。

    在您的情况下,由于您的字符串具有多个定界符,因此您需要执行多次。

    第一个潜在的问题是,如果您没有给定类别的子类别,该怎么办? 如果您的字符串中的每个类别始终至少有一个子类别,那很好,但是,如果有可能没有子类别,那么您需要确保您的最高级别分组仍由 ;分隔

    由于您没有说明如何将信息呈现给用户,因此下面的示例将在Excel的中间窗口中print出与您期望的内容接近的内容。

    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
    

    并使用您的示例字符串作为输入,将print以上代码:

    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)
    

    以上代码将print每个标志,即使有重复也是如此.您没有说这是否是理想的行为.从数组中过滤或分组重复项并不简单,但是最好使用VBA中的Collection或Dictionary类来完成. (请看这个问题,以帮助过滤掉数组中的重复项。

    上面的代码只是一个示例,显示需要完成的工作以及如何完成解析(这是您的特定请求).要将其实际用作工作代码,您需要做两件事:

    在VBA中使用上面要解析的代码创建一个Function或Sub(基本上是 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
    

  • c#:Xamarin ios屏幕截图和电子邮件
  • 创建可以包含任何类型的一个变量的Java类