【问题标题】:converting 11*2 array based on unique values and value assignment根据唯一值和赋值转换 11*2 数组
【发布时间】:2018-01-17 10:54:36
【问题描述】:

我需要一个函数,它接受一个 n*2 输入数组并生成 n*2 输出数组,它的第一列元素是输入数组第一列的唯一值,第二列元素是对应于这些唯一值的数字的总和价值观。

Sub test()
Dim arm(11, 1) As Variant
Dim tempar() As Variant
ReDim tempar(0 To UBound(arm, 1), 0 To UBound(arm, 2)) As Variant

arm(0, 0) = "banana"
arm(1, 0) = "banana"
arm(2, 0) = "banana"
arm(3, 0) = "apple"
arm(4, 0) = "apple"
arm(5, 0) = "banana"
arm(6, 0) = "cucumber"
arm(7, 0) = "cucumber"
arm(8, 0) = "cucumber"
arm(9, 0) = "apple"
arm(10, 0) = "cucumber"
arm(11, 0) = "a"

arm(0, 1) = 5
arm(1, 1) = 4
arm(2, 1) = 3
arm(3, 1) = 2
arm(4, 1) = 5
arm(5, 1) = 3
arm(6, 1) = 2
arm(7, 1) = 4
arm(8, 1) = 5
arm(9, 1) = 1
arm(10, 1) = 1
arm(11, 1) = 3

tempar() = unqfiladv(arm)

End Sub  

结果数组必须是:

香蕉 15
苹果 8
黄瓜 12
一个 3

【问题讨论】:

  • 我想你的意思是 n*2 变成 m * 2 (或其他字母)来表示第一个维度实际上可以改变大小?
  • 请参阅此处以从 dict stackoverflow.com/questions/21432222/… 检索键和值。请注意,可以转置的大小有限制。
  • 创建与第一个具有相同维度的第二个数组,将第一个数组循环添加到字典中,例如香蕉,1(如果存在添加到与键关联的值,即当前值+新值)。转置数组,使第 2 个暗淡变为第 1 个。然后将第二个数组的第二维重新调整为 dict 键的计数,重新转置数组,然后将字典清空到数组中。请参阅此处以从 dict stackoverflow.com/questions/21432222/...中检索键和值。请注意,可以转置的大小有限制。
  • 更简单的选择可能是合并它们excel-easy.com/examples/consolidate.html

标签: arrays vba sum elements non-repetitive


【解决方案1】:

这是我所描述的一个例子。

循环第一个数组并将水果和值添加到字典中。这将确保唯一的水果名称,用作键,并且可以通过简单地添加到现有值来添加值,如果键(水果)已经存在于字典中,否则以正常方式添加。

转置数组以允许交换维度(因为您只能调整第二个维度的大小。使用 Transpose 可以执行的项目数量有限制)。

您应该真正将其分离为单独的函数/过程调用,例如,将项目添加到字典可能是它自己的函数。字典键值的检索按照@Peter Albert.

Option Explicit

Sub Test()

Dim arr1(0 to 5, 0 to 1)
Dim arr2()

arr1(0,0) = "Banana"
arr1(1,0) = "Banana"
arr1(2,0) = "Apple"
arr1(3,0) = "Banana"
arr1(4,0) = "Orange"
arr1(5,0) = "Orange"

arr1(0,1) = 1
arr1(1,1) = 2
arr1(2,1) = 3
arr1(3,1) = 4
arr1(4,1) = 5
arr1(5,1) = 6

Dim fruitDict As New Scripting.Dictionary 'required reference to MS Scripting Runtime

Dim i as Long

For i = LBound(arr1,1) to UBound(arr1,1)

    If fruitDict.Exists(arr1(i,0)) Then

        fruitDict(arr1(i,0)) = fruitDict(arr1(i,0)) + arr1(i,1)

    Else

       fruitDict.Add arr1(i,0) , arr1(i,1)

    End If

Next i

ReDim arr2(0 to 1, 0 to FruitDict.Count - 1)

arr2 = Application.WorksheetFunction.Transpose(arr2)

Dim key As Variant
Dim counter As Long
counter = 1

For Each key in fruitDict.Keys

    arr2(counter,1) = key
    arr2(counter,2) = fruitDict(key)
    counter = counter + 1

Next key

End Sub

【讨论】:

  • 代码返回错误9-下标超出范围。例如当:msgbox arr2(x,y)。此外,在填充第二列时,我们似乎可以用 arr1 替换 arr。
  • 一开始我打错了。你现在可以检查吗?如果没有,你能不能写一个pastebin,这样我就可以看到你的版本中的错误在哪里。输入作业时,我刚刚错过了 1 off arr1。
  • 转置将开始移动到 1 而不是 0。如果你把 STOP 放在 Msgbox 之前,运行代码然后在本地窗口中查看 arr2 你会看到变化。起始值变为 arr2(1,1)。抱歉,我应该提到这一点。
  • 您可以简单地将 ReDim arr2(1 to 2, 1 to FruitDict.Count ) 但您仍然需要从 (1,1) 访问
  • 谢谢 QHarr!有用。我认为第一个 redim 行是可以省略的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 2021-10-14
  • 2015-11-15
相关资源
最近更新 更多