ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 7637|回复: 14

[分享] [有了一个解决方案了]双向求和自定义函数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2008-7-21 18:18 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

工作中,常常要对小计再进行合计,而由于小数精度的原因,有时会因为公式错了单元格,而造成竖向求和与横向求和不一致,所以往往就用if 进行判断以后再SUM,感觉很麻烦,做了一个自定义函数,中间卡壳了,没有好思路,大家帮忙看看!

图一:问题的提出

要求:
1、要求对“累计完成”求和;
2、“累计完成”求和条件:
a、在竖向绿色部分的和=横向桔色部分的和时,才显示求和结果;
b、当竖向和<>横向和时,则显示竖向和-横向和之差的绝对值,前面加上“±”号。


  LikFhTR0.rar (16.25 KB, 下载次数: 19)


[此贴子已经被作者于2008-7-24 8:10:28编辑过]

[求助][求助]双向求和自定义函数(卡壳了,大家帮下忙)

[求助][求助]双向求和自定义函数(卡壳了,大家帮下忙)

[求助][求助]双向求和自定义函数(卡壳了,大家帮下忙)

[求助][求助]双向求和自定义函数(卡壳了,大家帮下忙)

[求助][求助]双向求和自定义函数(卡壳了,大家帮下忙)

[求助][求助]双向求和自定义函数(卡壳了,大家帮下忙)

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-7-22 08:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

因为C4是C5:C9的求和,C10是C11:C15,C16则是对求和以后的C4C10再进行求和。

第一张工作表,也就是“SUM+IF法”,是我平常用的方法,就是横向和竖向的求和相等时,才显示求和结果,如果不一致,则提示出错!

不知道我一楼的意思大家能看明白吗?

要是看不明白,请提出来,我再表述一下!

 

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-7-22 09:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
我的想法:

我就是想用SumRowCol2自定义函数,来实现将带正负号的C4、C10进行累计,

        思路就是,如果C4、C10都不带正负号,C16则直接求和;

                          如果C4、C10都只要有一个带正负号,C16则直接带正负号的单元格;

                       例1:见表二,当C4为807.92,C10为±8时,则C16应该显示±8,而不是现在的±180.1

                       例2:同理,当C4为±2,C10为±8时,则C16应该显示±10,而不是其他值。



也就是说:

SumRowCol已实现基本功能,但不能实现有±号的累计,我就想用SumRowCol2来实现这个±的累加,请帮忙完成SumRowCol2的功能。
[此贴子已经被作者于2008-7-22 10:00:55编辑过]

TA的精华主题

TA的得分主题

发表于 2008-7-22 10:32 | 显示全部楼层

SumRowCol没错,只是C16单元格里函数引用区域有误(因±8是字符型,参与运算出错),应为:

=SumRowCol((C5:C9,C11:C15),(D16:F16))

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-7-22 12:37 | 显示全部楼层
QUOTE:
以下是引用热浪2006在2008-7-22 10:32:24的发言:

SumRowCol没错,只是C16单元格里函数引用区域有误(因±8是字符型,参与运算出错),应为:

=SumRowCol((C5:C9,C11:C15),(D16:F16))

区域没错,我是想通过对求和行再进行求和!

如果还引用 求和以前的行的话,就有很多,比较麻烦!

思路就是,如果C4、C10都不带正负号,C16则直接求和;

                          如果C4、C10都只要有一个带正负号,C16则直接带正负号的单元格;

                       例1:见表二,当C4为807.92,C10为±8时,则C16应该显示±8,而不是现在的±180.1

                       例2:同理,当C4为±2,C10为±8时,则C16应该显示±10,而不是其他值。

[此贴子已经被作者于2008-7-22 12:38:38编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-7-22 12:39 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

我又注释了一下,大家再看看,是哪里思路不对:


Function SumRowCol(Row As Range, Col As Range)
On Error Resume Next
    Application.Volatile    '
自动更新计算结果
Dim x, y, rng
Dim Z%
Dim AAA, BBB

    ''查找小数位置
    Z = Application.WorksheetFunction.Find(";", ActiveCell.NumberFormatLocal) - 5
    ''
取设定位数的求和
    x = Round(Application.Sum(Row), Z) * 1
    y = Round(Application.Sum(Col), Z) * 1
    ''
以上判断并求和
    ''
如果竖向x与横向y相等,则直接求和
    If x = y Then
        SumRowCol = (x + y) / 2
    ''
如果竖向x与横向y不相等,则分三个情况分别求和
    ElseIf x <> y Then
        ''
在求和的第一个参数里,即在竖向,查找±号,
        Set AAA = Row.Find(What:="±", LookAt:=xlPart, SearchFormat:=False)
        ''
在求和的第二个参数里,即在横向,查找±号,
        Set BBB = Col.Find(What:="±", LookAt:=xlPart, SearchFormat:=False)
        ''
如果竖向有±号,说明竖向有偏差,就计算竖向的偏差值,也就是求竖向带±的单元格的和。
        If Not AAA Is Nothing Then
            SumRowCol = "±" & Sum±(Row)
        ''
如果横向有±号,说明横向有偏差,就计算横向的偏差值,也就是求横向带±的单元格的和。
        ElseIf Not BBB Is Nothing Then
            SumRowCol = "±" & Sum±(Col)
        ''
如果横向与竖向都没有±号,说明两个方向的计算是偏差值,则直接对横向或竖向求和(我是采用横向与竖向的平均值)。
        ElseIf AAA Is Nothing And BBB Is Nothing Then
            SumRowCol = "±" & Round(Abs((x - y)), Z)
        End If
    End If
End Function

 把附件修改了一下,再传上来看看:

 

 把附件修改了一下,再传上来看看:

 

tTvIMqFg.rar (18.74 KB, 下载次数: 12)

TA的精华主题

TA的得分主题

发表于 2008-7-22 13:07 | 显示全部楼层

新附件里“连续求和”表里的C16怎么是±196.1?你原来不是要求等于±8吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-7-22 13:58 | 显示全部楼层
QUOTE:
以下是引用热浪2006在2008-7-22 13:07:39的发言:

新附件里“连续求和”表里的C16怎么是±196.1?你原来不是要求等于±8吗?

是呀,C16正确结果应该是等于±8,等于±196.1是因为函数我还没完成,也就是要请大家帮忙的地方!

谢谢你了!

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-7-22 14:01 | 显示全部楼层

这是蓝桥玄霜给的一个思路!


Function SumRowCol3(Row As Range, Col As Range) ''蓝桥玄霜
    Application.Volatile    '自动更新计算结果
Dim x, y, cel As Range
Dim cel1
For Each cel In Row
    r1 = InStr(cel, " ")
    If r1 = 0 Then
        x = x + cel
    Else
        cel1 = Val(Left(cel, r1 - 1))
        x = x + cel1
    End If
Next cel
    y = Application.Sum(Col)
    ''判断并求和
    If x = y Then
        SumRowCol3 = Application.Text((x + y) / 2, "0.00")
    ElseIf x > y Then
        SumRowCol3 = Application.Text(x, "0.00") & " -" & Application.Text(x - y, "0.00")
    Else
        SumRowCol3 = Application.Text(x, "0.00") & " +" & Application.Text(y - x, "0.00")
    End If
End Function

经测试,当不计栏有偏差的时候,结果完全正确;

但当上面的各项没有偏差的时候,最后一个合计反而出错了!

 

 


[求助][求助]双向求和自定义函数(卡壳了,大家帮下忙)

[求助][求助]双向求和自定义函数(卡壳了,大家帮下忙)

TA的精华主题

TA的得分主题

发表于 2008-7-22 14:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

再有一个思路(因手头忙,没做):

把因±号不能显示的实际合计结果存入变量或数组,需要时再取值运算来取代4楼的方法。

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

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-23 11:14 , Processed in 0.053810 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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