ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 按年度分月份统计每个客户的应收款

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-5-16 18:01 | 显示全部楼层
JSA代码,供参考
  1. function 筛选统计(){
  2.         let year=InputBox("请输入统计年份:");
  3.         if (year.search(/\d{4}/)==-1) return;
  4.         let arr=Sheets.Item("客户").Range("a1").CurrentRegion.Value2.slice(1);
  5.         let wf=WorksheetFunction;
  6.         let obj=arr.reduce((obj,x)=>{
  7.                 if (wf.Text(x[1],"yyyy")!=year) return obj;
  8.                 let temp=obj[x[3]]=obj[x[3]] || [x[3],...Array(12),"=SUM(RC[-12]:RC[-1])"];
  9.                 let n=wf.Text(x[1],"m");
  10.                 temp[n]=(temp[n] || 0) + (x[10] || 0);
  11.                 return obj;
  12.         },{});
  13.         let res=Object.values(obj);
  14.         if (res.length==0) return;
  15.         let app=Application;
  16.         [app.DisplayAlerts,app.ScreenUpdating]=[false,false];
  17.         Sheets.Item("统计表模版").Copy(null,Sheets.Item("客户"));
  18.         try{Sheets.Item("统计表").Delete()}catch{};
  19.         ActiveSheet.Name="统计表";
  20.         if (res.length>2) Range("a4").Resize(res.length-2,1).EntireRow.Insert();
  21.         Range("a3").Resize(res.length,res[0].length).FormulaR1C1=res;
  22.         [app.DisplayAlerts,app.ScreenUpdating]=[true,true];
  23. }
复制代码

TA的精华主题

TA的得分主题

发表于 2024-5-16 18:01 | 显示全部楼层
附件,请用WPS软件测试

订单汇总.zip

17.73 KB, 下载次数: 13

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-5-16 19:43 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
JS凑个热闹

  1. //wang-way 20240516
  2. function transformData(){
  3.         var wb=ThisWorkbook;
  4.         var sht=wb.Worksheets.Item('客户');
  5.         var ar=sht.Range('a1').CurrentRegion.Value();
  6.         //月份去重
  7.         dc=new Set(ar.slice(1).map(x=>new Date(x[1]).getMonth()+1+'月'));

  8.         //客户去重
  9.         dr=new Set(ar.slice(1).map(x=>x[3]));
  10.         //最终输出数组
  11.         br=[];
  12.         //添加行头
  13.         br.push(['',...Array.from(dc),'合计'])
  14.         //先逐行循环,再逐列循环
  15.         dr.forEach(x=>{
  16.                 //每一行数据的构建
  17.                 r=[];
  18.                 //添加客户到首列
  19.                 r.push(x);
  20.                 rsum=0;
  21.                 dc.forEach(y=>{
  22.                         //Debug.Print('客户:',x,'月份:',y);
  23.                         //筛选指定客户 指定月份的数据
  24.                         tmp=ar.filter(r=>r[3]==x && new Date(r[1]).getMonth()+1+'月'==y);
  25.                         //Debug.Print(tmp.length);
  26.                         //如有满足数据
  27.                         if(tmp.length>0){
  28.                                 //提取金额列数据
  29.                                 act=tmp.map(a=>a[10])
  30.                                 //行合计
  31.                                 mysum=act.reduce((a,c)=>Number(a)+Number(c));
  32.                                 //Debug.Print('客户:',x,'月份:',y,'金额',mysum)
  33.                                 r.push(mysum);
  34.                                 rsum=rsum+mysum;
  35.                                 }
  36.                         else{
  37.                                 //客户当月没有数据
  38.                                 r.push('')
  39.                         }
  40.                 })       
  41.                 r.push(rsum);
  42.                 br.push(r);
  43.                
  44.         })
  45.         //列合计
  46.         r=[];
  47.         r.push('合计');
  48.         //逐列求和
  49.         for(let j=1;j<br[1].length;j++){       
  50.                 mysum=br.slice(1).map(x=>x[j]).reduce((a,c)=>Number(a)+Number(c));
  51.                 Debug.Print(j+1,mysum);
  52.                 r.push(mysum);
  53.         }
  54.         br.push(r);
  55.        
  56.        
  57.         //Output
  58.         sht=wb.Worksheets.Item('统计表');
  59.         sht.UsedRange.Offset(1,0).Clear();
  60.         sht.Range('a2').Resize(br.length,br[0].length).Value2=br;
  61.        
  62. }
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-5-17 08:03 | 显示全部楼层
本帖最后由 ykcbf1100 于 2024-5-17 08:05 编辑

参与一下,全表自动生成。

订单汇总.7z

146.08 KB, 下载次数: 38

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-5-17 08:04 | 显示全部楼层
参与一下。。。
  1. Sub ykcbf()  '//2024.5.17
  2.     Dim arr, brr, d
  3.     Application.ScreenUpdating = False
  4.     Application.DisplayAlerts = False
  5.     Set d = CreateObject("scripting.dictionary")
  6.     rq = Date
  7.     nf = Application.InputBox("请输入查询年份:", "年份", Year(rq))
  8.     With Sheets("客户")
  9.         r = .Cells(Rows.Count, 1).End(3).Row
  10.         arr = .Range("a1").Resize(r, 12)
  11.     End With
  12.     ReDim brr(1 To UBound(arr), 1 To 100)
  13.     brr(1, 1) = nf & "年应收款分客户分月份统计表"
  14.     brr(2, 1) = arr(1, 4)
  15.     m = 2: n = 1
  16.     For i = 2 To UBound(arr)
  17.         If Year(arr(i, 2)) = Val(nf) Then
  18.             s = arr(i, 4)
  19.             If Not d.exists(s) Then
  20.                 m = m + 1
  21.                 d(s) = m
  22.                 brr(m, 1) = s
  23.             End If
  24.             r = d(arr(i, 4))
  25.             s = Month(arr(i, 2)) & "月"
  26.             If Not d.exists(s) Then
  27.                 n = n + 1
  28.                 d(s) = n
  29.                 brr(2, n) = s
  30.             End If
  31.             c = d(Month(arr(i, 2)) & "月")
  32.             brr(r, c) = brr(r, c) + arr(i, 11)
  33.         End If
  34.     Next
  35.     With Sheets("统计表")
  36.         .UsedRange.Clear
  37.         .[a1].Resize(1, n + 1).Merge
  38.         .[a1].Resize(2, n + 1).Interior.Color = 49407
  39.         .[a3].Resize(m - 1, 1).Interior.Color = 5296274
  40.         With .[a1].Resize(m + 1, n + 1)
  41.             .Value = brr
  42.             .Borders.LineStyle = 1
  43.             .HorizontalAlignment = xlCenter
  44.             .VerticalAlignment = xlCenter
  45.             With .Font
  46.                 .Name = "微软雅黑"
  47.                 .Size = 11
  48.             End With
  49.         End With
  50.         .Cells(2, n + 1) = "合计"
  51.         For i = 3 To m + 1
  52.             .Cells(i, n + 1) = Application.WorksheetFunction.Sum(.Cells(i, 2).Resize(1, n - 1))
  53.         Next
  54.         m = m + 1
  55.         .Cells(m, "a") = "合计"
  56.         .Cells(m, "b").Resize(1, n).FormulaR1C1 = "=SUM(R3C:R" & "[-1]C)"
  57.     End With
  58.     Set d = Nothing
  59.     MsgBox "OK!"
  60. End Sub

复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-5-21 22:45 | 显示全部楼层

有时候可以利用工作表函数求和,没必要非得在代码中把合计求出来

TA的精华主题

TA的得分主题

发表于 2024-5-21 22:51 | 显示全部楼层
LIUZHU 发表于 2024-5-21 22:45
有时候可以利用工作表函数求和,没必要非得在代码中把合计求出来

是的  仔细看了你的代码   最后一列是插入公式求和了。 谢谢您的宝贵经验

TA的精华主题

TA的得分主题

发表于 2024-5-21 23:44 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
wang-way 发表于 2024-5-21 22:51
是的  仔细看了你的代码   最后一列是插入公式求和了。 谢谢您的宝贵经验

而且R1C1样式的公式,在代码中用处极大,可以充分利用JSA的模版字符串的功能。

TA的精华主题

TA的得分主题

发表于 2024-5-22 16:11 | 显示全部楼层
Sub 应收款统计()
    ' https://club.excelhome.net/threa ... tml?_dsign=d49726a9
    ' 2024-5-22 星期三
    Sheet1.Select
    Rows("3:1000").Delete Shift:=xlUp     ' 删除前一次的统计结果
    x2 = 2
    Do While Not (IsEmpty(Sheet2.Cells(x2, 2).Value))
      kh = Sheet2.Cells(x2, 4).Value
      foun = False
      x1 = 3
      Do While Not (IsEmpty(Sheet1.Cells(x1, 1).Value))
        If Sheet1.Cells(x1, 1).Value = kh Then
          foun = True
          Exit Do
        End If
        x1 = x1 + 1
      Loop
      If foun = False Then
        Sheet1.Cells(x1, 1).Value = kh
      End If
      x2 = x2 + 1
    Loop
    '---客户信息提取完成
    nf = InputBox("请输入想要统计的年号:" + Chr(13) + Chr(13) + "如 “2024”", "Microsoft Excel输入对话:", "2024")
    Sheet1.Cells(1, 1).Value = nf & "年应收款分客户分月份统计表"   ' 根据统计年份的设定 ,修改统计表头名称
    For y = 1 To 12
      x1 = 3
      Do While Not (IsEmpty(Sheet1.Cells(x1, 1).Value))
        kh = Sheet1.Cells(x1, 1).Value
        sn = 0
        x2 = 2
        Do While Not (IsEmpty(Sheet2.Cells(x2, 2).Value))
          If Sheet2.Cells(x2, 4).Value = kh And Month(Sheet2.Cells(x2, 2).Value) = y And Year(Sheet2.Cells(x2, 2).Value) = Val(nf) Then
              sn = sn + Sheet2.Cells(x2, 11).Value   ' 符合年份、月份、客户的应收款累计
          End If
          x2 = x2 + 1
        Loop
        Sheet1.Cells(x1, y + 1).Value = sn
        x1 = x1 + 1
      Loop
    Next y
    '---统计完成
    Sheet1.Cells(x1, 1).Value = "合计"
    For y = 1 To 12
      sn = 0
      For x = 3 To x1 - 1
        sn = sn + Cells(x, y + 1)
      Next x
      Cells(x, y + 1) = sn    ' 纵向求和
    Next y
    For x = 3 To x1
      sn = 0
      For y = 1 To 12
        sn = sn + Cells(x, y + 1)
      Next y
      Cells(x, y + 1) = sn    ' 横向求和
    Next x
End Sub

EH论坛-客户订单应收款汇总统计.rar

199.43 KB, 下载次数: 16

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-25 23:25 | 显示全部楼层

  大师,您好!我根据您的VBA代码,设计了应付款统计表,但有些数据统计不到,请您帮我看看是什么原因,我只改了对应的列的代码,其他代码我并没有改动,按理应该没问题的,可就是只能统计部分数据。先谢谢您了!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-1 10:19 , Processed in 0.053411 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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