作者nazomegami (深呼吸~)
看板Office
标题Re: [算表] VBA Function变数定义问题
时间Thu Mar 3 21:33:13 2016
谢谢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
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.39.54.158
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Office/M.1457011995.A.2EE.html
1F:→ soyoso: 问题1,暂无找到说明;如要一维的话,可用 03/03 23:33
2F:→ soyoso: worksheetfunction.transpose([a1:a10])的方式 03/03 23:33
3F:→ soyoso: 问题2,可先设中断点,接着到资料编辑列(公式列)内按下 03/03 23:34
4F:→ soyoso: nter,就可以侦错;但设中断点处前如有错误产生时则会因无 03/03 23:34
5F:→ soyoso: 法执行到中断点,而无作用 03/03 23:34
6F:→ soyoso: 问题3,可於工作表按f9重新计算 03/03 23:38
7F:→ soyoso: 问题1,查了一下,则是这样说明到,储存格范围是栏列的二 03/03 23:51
8F:→ soyoso: 维表格,可使用二维阵列来完成。在vba中,只要将variant 03/03 23:51
9F:→ soyoso: 型态变数设为储存格范围的值,变数就会自动成为二维阵列的 03/03 23:52
10F:→ soyoso: 变数 03/03 23:52
11F:→ nazomegami: 受教了,谢谢你,我今天再试试。 03/04 06:40
12F:→ nazomegami: 我想要问一下,若阵列只有一个元素,则ubound()函数 03/04 21:14
13F:→ nazomegami: 应会回传0,但是我在测试时只要遇到一个元素的阵列就 03/04 21:14
14F:→ nazomegami: 会在ubound()函数这里停下来。 03/04 21:14
15F:→ nazomegami: 我知道只有一个元素的阵列没有什麽好比较大小的,只是 03/04 21:15
16F:→ nazomegami: 很好奇为什麽会出现这样的结果? 03/04 21:15
17F:→ soyoso: 只有一个储存格时读入时,会以字串string型态,所以会有 03/04 21:47
18F:→ soyoso: 错误而停下无法向下执行,可加上range.rows.count判断 03/04 21:48
20F:→ nazomegami: 了解了,谢谢你! 03/05 11:36