找回密码
 立即注册

QQ登录

只需一步,快速开始

写BUG的程序员

初级会员

29

主题

91

帖子

316

积分

初级会员

积分
316
写BUG的程序员
初级会员   /  发表于:2024-8-30 09:24  /   查看:151  /  回复:4
1金币
如题, 在官方demo即可复现。

创建一个表格,下面添加一个汇总行,未筛选前:
image.png946675109.png image.png774283141.png


筛选后: 这里的值应该是14.多     结果显示295.多
image.png100516356.png

4 个回复

倒序浏览
Wilson.Zhang
超级版主   /  发表于:2024-8-30 11:26:44
沙发
您好!根据您提供的信息了解了您的问题,需要您提供一个能够复现该问题的完整demo。
回复 使用道具 举报
写BUG的程序员
初级会员   /  发表于:2024-8-30 14:30:58
板凳
Wilson.Zhang 发表于 2024-8-30 11:26
您好!根据您提供的信息了解了您的问题,需要您提供一个能够复现该问题的完整demo。

demo在附件

SUMPRODUCT计算错误.ssjson.zip

6.45 KB, 下载次数: 7

回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-8-30 16:32:51
地板
本帖最后由 Wilson.Zhang 于 2024-9-2 09:47 编辑

SUBPRODUCT公式计算不忽略被筛选掉的行,还是根据筛Tablle范围内所有被引用单元格的数据计算,因此该公式的计算结果不变,而SUBTOTAL公式对“订单号_计数”列的统计结果为实际被筛选中的数据的计算结果,这才导致I15单元格的计算结果不正确。Excel中SUBPRODUCT公式也是如此,看来需要自定义公式来实现了,主要思路如下:
1. 自定义公式在计算前检查引用列中是否有未被筛选的单元格,即通过Worksheet:getRowVisible()查询每行是否可见,可见即被筛选了,不可见即未被筛选。如果有则舍弃该单元格的数据,否则保留以计算。
2. 待检查结束,根据既定规则计算数据即可。

您可以尝试看能否满足您的需要。
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-9-2 11:42:45
5#
您好!可以参考如下代码自定义:
  1. function CustomSumProduct() {
  2.     this.name = 'CUSTOMSUMPRODUCT';
  3.     this.maxArgs = 1;
  4.     this.minArgs = 1;
  5. }
  6. CustomSumProduct.prototype = new GC.Spread.CalcEngine.Functions.Function();
  7. CustomSumProduct.prototype.evaluate = function(arg) {
  8.     var sumProduct = 0;
  9.     console.log('function arg: ', arg);
  10.     var designer = GC.Spread.Sheets.Designer.findControl('gc-designer-container');
  11.     var spread = designer.getWorkbook();
  12.     var sheet = spread.getActiveSheet();
  13.     var tableRange = sheet.getUsedRange(GC.Spread.Sheets.UsedRangeType.table);
  14.     console.log('table range: ', tableRange);
  15.     for (var i = tableRange.row + 1; i < tableRange.row + tableRange.rowCount - 1; i++) {
  16.         //  如果当前行被筛选中,则计算D列和I列的乘积并累加
  17.        if (sheet.getRowVisible(i)) {
  18.             console.log(sheet.getValue(i, 3), '    ', sheet.getValue(i, 8));
  19.             sumProduct += sheet.getValue(i, 3) * sheet.getValue(i, 8);
  20.         }
  21.     }
  22.     console.log('sum product: ', sumProduct);
  23.     return sumProduct || '#VALUE!';
  24. };
  25. var customSumProduct = new CustomSumProduct();
  26. sheet.addCustomFunction(customSumProduct);
复制代码


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部