谢谢S大的回复,第二个版本比较简洁,而且我测试成功,第一个版本是我原本的结构,
后来结果还是失败。不过这里我还是有几个问题想要请教:
1.item_range一开始没有定义它是二维阵列,为什么后来又要用item_range(i,1),而且
如果不这样用还跑不出结果。
2.sub模式有逐步执行的功能,但function模式似乎没有? 没有办法看到分段执行结果真
的很难侦错。
3.在function模式中修改语法后如何使储存格中的值重新计算?
以上问题请多指教,谢谢!!
※ 引述《nazomegami (深呼吸~)》之铭言:
: 软件:excel vba
: 版本:2010
: 各位大大好,以下我有一个function,item_range为储存格(如A1:A10),内容为文字串,
: 如"A", "B", "A", "B", "B", "C", "B", "C", "D", "B",而number_range亦为储存格
: (如B1:B10),内容为数字,如1, 2, 3, 4, 5, 6, 7, 8, 9, 10。
: 今天想要计算各item_range的项目(以取唯一值)之累加金额,并回传金额第k大(rank_
: order)之项目名称,我之前以虚拟阵列在Sub中执行都没有问题,但是改以Function就
: 执行不出结果,想要请问一下我哪里做错了?(变量定义?) 谢谢!
: Function inventory_rank(item_range() As Variant, number_range() As Variant,
: rank_order As Integer) As String
: Dim c, d, str1, str2
: Dim ary1$(), ary2(100), ary3(100)
: '求算资料笔数(阵列上限+1)
: c = UBound(item_range)
: '若某字串a(i)在组合字串(str)中没有出现才会被加入组合字串(str)中
: For i = 0 To c
: If InStr(str1, item_range(i)) = 0 Then
: str1 = str1 & "," & item_range(i)
: End If
: Next
: '将第2位开始之字串转换为阵列
: ary1 = Split(Mid(str1, 2), ",")
: '求算不重复项目之个数(阵列上限+1)
: d = UBound(ary1)
: '求算不重复项目之累加金额
: For i = 0 To d
: ary2(i) = ary1(i)
: ary3(i) = Evaluate("sum(if({""" & Join(item_range, """,""") & """}="""
: & ary1(i) & """, {" & Join(number_range, ",") & "}))")
: Next
: '求算第k位金额之项目名称
: inventory_rank = Application.WorksheetFunction.Index(ary2, Application.
: WorksheetFunction.Match(Application.WorksheetFunction.
: Large(ary3, rank_order), ary3, 0))
: End Function
作者: soyoso (我是耀宗) 2016-03-03 23:33:00
问题1,暂无找到说明;如要一维的话,可用worksheetfunction.transpose([a1:a10])的方式问题2,可先设中断点,接着到资料编辑列(公式列)内按下nter,就可以侦错;但设中断点处前如有错误产生时则会因无法执行到中断点,而无作用问题3,可于工作表按f9重新计算问题1,查了一下,则是这样说明到,储存格范围是栏列的二维表格,可使用二维阵列来完成。在vba中,只要将variant型态变量设为储存格范围的值,变量就会自动成为二维阵列的变量