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