从电子表格数据在VBA中创建数组

时间:2015-03-09 13:28:40

标签: arrays vba excel-vba excel

我有一个数据电子表格,我想将其放入VBA数组中,然后将唯一值输出到新工作表。到目前为止,我已经有了这个工作。但是,原始数据中的某些单元格用逗号分隔文本,我也希望将它们添加到数组中。我无法完成这项工作。

在各种' dours'之后,我的代码是

'Grabs the data to work with
Set rTable = Worksheets("Data Entry").Range("N1:N100", "P1:P100")
'Puts it into an array
MyArray = rTable.Value

'Sets where the data will end up
Set rCell = Worksheets("TestSheet").Range("A1:A100")


'Each unique entry gets added to the new array
On Error Resume Next
For Each a In MyArray
UnqArray.Add a, a
Next

'Add unique data to new location
For i = 1 To UnqArray.Count
rCell(i, 1) = UnqArray(i)
Next

我尝试过一个新的变体来存储拆分数据

SpArray = split(MyArray,", ")

然后在这里

MyArray = rTable.Value
SpArray = split(MyArray,", ")

然后引用SpArray代码的其余部分

我也试图将其作为

的一部分
For Each a in SpArray

但它对我不起作用。

在筛选出独特的单元格之前,是否需要对阵列的每个单元格进行单独的循环?

2 个答案:

答案 0 :(得分:0)

是的,你需要另一个循环。但是,如果您设置对Microsoft Scripting Runtime的引用并使用Dictionary对象,则可以消除写入该范围的循环,因为Dictionary.Keys返回一个数组。

在此示例中,它尝试拆分逗号上的每个条目,并将每个条目视为唯一条目。如果没有逗号,则Split返回一个值,以便它在两种情况下都有效。拆分不需要拆分的东西可能只需要很少的费用,但是在你的范围大得多之前你不会注意到。我认为它使代码更清晰。

Sub WriteUniques()

    Dim dcUnique As Scripting.Dictionary
    Dim vaData As Variant
    Dim vaSplit As Variant
    Dim i As Long, j As Long

    vaData = Sheet1.Range("$I$12:$I$62").Value
    Set dcUnique = New Scripting.Dictionary

    For i = LBound(vaData, 1) To UBound(vaData, 1)
        vaSplit = Split(vaData(i, 1), ",")
        For j = LBound(vaSplit) To UBound(vaSplit)
            If Not dcUnique.Exists(vaSplit(j)) Then
                dcUnique.Add vaSplit(j), vaSplit(j)
            End If
        Next j
    Next i

    Sheet1.Range("J12").Resize(dcUnique.Count, 1).Value = Application.Transpose(dcUnique.Keys)

End Sub

答案 1 :(得分:0)

对我有用的代码调整是将Split放在最后。

'Add unique data to new location
For i = 1 To UnqArray.Count
rCell(i, 1) = Split(UnqArray(i), ",")

Next

然后使用来自不同范围的数据构建一个数组,并在输出唯一的数据之前拆分逗号分隔的数组。