Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 3717|回复: 10

[已解决]如何用VBA自定义公式并在工作中得以使用?

[复制链接]
发表于 2012-7-27 14:01 | 显示全部楼层 |阅读模式
想以VBA自定义公式的方式实现汇总求和,请大师帮忙实现下,谢谢!详见附件!


求助20120727.rar (38.67 KB, 下载次数: 2)
发表于 2012-7-27 14:11 | 显示全部楼层
我先看看我会不.我也是学习来的呀
回复

使用道具 举报

发表于 2012-7-27 14:25 | 显示全部楼层    本楼为最佳答案   
求助20120727(wayy).rar (45.16 KB, 下载次数: 13)
回复

使用道具 举报

 楼主| 发表于 2012-7-27 14:34 | 显示全部楼层
wayy 发表于 2012-7-27 14:25

Function total(M)
Dim i&, arr, dic1, dic2
Dim SD As Date, ED As Date
SD = Range("c2")
ED = Range("e2")
Set dic1 = CreateObject("Scripting.Dictionary")
Set dic2 = CreateObject("Scripting.Dictionary")
arr = Sheet1.Range("A1").CurrentRegion.Offset(1)
For i = 2 To UBound(arr)
    If arr(i, 1) >= SD And arr(i, 1) <= ED Then
        dic1(arr(i, 2)) = dic1(arr(i, 2)) + arr(i, 5)
    End If
    If arr(i, 1) <= ED Then
        dic2(arr(i, 2)) = dic2(arr(i, 2)) + arr(i, 5)
    End If
Next i

total = dic1(M)

Set dic1 = Nothing
Set dic2 = Nothing
End Function
我这样写不成功,然后想定义两个要怎么办咯,

点评

期间累计按我的写,前期累计按我的改,呵呵。  发表于 2012-7-27 14:43
回复

使用道具 举报

 楼主| 发表于 2012-7-27 14:35 | 显示全部楼层
一个是期间累计,一个是前期累计
回复

使用道具 举报

 楼主| 发表于 2012-7-27 14:45 | 显示全部楼层
本帖最后由 cyb412204170 于 2012-7-27 14:51 编辑
wayy 发表于 2012-7-27 14:25

谢谢,我知道怎么改了,我是想用字典会不会快点,能不能指点下我的代码那错了吗?

点评

你的M没有定义,输入的是单元格地址还是直接输入值呢?如果是单元格地址,需要定义为Range  发表于 2012-7-27 14:52
回复

使用道具 举报

 楼主| 发表于 2012-7-27 14:57 | 显示全部楼层
wayy 发表于 2012-7-27 14:25

加了一句:dim M as range ,输入公式后出现“当前范围内的声明重复”并返回错误值

点评

这个应该在函数名称变量中加 Function total(M As Range),不过可能是字典的原因,加了也不对  发表于 2012-7-27 15:34
回复

使用道具 举报

 楼主| 发表于 2012-7-27 14:59 | 显示全部楼层
小女子愚昧,请版主大大指点,谢谢!
回复

使用道具 举报

发表于 2012-7-27 16:02 | 显示全部楼层
本帖最后由 wayy 于 2012-7-27 16:05 编辑
  1. Function total(Rng As Range, fl As Long)
  2. Dim i&, arr, Dic1, Dic2
  3. Dim SD As Date, ED As Date
  4. Dim Str As String
  5. SD = Range("c2")
  6. ED = Range("e2")
  7. Set Dic1 = CreateObject("Scripting.Dictionary")
  8. Set Dic2 = CreateObject("Scripting.Dictionary")
  9. With Sheet1
  10.   arr = .Range("a2", .[e65536].End(xlUp))
  11. End With
  12. For i = 2 To UBound(arr)
  13.     If arr(i, 1) >= SD And arr(i, 1) <= ED Then
  14.         Dic1(arr(i, 2)) = Dic1(arr(i, 2)) + arr(i, 5)
  15.     End If
  16.     If arr(i, 1) <= ED Then
  17.         Dic2(arr(i, 2)) = Dic2(arr(i, 2)) + arr(i, 5)
  18.     End If
  19. Next i
  20. Str = Rng.Value
  21. If fl = 1 Then
  22.   total = Dic1(Str)
  23. ElseIf fl = 2 Then
  24.   total = Dic2(Str)
  25. End If
  26. End Function
复制代码
使用方法:=total(a4,1) 是取区间值 =total(a4,2)是取前期累计值。
原来的错误是出在数组了。CurrentRegion这里的原因。
回复

使用道具 举报

 楼主| 发表于 2012-7-27 17:16 | 显示全部楼层
wayy 发表于 2012-7-27 16:02
使用方法:=total(a4,1) 是取区间值 =total(a4,2)是取前期累计值。
原来的错误是出在数组了。CurrentRegio ...

谢谢,问题解决了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-21 14:05 , Processed in 0.401301 second(s), 16 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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