解析逗号分隔的序列号字符串

时间:2019-03-23 15:50:12

标签: excel vba string

我想对如何为我的方案编写VBA编码的解决方案提供一些指导/帮助,详细信息如下。我对VBA编码非常满意-我真的在寻找有关如何解决该问题的建议,而不是任何特定的解决方案。

我的部门承担着令人羡慕的日常标签制作任务。我们收到了来自Production的电子表格,其中包含要打印的一个或多个序列号单元格(以下示例)。数字通常不是连续的,但是基本的(人工生成的)“格式”是相同的(范围的连字符,单个数字的逗号)。下例中的序列号是6位数字,但是长度通常不同,这增加了复杂性。我正在寻找有关如何最终将cell.text解析为序列号的完整列表的反馈,这些列表可以最终用作我们的标签打印机软件的来源。

再次,我认为我有能力对此进行实际编码;我在问如何解析cell.value(s),根据需要标识空格,逗号和连字符,以及以任何可用格式检索序列号列表。我可以用逗号分隔,并且可以在连字符前后对范围进行编码。如何处理6位数格式,以及前三个字符的更改(364-365,可能很多)。

示例电子表格CELL.VALUE:“ 364701-703、705、706、708-710、365100-104、121 ”是对14个标签的请求:

期望的加速结果: 364701、364702、36703、364705、364706、364708、364709、364710、365100、365101、365102、365013、350104、365121

3 个答案:

答案 0 :(得分:0)

您可以按照自己的方式对其进行编码,然后将其发布到https://codereview.stackexchange.com/,然后您可以看到其他人如何使用它。

我没有任何启发性的建议,所以我只向您展示我将如何做。拆分非常容易,您只需跟踪丢失的前三个数字即可。

Public Sub GenerateSerialNumbers(ByVal sNumbers As String)

    Dim vaComma As Variant, vaHyph As Variant
    Dim i As Long, j As Long
    Dim lPrefix As Long, lStart As Long, lEnd As Long
    Dim sInput As String
    Dim dc As Scripting.Dictionary

    Set dc = New Scripting.Dictionary
    vaComma = Split(sNumbers, ",")

    For i = LBound(vaComma) To UBound(vaComma)
        sInput = Trim$(vaComma(i))

        If InStr(1, sInput, "-") > 0 Then
            vaHyph = Split(sInput, "-")

            'If you get a full one, keep the first three
            If Len(vaHyph(0)) = 6 Then lPrefix = Val(Left$(sInput, 3)) * 1000

            'Add the prefix if needed
            lStart = Val(vaHyph(0))
            If lStart < 1000 Then lStart = lPrefix + lStart
            lEnd = Val(vaHyph(1))
            If lEnd < 1000 Then lEnd = lPrefix + lEnd
        Else
            If Len(sInput) = 6 Then lPrefix = Val(Left$(sInput, 3)) * 1000
            lStart = Val(sInput)
            If lStart < 1000 Then lStart = lPrefix + lStart
            lEnd = lStart
        End If

        'Generate the list
        For j = lStart To lEnd
            dc.Add j, j
        Next j

    Next i

    Sheet1.Range("a1").Resize(dc.Count, 1).Value = Application.Transpose(dc.Items)

End Sub

答案 1 :(得分:0)

尝试一下:

Function trlMyString(myString As String) As String
    On Error GoTo trlMyStringError

    Dim i As Integer
    Dim j As Integer

    Dim helpArray() As String
    Dim strg As String

    Dim label1 As String
    Dim label2 As String

    strg = ""

    helpArray() = Split(myString, ", ")
    For i = LBound(helpArray) To UBound(helpArray)
        If Len(helpArray(i)) > 3 And InStr(1, helpArray(i), "-") <> 4 Then
            label1 = Left$(helpArray(i), 3)
            helpArray(i) = Right$(helpArray(i), Len(helpArray(i)) - 3)
        End If
        If InStr(1, helpArray(i), "-") > 0 Then
            For j = CInt(Left$(helpArray(i), 3)) To CInt(Right$(helpArray(i), 3))
                'Debug.Print CInt(Left$(helpArray(i), 3)), CInt(Right$(helpArray(i), 3))
                label2 = Trim$(Str$(j))
                strg = strg & label1 & label2 & ", "
            Next j
        Else
            label2 = helpArray(i)
            strg = strg & label1 & label2 & ", "
        End If
    Next i

    'Debug.Print strg

    trlMyStringExit:
    trlMyString = strg
    Exit Function
    trlMyStringError:
    Resume trlMyStringExit
End Function

答案 2 :(得分:0)

这只是您如何跟踪事物的问题。

给出您的数据,以下内容将输出您想要的。您会注意到我添加了一个序列号项目,因为您的样本中仅列出了范围:

class Person

以上内容仅适用于您提供的六位数序列号。我有理由确定可以对可变性进行编码,但是在不知道可变性如何变化的情况下(可变部分是固定部分,可变部分是可变部分),很难提供一种适合所有解决方案的单一尺寸。