【发布时间】:2019-03-08 04:38:56
【问题描述】:
背景:
为了更好地理解动态多维数组,我试图构建一个来捕获唯一值并计算唯一值的出现次数(我应该能够使用 countif 快速验证这一点)。
在阅读有关尝试 redim 保留多维数组的信息时,我读到您只能对最后一个参数进行 redim,因此我尝试设置 2 个参数,其中第一个是唯一值,第二个是计数:arr(2,k)。如果我的理解是错误的,那也很重要。
我放入第 3 列(唯一 ID)和第 4 列(出现次数)的数组的最终输出。
问题:
向数组添加值时,我无法收集所有唯一值。当数据中有 6 个时,我已经能够收集 3 个唯一值,并且每个值的出现都保持在 1,例如,不迭代。
问题:
抱歉,这基本上是 2 个问题...
1) 我使用 redim preserver arr(2,0 to k) 的语法合适吗?
2) 我的动态数组生成是否存在明显问题,这可以解释为什么我没有捕获所有唯一值?
我可以问第三个关于为什么我不能让发生计数起作用,但我希望如果我理解上述问题,我希望能够通过这部分努力。
数据是什么样子的:
所有数据都在 A 列中
cat
dog
mouse
cat
mouse
bear
frog
cat
moose
cat
dog
有问题的代码:
Option Explicit
Private Sub unique_arr()
Dim arr As Variant, i As Long, lr As Long, k As Long
lr = Cells(Rows.Count, 1).End(xlUp).Row
ReDim arr(2, k)
For i = 1 To lr
If Application.IfError(Application.Match(Cells(i, 1).Value, arr, 0), 0) = 0 Then
ReDim Preserve arr(2, 0 To k)
arr(1, k) = Cells(i, 1).Value
arr(2, k) = 1
k = k + 1
Else
arr(2, Application.Match(Cells(i, 1), arr(1), 0)) = arr(2, Application.Match(Cells(i, 1), arr(1), 0)) + 1
End If
Next i
For i = LBound(arr) To UBound(arr)
Cells(i + 1, 3).Value = arr(1, i)
Cells(i + 1, 4).Value = arr(2, i)
Next i
End Sub
【问题讨论】:
-
...事后看来,我可以将 Match() 用于上述数据,并且仅在找到时才添加,例如 application.match(cells(i,1).value,range( cells(1,1),cells(i-1,1)),0)... 但需要从第 2 行开始以避免错误
-
这必须是 VBA 吗?数据透视表可以快速轻松地做到这一点。
-
@tigeravatar 这纯粹是为了帮助理解如何通过(相对)简单的过程来引用/使用多维数组。我知道有更简单的方法来执行这项特定任务,但可以这么说,这是我觉得可以为我带来最大收益的方法。