ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 跨月到账,怎么根据营收日期和到账日期,取到账的汇总金额分别放入对应单元格

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-1-8 16:31 | 显示全部楼层 |阅读模式
因为有跨月到账,所以要根据对账表的店仓号,取上月月底本月到账的金额,本月营收本月到账的金额,和本月营收下月到账的金额(在本月还没有到所以到账日期为空白)

我用的方法是先弹出消息框让用户输入对账月份,然后再去筛选店仓、营收日期和到账日期,感觉有点慢,有没有更简单的方法

image.png
对账表

image.png
到款明细表

到款对账.rar

10.21 KB, 下载次数: 7

TA的精华主题

TA的得分主题

发表于 2024-1-8 17:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub 汇总()
Application.ScreenUpdating = False
Dim ar As Variant
Dim d As Object
Set d = CreateObject("scripting.dictionary")
With Sheets("到款明细")
    r = .Cells(Rows.Count, 1).End(xlUp).Row
    If r < 2 Then MsgBox "到款明细为空!": End
    ar = .Range("a1:g" & r)
End With
Dim br()
ReDim br(1 To UBound(ar), 1 To 5)
w = InputBox("请输入月份", "月份", "")
If w = "" Then End
For i = 2 To UBound(ar)
    If ar(i, 4) <> "" Then
        If IsDate(ar(i, 4)) Then
            yf = Month(ar(i, 4))
            If Val(yf) = Val(w) Then
                If Trim(ar(i, 1)) <> "" Then
                    t = d(ar(i, 1))
                    If t = "" Then
                        k = k + 1
                        d(ar(i, 1)) = k
                        t = k
                        br(k, 1) = ar(i, 1)
                        br(k, 2) = ar(i, 2)
                    End If
                    If Trim(ar(i, 3)) = "" Then
                        br(t, 5) = br(t, 5) + ar(i, 7)
                    Else
                        rq = CDate(Replace(ar(i, 3), "到账", ""))
                        yff = Month(rq)
                        If Val(yff) > Val(yf) Then
                            br(t, 5) = br(t, 5) + ar(i, 7)
                        ElseIf Val(yff) < Val(yf) Then
                            br(t, 3) = br(t, 3) + ar(i, 7)
                        ElseIf Val(yff) = Val(yf) Then
                            br(t, 4) = br(t, 4) + ar(i, 7)
                        End If
                    End If
                End If
            End If
        End If
    End If
Next i
If k = "" Then MsgBox "没有所选月份的数据!": End
With Sheets("对账")
    .[a1].CurrentRegion.Offset(1) = Empty
    .[a2].Resize(k, UBound(br, 2)) = br
End With
Application.ScreenUpdating = True
MsgBox "ok!"
End Sub

TA的精华主题

TA的得分主题

发表于 2024-1-8 17:45 | 显示全部楼层
猜呢,仅供参考
到款对账.rar (21.57 KB, 下载次数: 3)

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-10 15:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Sub 对账()
  2. Dim by1!, sy1!, xy1!
  3. Dim frr()
  4. '先列出取数的月份
  5. by = InputBox("请输入对账月份(例如:2023-08)")
  6. sy = Format(DateAdd("m", -1, by), "YYYY-MM")
  7. xy = Format(DateAdd("m", 1, by), "YYYY-MM")

  8. Sheets("对账").Select
  9. arr = Range("a2", Cells(Rows.Count, 1).End(xlUp))
  10. Sheets("到款明细").Select
  11. brr = Range("a1").CurrentRegion

  12. ReDim brr1(1 To UBound(brr))
  13. For j = 1 To UBound(brr)
  14.     '把对账表格的店仓号、到账日期、营收日期、应到账金额、已到账金额用\连接在一起,方便筛选
  15.     brr1(j) = Join(Array(brr(j, 1), brr(j, 3), brr(j, 4), brr(j, 5), brr(j, 6)), "")
  16. Next j

  17. On Error Resume Next
  18. For i = 1 To UBound(arr)
  19.     crr = Filter(brr1, arr(i, 1)) '按照店仓筛选符合条件的数据
  20.     ReDim Preserve frr(1 To UBound(crr) + 1)
  21.     For y = 0 To UBound(crr)
  22.         frr(y + 1) = Split(crr(y), "") '数组分割,方便筛选日期,和累加金额
  23.     Next y
  24.     For Z = 1 To UBound(frr)
  25.         '营收日期是上月,到账日期是本月则则把“已到账金额”加到sy1
  26.         If InStr(frr(Z)(2), sy) > 0 And InStr(frr(Z)(1), by) > 0 Then sy1 = sy1 + frr(Z)(4)
  27.         If InStr(frr(Z)(2), by) > 0 Then
  28.             If InStr(frr(Z)(1), by) > 0 Then '营收日期是本月,到账日期是本月则把“已到账金额”加到by1
  29.                 by1 = by1 + frr(Z)(4)
  30.             Else '营收日期是本月,到账不是本月则把“应到账金额”加到xy1
  31.                 xy1 = xy1 + frr(Z)(3)
  32.             End If
  33.         End If
  34.     Next Z
  35.     Sheets("对账").Cells(i + 1, "c") = Format(sy1, "0.00") '上月累计的金额写入对账表的c列
  36.     Sheets("对账").Cells(i + 1, "d") = Format(by1, "0.00")
  37.     Sheets("对账").Cells(i + 1, "e") = Format(xy1, "0.00")
  38.     sy1 = 0
  39.     by1 = 0
  40.     xy1 = 0
  41.     Erase frr '清空frr
  42. Next i
  43. Sheets("对账").Select
  44. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-10 15:46 | 显示全部楼层
我自己重新写了一下,思路是这样的
by1代表本月到账累计金额,sy1代表上月营收本月到账累计金额,xy1代表本月营收下月到账累计金额
1、把门店代码写入数组arr,把到款明细所有数据写入brr
2、把到款明细需要用到的列:店仓号、到账日期、营收日期、应到账金额、已到账金额用\连接在一起,组成新的数组brr1,方便后面筛选
3、进入arr的循环,根据店仓号筛选brr1中符合条件的数据,然后分列成数组frr
4、判断frr中的营收日期和到账日期的月份,分别把金额加到by1, sy1, xy1,最后写入对账表格中的位置

到款对账24.1.10.rar

23.44 KB, 下载次数: 3

TA的精华主题

TA的得分主题

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

谢谢提供思路,我没有用字典,用数组写了一个新的
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 11:24 , Processed in 0.031828 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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