Re: [算表] VBA移除阵列中元素

楼主: nazomegami (深呼吸~)   2016-03-10 18:44:50
想请教各位版大,以下有一function,其作用是将item_range中的项目对number_range
进行累加并回传第rank_order大之项目名称,但有时会有两个项目的累加金额相同,这
时候如果使用match函数则只会取首位,因此会出现第1名和第2名皆为同一项目名称的问
题。
在下面程式中我if…then的方式进行判断,虽然可以解决这个问题,不过程式看起来有点
冗长,不知道有没有更为简短的写法? 谢谢!
Function inventory_rank4(item_range As Range, number_range As Range, _
rank_order As Integer) As String
Dim r As Range
Dim ary(10)
Dim w&, dic
Set dic = CreateObject("scripting.dictionary")
For Each r In item_range
If r <> "" Then If Not dic.exists(r.Value) Then _
dic.Add r.Value, r.Value: _
ary(w) = WorksheetFunction.SumIf(item_range, r, number_range): _
w = w + 1
Next
If rank_order = 1 Then
inventory_rank4 = dic.Items()(WorksheetFunction.Match( _
WorksheetFunction.Large(ary, rank_order), ary, 0) - 1)
Else
If WorksheetFunction.Large(ary, rank_order) = _
WorksheetFunction.Large(ary, rank_order - 1) Then
ary(WorksheetFunction.Match(WorksheetFunction.Large(ary, _
rank_order), ary, 0) - 1) = 0
inventory_rank4 = dic.Items()(WorksheetFunction.Match( _
WorksheetFunction.Large(ary, rank_order - 1), ary, 0) - 1)
Else
inventory_rank4 = dic.Items()(WorksheetFunction.Match( _
WorksheetFunction.Large(ary, rank_order), ary, 0) - 1)
End If
End If
End Function
作者: soyoso (我是耀宗)   2016-03-10 22:29:00
判断内有重复出现worksheetfunction.match(....)-1),这部部是否用个变量来带入数值
楼主: nazomegami (深呼吸~)   2016-03-11 06:54:00
我的逻辑是这样,如果是要选排名第1的,那就是走原做法;而如果遇到排名第n位与n-1位的金额相同,则将原本会match到位置的金额在阵列中设值为0,然后重新match后就会取到另一个位置;至于其他判断结果则和排名第1的方式一样走原做法。
作者: soyoso (我是耀宗)   2016-03-11 09:03:00
如要数值相同都一起表列的话,可以这样方式https://imgur.com/DlZvQVghttps://imgur.com/DdGsnqb
楼主: nazomegami (深呼吸~)   2016-03-12 07:36:00
受教了,谢谢!

Links booklink

Contact Us: admin [ a t ] ucptt.com