我收到的数据需要以以下格式的字符串输出:
123 - A, B, C
234 - A
345 - B
567 - B, C
789 - C
我得到的数据按字母(A,B或C)排序,然后按数字提供给我。所以我有三个动态数组,如:
ArrayA(1) = 123
ArrayA(2) = 234
ArrayB(1) = 345
ArrayB(2) = 123
ArrayB(3) = 567
ArrayC(1) = 123
ArrayC(2) = 789
ArrayC(3) = 567
请注意,对应于给定数组中特定3位数字的索引不一定对应于相同的3位数字,例如ArrayA(1)= 123 = ArrayB(2)。
数组的长度是任意的(A,B或C中可以有任意数量的数字),但是只有三个数组。
这使得输出诸如以下内容变得容易:
123 - A
234 - A
345 - B
123 - B
567 - B
123 - C
789 - C
567 - C
但这不是我想要的结果。
我需要使用以下格式:
123 - A, B, C
234 - A
345 - B
567 - B, C
789 - C
要直接解决此问题,下面是一些生成“ easy”字符串的代码:
Dim ArrayA(2), ArrayB(3), ArrayC(3) As Integer, Output As String
ArrayA(1) = 123
ArrayA(2) = 234
ArrayB(1) = 345
ArrayB(2) = 123
ArrayB(3) = 567
ArrayC(1) = 123
ArrayC(2) = 789
ArrayC(3) = 567
For i=1 to 2
Output = Output & ArrayA(i) & " - A" & vbNewLine
Next i
For i=1 to 3
Output = Output & ArrayB(i) & " - B" & vbNewLine
Next i
For i=1 to 3
Output = Output & ArrayC(i) & " - C" & vbNewLine
Next i
MsgBox(Output)
如上所述,我希望移动格式,使其以三位数而不是字母来组织。
我在解决方案上的最佳尝试是尝试将数据写入excel工作表,对其进行适当的排序,然后将其拉回到VBA中,这似乎很丑陋。例如:
For i=1 to Len(ArrayA)+Len(ArrayB)+Len(ArrayC)
If i < Len(ArrayA) Then
Range("A:"&i).Value = ArrayA(i)
Range("B:"&i).Value = "A,"
End If
If i > Len(ArrayA) And i <= Len(ArrayA) + Len(ArrayB) Then
Range("A:"&i).Value = ArrayB(i)
Range("B:"&i).Value = Range("B:"&i).Value & "B,"
End If
if i >= Len(ArrayA)+Len(ArrayB) Then
Range("A:"&i).Value = ArrayC(i)
Range("B:"&i).Value = Range("B:"&i).Value & "C,"
Next i
然后我可以对它进行排序,搜索出重复项,并将其正确组合,最后得到正确的输出:
123 - A, B, C
234 - A
345 - B
567 - B, C
789 - C
答案 0 :(得分:0)
尝试以下操作:
git branch --show-current
仅供参考,我在阵列中填充了以下内容:
Sub PopulateFromArrays()
Call WriteArray(ArrayA, "A")
Call WriteArray(ArrayB, "B")
Call WriteArray(ArrayC, "C")
End Sub
Function WriteArray(MyArray, MyString)
i = 2
For j = LBound(MyArray) To UBound(MyArray)
ValueFound = False
k = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row
For i = 2 To k
If Range("A" & i).Value = MyArray(j) Then
Range("B" & i).Value = Range("B" & i).Value & ", " & MyString
ValueFound = True
Exit For
End If
Next i
If ValueFound = False Then
Range("A" & k + 1).Value = MyArray(j)
Range("B" & k + 1).Value = MyString
End If
Next j
End Function
结果是:
答案 1 :(得分:0)
好像是字典的好用例:
ArrayA(1) = 123
ArrayA(2) = 234
ArrayB(1) = 345
ArrayB(2) = 123
ArrayB(3) = 567
ArrayC(1) = 123
ArrayC(2) = 789
ArrayC(3) = 567
'...
Dim e, dictArrays, dictOut, k
Set dictArrays = Createobject("scripting.dictionary")
Set dictOut = Createobject("scripting.dictionary")
dictArrays.Add "A", ArrayA
dictArrays.Add "B", ArrayB
dictArrays.Add "C", ArrayC
For Each k in dictArrays.Keys
For Each e in dictArrays(k)
If dictOut.Exists(e) then
dictOut(e) = dictOut(e) & "," & k
Else
dictOut.Add e, k
End If
Next e
Next k
'output the result
For Each k in dictOut.Keys
Debug.Print k, dictOut(k)
Next k