求助数组

时间:2019-06-07 21:04:28

标签: arrays excel vba string

我收到的数据需要以以下格式的字符串输出:

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

2 个答案:

答案 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

结果是:

enter image description here

答案 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