我有一个数据电子表格,我想将其放入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
但它对我不起作用。
在筛选出独特的单元格之前,是否需要对阵列的每个单元格进行单独的循环?
答案 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
然后使用来自不同范围的数据构建一个数组,并在输出唯一的数据之前拆分逗号分隔的数组。