2022.01.07 更新
'字典由两个一维数组组成, 一个数组是键 数组名.keys,另一个是值 数组名.items, 都是 1行 [数组名.count]列的 数组, 因此[a1].resize(1,dic.count) = dic.items 输出为行
'所以想要以列的形式输出,需要用transpose转置,且相应的resize( dic.count , 1)
'当键值 为数组时, 数组名(键名) = array(a,b,c,d,e), 键值数组为 嵌套数组(m行)(n列)而不是二维数组, 需要通过转化成二维数组再输出
_______________________________________________________________
以下为原始笔记,不一定正确
Sub test()
Dim ary1
ReDim ary1(1 To 4, 1 To 3)
With Sheets("RL")
'表格输入到数组1
ary1 = .Range("O2:Q5")
Set d1 = CreateObject("scripting.dictionary")
For i = 1 To UBound(ary1)
'字典筛除重复键
If Not d1.exists(ary1(i, 1)) Then
d1(ary1(i, 1)) = Array(ary1(i, 1), Left(ary1(i, 2), 2), ary1(i, 3))
End If
Next i
Dim ary2
'必要,否则报错
it = d1.items
ReDim ary2(0 To d1.Count - 1, 0 To 2)
'键值数组输出到数组2
For m = 0 To d1.Count - 1
For n = 0 To 2
ary2(m, n) = it(m)(n)
Next n
Next m
'数组2输出到表格
.[F5].Resize(m, n) = ary2
End With
End Sub
理解:
'array(a,b,c)是一维数组,所以每个特定的键的值都是一个一维数组
d1(ary1(i, 1)) = Array(ary1(i, 1), Left(ary1(i, 2), 2), ary1(i, 3))
'后面的 it 不能直接用d1.items 代替,会报错
'it(0) = d1.(ary1(1,1)) = Array(ary1(i, 1), Left(ary1(i, 2), 2), ary1(i, 3)) 是一维 行数组
'it / keys / items 本身是一个 一维的 行数组!!! 所以直接输出需要 转置成 一维的 列数组!再输出
'例如[e1].Resize(dic.Count, 1) = Application.Transpose(dic.Keys)
'所以当 键值 为一维行数组 中嵌套 一维行数组 时, 不能简单地 resize(行数,列数) = items'
'如果理解为x-y-z三维坐标系的话,前者[excel]是二维(相当于x-y平面), 而后者是伪装成一维的二维(相当于x-z平面),y方向会溢出
'(因为我习惯excel所在的x-y平面,所以哪怕被强调键值是一维数组[即x轴],但是就是认定它是二维的[确实是二维的,不过是x-z平面的],所以总是将它误认为x-y平面,强行往excel的x-y平面里面塞)
'[我悟了,我已经超越三维生物了hhhhh]'
For m = 0 To d1.Count - 1
For n = 0 To 2
'ary2 将 it 这个 一维 列数组 转为 二维数组
'相当于 从x-z平面,转为x-y平面
ary2(m, n) = it(m)(n)
Next n
Next m