Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: vbamaster

Application.SumIf和WorksheetFunction.SumIf之间的区别

  [复制链接]
 楼主| 发表于 2012-4-30 22:37 | 显示全部楼层
本帖最后由 vbamaster 于 2012-4-30 23:03 编辑

游客,如果您要查看本帖隐藏内容请回复

回复

使用道具 举报

发表于 2012-4-30 23:05 | 显示全部楼层
vbamaster 发表于 2012-4-30 08:00
arr = Application.SumIf(Range("a2:a10000"), Array("B", "C", "G", "R"), Range("B2:B10000"))
我用的 ...


My appology for typing English as I'm at work.

I tried office PC (WINXP + Excel 2003) and I got the same result as what I got from my home PC (WIN7 + Excel 2003).


  1. Sub test1()
  2.     Dim arr
  3.     arr = Application.SumIf(Range("a2:a10000"), Array("B", "C", "G", "R"), Range("B2:B10000"))
  4.     Debug.Print TypeName(arr)
  5.     Debug.Print arr
  6. End Sub
复制代码

I got error message: Run-time error '13': Type mismatch
and TypeName(arr) is Variant


  1. Sub test2()
  2.     Dim arr
  3.     arr = Application.Sum(Application.SumIf(Range("a2:a10000"), Array("B", "C", "G", "R"), Range("B2:B10000")))
  4.     Debug.Print TypeName(arr)
  5.     Debug.Print arr
  6. End Sub
复制代码
  1. Sub test3()
  2. Dim arr
  3.     arr = WorksheetFunction.Sum(Application.SumIf(Range("a2:a10000"), Array("B", "C", "G", "R"), Range("B2:B10000")))
  4.     Debug.Print TypeName(arr)
  5.     Debug.Print arr
  6. End Sub
复制代码

For both test2 and test3 - I got the same and correct results!
TypeName(arr) is Double (in both tests)

Why this happened I've no idea - this could be another interesting topic for anther day. However you should get my point about the difference between Application and Worksheetfunction.
回复

使用道具 举报

 楼主| 发表于 2012-4-30 23:15 | 显示全部楼层
adders 发表于 2012-4-30 23:05
My appology for typing English as I'm at work.

I tried office PC (WINXP + Excel 2003) and I g ...

adders老师,你好。
这么晚还在工作啊,你是在国内吗?
你的问题我了解了一下,代码如下:
Sub test1()
    Dim arr, x
    arr = Application.SumIf(Range("a2:a10000"), Array("B", "C", "G", "R"), Range("B2:B10000"))
    Debug.Print TypeName(arr)
    For x = 1 To 4
        Debug.Print arr(x)
    Next x
End Sub
我的理解是,因为arr最后返回的是一个数组,所以用相应的数组的方式才可正确输出,你向上面这样改下代码,运行就没有问题了。
回复

使用道具 举报

发表于 2012-4-30 23:31 | 显示全部楼层
vbamaster 发表于 2012-4-30 10:15
adders老师,你好。
这么晚还在工作啊,你是在国内吗?
你的问题我了解了一下,代码如下:

Nice, it works, thank you! I guess I was short-minded on how to read array output...

And yes I'm not in China it's office hour here.
回复

使用道具 举报

 楼主| 发表于 2012-4-30 23:39 | 显示全部楼层
adders 发表于 2012-4-30 23:31
Nice, it works, thank you! I guess I was short-minded on how to read array output...

And yes I' ...

这面已经半夜了,我要睡觉了去了,总算把帖子的问题解决了,多谢网站各位老师的帮助。
回复

使用道具 举报

 楼主| 发表于 2012-5-1 00:04 | 显示全部楼层
吕?布 发表于 2012-4-30 12:16
Excel中实现了SumIf函数,只实现了一次,其定义是
[helpcontext(0x00014159)]
HRESULT _stdcall SumIf(

为了佐证我的观点,我加了一句On Error Resume Next,三个语句都正常运行了,并且得到了同样的结果

Sub SumIfDemo()
    Dim arr
   
    arr = Application.SumIf(Range("a2:a10000"), Array("B", "C", "G", "R"), Range("B2:B10000"))  '1
   
    On Error Resume Next
    ' 下面两句要想忽略类型检查,要在前面加忽略错误语句
    ' 其结果与Application后带SumIf结果相同
    arr = WorksheetFunction.SumIf(Range("a2:a10000"), Array("B", "C", "G", "R"), Range("B2:B10000"))  '2

    arr = Application.WorksheetFunction.SumIf(Range("a2:a10000"), Array("B", "C", "G", "R"), Range("B2:B10000"))  '3
   
End Sub

三个语句是正常运行了,但结果不同,上面这段代码所得到的结果相同,其实只是第一个arr的值,后两个arr只是被忽略的错误,并没有得到真正的执行,要想证明这一点,只要把第一个arr语句注释掉再运行就知道了。





点评

确实,我看到的是错觉  发表于 2012-5-1 00:15
回复

使用道具 举报

发表于 2012-5-1 00:13 | 显示全部楼层
个人认为一个函数用写两次可能性是很大
回复

使用道具 举报

 楼主| 发表于 2012-5-1 00:22 | 显示全部楼层
cbg2008 发表于 2012-5-1 00:11
嗯,学习了,养成良好的习惯,尽量规范书写。以前我也碰到过类似问题,调用工作表的datedif函数和真正在工作 ...

你能到我的帖子?我设置了金币限制的啊,我的金币怎么一点都没涨。{:251:}
回复

使用道具 举报

发表于 2012-5-1 00:26 | 显示全部楼层
{:271:}来看看。。。
回复

使用道具 举报

发表于 2012-5-2 16:03 | 显示全部楼层
学习               
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-3-29 15:29 , Processed in 0.564282 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表