ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 自动生成本月合计和累计

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-7-9 11:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zgjijinbao 发表于 2020-7-9 00:48
老师你好!还得麻烦你了,我的余额最终结果显示E-14,能不能把显示为0啊!实际也是0,有浮点
  1. Dim k&, arr, brr(1 To 1000, 1 To 12)
  2. Dim mD数#, mD额#, mC数#, mC额#, yD数#, yD额#, yC数#, yC额#

  3. Sub 明细账查询()
  4.     Dim i&, no$, j%
  5.     Range("b8:i1500").ClearContents                '清除数据区
  6.     Range("b8:i1500").Borders.LineStyle = xlNone   '清除网格线
  7.     Range("b8:i1500").Interior.Pattern = xlNone             '删除底色
  8.     no = Range("d4")               '科目代码定义为no
  9.     arr = Sheets("凭证明细表").Range("a2:j" & Sheets("凭证明细表").Range("a20000").End(3).Row) '.CurrentRegion  '分录源表装入数组arr
  10.     k = 0
  11.     For i = 1 To UBound(arr)
  12.         Set c = Sheets("期初余额").Range("a:a").Find(no, , , , , 1)
  13.         If k = 0 And Not c Is Nothing Then
  14.             k = k + 1
  15.             brr(k, 4) = "上年结转"             'brr数组第1行的第5列= “期初余额”
  16.             brr(k, 8) = Sheets("期初余额").Range("c" & c.Row)          'brr数组第1行的第8列的“余额”
  17.             If Range("I4") = "借" Then                                             '如果是借方科目,则如下:
  18.                 brr(k, 7) = IIf(brr(k, 8) > 0, "借", IIf(brr(k, 8) < 0, "贷", ""))  '借或贷行赋值
  19.             Else                                                                     '否则是贷方科目如下:
  20.                 brr(k, 7) = IIf(brr(k, 8) > 0, "贷", IIf(brr(k, 8) < 0, "借", ""))  '借或贷行赋值
  21.             End If
  22.         End If
  23.         If arr(i, 1) = no Then    'arr第1列的科目编码
  24.             k = k + 1
  25.             '===============主表区共6列赋值(中间有几列空列不赋值)
  26.             On Error Resume Next
  27.             If k > 1 Then                                                           '如果大于第一行
  28.                 If arr(i, 5) <> brr(k - 1, 1) And brr(k - 1, 4) <> "上年结转" Then  '如果本行第1列的月份不等于上一行的月份或都不等于“上年结转”
  29.                     按月汇总                                                        '插入本月合计和本年累计(从第1个月到最后一个月的上一月用此代码)
  30.                 End If
  31.             End If                    '上面是先判定本行是否属于下一月份,如果是先操作上面的月结,然后进入下面的按逐行顺序赋值
  32.             brr(k, 1) = arr(i, 5)     '第1列月
  33.             brr(k, 2) = arr(i, 6)     '第2列日
  34.             brr(k, 3) = arr(i, 7)     '第3列凭证号
  35.             brr(k, 4) = arr(i, 8)     '第4列摘要
  36.             brr(k, 5) = arr(i, 9)     '第5到借方
  37.             brr(k, 6) = arr(i, 10)    '第6到贷方

  38.             '================余额栏计算
  39.             r = IIf(brr(k - 1, 4) = "本年累计", 3, 1)                                   '计算余额列的上一行的行号,如果是新月份的开始行上一行余额是本行-3行,否则是本行政1行
  40.             If Range("I4") = "借" Then                                             '如果是借方科目,则如下:
  41.                 brr(k, 8) = Round(brr(k - r, 8) + brr(k, 5) - brr(k, 6), 2)           '余额行的数量计算
  42.                 brr(k, 7) = IIf(brr(k, 8) > 0, "借", "贷")                            '借或贷行赋值
  43.             Else                                                                      '否则是贷方科目如下:
  44.                 brr(k, 8) = Round(brr(k - r, 8) + brr(k, 6) - brr(k, 5), 2)           '余额行的数量计算
  45.                 brr(k, 7) = IIf(brr(k, 12) > 0, "贷", "借")                           '借或贷行赋值
  46.             End If
  47.             '================借贷方的本月合计(按月周期)本年累计(从头到尾)逐行累加
  48.             mD额 = mD额 + brr(k, 5)       '上一行内存中的本月借方金额累计数和本行借方金额累加
  49.             mC额 = mC额 + brr(k, 6)       '上一行内存中的本月贷方金额累计数和本行贷方数量累加
  50.         End If
  51.     Next i
  52.     On Error Resume Next
  53.     If k > 0 Then                      '如果不是空科目,即数组不为空
  54.         If Len(brr(k, 1)) > 0 Then     '如果当前第1列是有月份的数据行(不是上年转入,本年合计、本年累计)
  55.             k = k + 1                  '最后一月的下一行行号(本月合计行)
  56.             按月汇总                   '插入最后一月的本月合计和本年累计
  57.         End If
  58.     End If
  59.     Range("b8").Resize(k, 8) = brr                       'brr赋值
  60.    ' Range("AR1") = 1                                       '页码切换为第1页
  61.     Range("b8").Resize(k, 8).Borders.LineStyle = xlContinuous       '添加边框线
  62.     For i = 9 To k + 8
  63.         If Cells(i, 5) = "本月合计" Or Cells(i, 5) = "本年累计" Then
  64.             Cells(i, 2).Resize(1, 8).Interior.ColorIndex = 20       '底色为浅蓝色
  65.         End If
  66.     Next
  67.     Erase arr                                           ' 清空arr
  68.     Erase brr                                           '清空brr
  69.     k = 0                                               '清空行变量
  70. '   yD数 = 0      '当月借方累计数量清0
  71.     yD额 = 0      '当月借方累计金额清0
  72. '   yC数 = 0      '当月借方累计数量清0
  73.     yC额 = 0      '当月贷方累计金额清0
  74. End Sub

  75. Private Sub 按月汇总()
  76.     brr(k, 4) = "本月合计"
  77.     brr(k, 5) = mD额   '本月合计借方金额
  78.     brr(k, 6) = mC额   '本月合计贷方金额
  79.     yD额 = yD额 + mD额   '本年累计借方金额 = 上月余额(内存取出)+本月合计
  80.     yC额 = yC额 + mC额   '本年累计贷方金额 = 上月余额(内存取出)+本月合计
  81.     brr(k + 1, 4) = "本年累计"  '
  82.     brr(k + 1, 5) = yD额   '借方金额本年累计赋值
  83.     brr(k + 1, 6) = yC额   '贷方金额本年累计赋值
  84.     mD额 = 0      '当月借方累计数清0
  85.     mC额 = 0      '当月贷方累计数清0
  86.     k = k + 2
  87. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2020-7-9 11:47 | 显示全部楼层
本帖最后由 hzruziniu 于 2020-7-9 14:54 编辑

会计账查询.rar (89.74 KB, 下载次数: 29)

请看附件

TA的精华主题

TA的得分主题

发表于 2020-7-9 12:41 | 显示全部楼层
已发送的附件借贷方向有误,修改后重发。
会计账查询.rar (91.02 KB, 下载次数: 22)
说明:
1、科目名称单独设置一张工作表,最好把期初余额也在科目编码工作表中单独设置一列,这样不需要调出多个工作表取数。
2、科目编码用窗体查询,窗体列表下拉信息来源于科目编码工作表的A列(把编码与名称连接起来便于查询)用定义名称赋值给窗体查询。
3、懂财务的都知道明细账有借贷科目,方向相反,因此余额也应根据借贷来统计,所以借或贷是必填项。
具体代码如下:
  1. Dim k&, arr, brr(1 To 1000, 1 To 12)
  2. Dim mD数#, mD额#, mC数#, mC额#, yD数#, yD额#, yC数#, yC额#

  3. Sub 明细账查询()
  4.     Dim i&, no$, j%
  5.     Range("b8:i1500").ClearContents                '清除数据区
  6.     Range("b8:i1500").Borders.LineStyle = xlNone   '清除网格线
  7.     Range("b8:i1500").Interior.Pattern = xlNone             '删除底色
  8.     no = Range("d4")               '科目代码定义为no
  9.     arr = Sheets("凭证明细表").Range("a2:j" & Sheets("凭证明细表").Range("a20000").End(3).Row) '.CurrentRegion  '分录源表装入数组arr
  10.     k = 0
  11.     For i = 1 To UBound(arr)
  12.         Set c = Sheets("期初余额").Range("a:a").Find(no, , , , , 1)
  13.         If k = 0 And Not c Is Nothing Then
  14.             k = k + 1
  15.             brr(k, 4) = "上年结转"             'brr数组第1行的第4列= “期初余额”
  16.             brr(k, 8) = Sheets("期初余额").Range("c" & c.Row)          'brr数组第1行的第8列的“余额”
  17.             If Range("I4") = "借" Then                                             '如果是借方科目,则如下:
  18.                 brr(k, 7) = IIf(brr(k, 8) > 0, "借", IIf(brr(k, 8) < 0, "贷", ""))  '借或贷行赋值
  19.             Else                                                                     '否则是贷方科目如下:
  20.                 brr(k, 7) = IIf(brr(k, 8) > 0, "贷", IIf(brr(k, 8) < 0, "借", ""))  '借或贷行赋值
  21.             End If
  22.         End If
  23.         If arr(i, 1) = no Then    'arr第1列的科目编码
  24.             k = k + 1
  25.             '===============主表区共6列赋值(中间有几列空列不赋值)
  26.             On Error Resume Next
  27.             If k > 1 Then                                                           '如果大于第一行
  28.                 If arr(i, 5) <> brr(k - 1, 1) And brr(k - 1, 4) <> "上年结转" Then  '如果本行第1列的月份不等于上一行的月份或都不等于“上年结转”
  29.                     按月汇总                                                        '插入本月合计和本年累计(从第1个月到最后一个月的上一月用此代码)
  30.                 End If
  31.             End If                    '上面是先判定本行是否属于下一月份,如果是先操作上面的月结,然后进入下面的按逐行顺序赋值
  32.             brr(k, 1) = arr(i, 5)     '第1列月
  33.             brr(k, 2) = arr(i, 6)     '第2列日
  34.             brr(k, 3) = arr(i, 7)     '第3列凭证号
  35.             brr(k, 4) = arr(i, 8)     '第4列摘要
  36.             brr(k, 5) = arr(i, 9)     '第5到借方
  37.             brr(k, 6) = arr(i, 10)    '第6到贷方

  38.             '================余额栏计算
  39.             r = IIf(brr(k - 1, 4) = "本年累计", 3, 1)                                   '计算余额列的上一行的行号,如果是新月份的开始行上一行余额是本行-3行,否则是本行政1行
  40.             If Range("I4") = "借" Then                                             '如果是借方科目,则如下:
  41.                 brr(k, 8) = Round(brr(k - r, 8) + brr(k, 5) - brr(k, 6), 2)           '余额行的数量计算
  42.                 brr(k, 7) = IIf(brr(k, 8) > 0, "借", "贷")                            '借或贷行赋值
  43.             Else                                                                      '否则是贷方科目如下:
  44.                 brr(k, 8) = Round(brr(k - r, 8) + brr(k, 6) - brr(k, 5), 2)           '余额行的数量计算
  45.                 brr(k, 7) = IIf(brr(k, 8) > 0, "贷", "借")                           '借或贷行赋值
  46.             End If
  47.             '================借贷方的本月合计(按月周期)本年累计(从头到尾)逐行累加
  48.             mD额 = mD额 + brr(k, 5)       '上一行内存中的本月借方金额累计数和本行借方金额累加
  49.             mC额 = mC额 + brr(k, 6)       '上一行内存中的本月贷方金额累计数和本行贷方数量累加
  50.         End If
  51.     Next i
  52.     On Error Resume Next
  53.     If k > 0 Then                      '如果不是空科目,即数组不为空
  54.         If Len(brr(k, 1)) > 0 Then     '如果当前第1列是有月份的数据行(不是上年转入,本年合计、本年累计)
  55.             k = k + 1                  '最后一月的下一行行号(本月合计行)
  56.             按月汇总                   '插入最后一月的本月合计和本年累计
  57.         End If
  58.     End If
  59.     Range("b8").Resize(k, 8) = brr                       'brr赋值
  60.    ' Range("AR1") = 1                                       '页码切换为第1页
  61.     Range("b8").Resize(k, 8).Borders.LineStyle = xlContinuous       '添加边框线
  62.     For i = 9 To k + 8
  63.         If Cells(i, 5) = "本月合计" Or Cells(i, 5) = "本年累计" Then
  64.             Cells(i, 2).Resize(1, 8).Interior.ColorIndex = 20       '底色为浅蓝色
  65.         End If
  66.     Next
  67.     Erase arr                                           ' 清空arr
  68.     Erase brr                                           '清空brr
  69.     k = 0                                               '清空行变量
  70. '   yD数 = 0      '当月借方累计数量清0
  71.     yD额 = 0      '当月借方累计金额清0
  72. '   yC数 = 0      '当月借方累计数量清0
  73.     yC额 = 0      '当月贷方累计金额清0
  74. End Sub

  75. Private Sub 按月汇总()
  76.     brr(k, 4) = "本月合计"
  77.     brr(k, 5) = mD额   '本月合计借方金额
  78.     brr(k, 6) = mC额   '本月合计贷方金额
  79.     yD额 = yD额 + mD额   '本年累计借方金额 = 上月余额(内存取出)+本月合计
  80.     yC额 = yC额 + mC额   '本年累计贷方金额 = 上月余额(内存取出)+本月合计
  81.     brr(k + 1, 4) = "本年累计"  '
  82.     brr(k + 1, 5) = yD额   '借方金额本年累计赋值
  83.     brr(k + 1, 6) = yC额   '贷方金额本年累计赋值
  84.     mD额 = 0      '当月借方累计数清0
  85.     mC额 = 0      '当月贷方累计数清0
  86.     k = k + 2
  87. End Sub
复制代码



TA的精华主题

TA的得分主题

发表于 2020-7-9 13:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
会计账查询.rar (91.02 KB, 下载次数: 45)
  1. Dim k&, arr, brr(1 To 1000, 1 To 12)
  2. Dim mD数#, mD额#, mC数#, mC额#, yD数#, yD额#, yC数#, yC额#

  3. Sub 明细账查询()
  4.     Dim i&, no$, j%
  5.     Range("b8:i1500").ClearContents                '清除数据区
  6.     Range("b8:i1500").Borders.LineStyle = xlNone   '清除网格线
  7.     Range("b8:i1500").Interior.Pattern = xlNone             '删除底色
  8.     no = Range("d4")               '科目代码定义为no
  9.     arr = Sheets("凭证明细表").Range("a2:j" & Sheets("凭证明细表").Range("a20000").End(3).Row) '.CurrentRegion  '分录源表装入数组arr
  10.     k = 0
  11.     For i = 1 To UBound(arr)
  12.         Set c = Sheets("期初余额").Range("a:a").Find(no, , , , , 1)
  13.         If k = 0 And Not c Is Nothing Then
  14.             k = k + 1
  15.             brr(k, 4) = "上年结转"             'brr数组第1行的第4列= “期初余额”
  16.             brr(k, 8) = Sheets("期初余额").Range("c" & c.Row)          'brr数组第1行的第8列的“余额”
  17.             If Range("I4") = "借" Then                                             '如果是借方科目,则如下:
  18.                 brr(k, 7) = IIf(brr(k, 8) > 0, "借", IIf(brr(k, 8) < 0, "贷", ""))  '借或贷行赋值
  19.             Else                                                                     '否则是贷方科目如下:
  20.                 brr(k, 7) = IIf(brr(k, 8) > 0, "贷", IIf(brr(k, 8) < 0, "借", ""))  '借或贷行赋值
  21.             End If
  22.         End If
  23.         If arr(i, 1) = no Then    'arr第1列的科目编码
  24.             k = k + 1
  25.             '===============主表区共6列赋值(中间有几列空列不赋值)
  26.             On Error Resume Next
  27.             If k > 1 Then                                                           '如果大于第一行
  28.                 If arr(i, 5) <> brr(k - 1, 1) And brr(k - 1, 4) <> "上年结转" Then  '如果本行第1列的月份不等于上一行的月份或都不等于“上年结转”
  29.                     按月汇总                                                        '插入本月合计和本年累计(从第1个月到最后一个月的上一月用此代码)
  30.                 End If
  31.             End If                    '上面是先判定本行是否属于下一月份,如果是先操作上面的月结,然后进入下面的按逐行顺序赋值
  32.             brr(k, 1) = arr(i, 5)     '第1列月
  33.             brr(k, 2) = arr(i, 6)     '第2列日
  34.             brr(k, 3) = arr(i, 7)     '第3列凭证号
  35.             brr(k, 4) = arr(i, 8)     '第4列摘要
  36.             brr(k, 5) = arr(i, 9)     '第5到借方
  37.             brr(k, 6) = arr(i, 10)    '第6到贷方

  38.             '================余额栏计算
  39.             r = IIf(brr(k - 1, 4) = "本年累计", 3, 1)                                   '计算余额列的上一行的行号,如果是新月份的开始行上一行余额是本行-3行,否则是本行政1行
  40.             If Range("I4") = "借" Then                                             '如果是借方科目,则如下:
  41.                 brr(k, 8) = Round(brr(k - r, 8) + brr(k, 5) - brr(k, 6), 2)           '余额行的数量计算
  42.                 brr(k, 7) = IIf(brr(k, 8) > 0, "借", "贷")                            '借或贷行赋值
  43.             Else                                                                      '否则是贷方科目如下:
  44.                 brr(k, 8) = Round(brr(k - r, 8) + brr(k, 6) - brr(k, 5), 2)           '余额行的数量计算
  45.                 brr(k, 7) = IIf(brr(k, 8) > 0, "贷", "借")                           '借或贷行赋值
  46.             End If
  47.             '================借贷方的本月合计(按月周期)本年累计(从头到尾)逐行累加
  48.             mD额 = mD额 + brr(k, 5)       '上一行内存中的本月借方金额累计数和本行借方金额累加
  49.             mC额 = mC额 + brr(k, 6)       '上一行内存中的本月贷方金额累计数和本行贷方数量累加
  50.         End If
  51.     Next i
  52.     On Error Resume Next
  53.     If k > 0 Then                      '如果不是空科目,即数组不为空
  54.         If Len(brr(k, 1)) > 0 Then     '如果当前第1列是有月份的数据行(不是上年转入,本年合计、本年累计)
  55.             k = k + 1                  '最后一月的下一行行号(本月合计行)
  56.             按月汇总                   '插入最后一月的本月合计和本年累计
  57.         End If
  58.     End If
  59.     Range("b8").Resize(k, 8) = brr                       'brr赋值
  60.    ' Range("AR1") = 1                                       '页码切换为第1页
  61.     Range("b8").Resize(k, 8).Borders.LineStyle = xlContinuous       '添加边框线
  62.     For i = 9 To k + 8
  63.         If Cells(i, 5) = "本月合计" Or Cells(i, 5) = "本年累计" Then
  64.             Cells(i, 2).Resize(1, 8).Interior.ColorIndex = 20       '底色为浅蓝色
  65.         End If
  66.     Next
  67.     Erase arr                                           ' 清空arr
  68.     Erase brr                                           '清空brr
  69.     k = 0                                               '清空行变量
  70. '   yD数 = 0      '当月借方累计数量清0
  71.     yD额 = 0      '当月借方累计金额清0
  72. '   yC数 = 0      '当月借方累计数量清0
  73.     yC额 = 0      '当月贷方累计金额清0
  74. End Sub

  75. Private Sub 按月汇总()
  76.     brr(k, 4) = "本月合计"
  77.     brr(k, 5) = mD额   '本月合计借方金额
  78.     brr(k, 6) = mC额   '本月合计贷方金额
  79.     yD额 = yD额 + mD额   '本年累计借方金额 = 上月余额(内存取出)+本月合计
  80.     yC额 = yC额 + mC额   '本年累计贷方金额 = 上月余额(内存取出)+本月合计
  81.     brr(k + 1, 4) = "本年累计"  '
  82.     brr(k + 1, 5) = yD额   '借方金额本年累计赋值
  83.     brr(k + 1, 6) = yC额   '贷方金额本年累计赋值
  84.     mD额 = 0      '当月借方累计数清0
  85.     mC额 = 0      '当月贷方累计数清0
  86.     k = k + 2
  87. End Sub
复制代码


评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-7-9 16:08 | 显示全部楼层
本帖最后由 zgjijinbao 于 2020-7-9 16:10 编辑

老师!我的余额是这样显示的,能不能显示为0
1432477546.jpg

TA的精华主题

TA的得分主题

发表于 2020-7-9 16:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这样的,先谢谢老师了!
905906970.jpg

TA的精华主题

TA的得分主题

发表于 2020-7-9 18:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
hzruziniu 发表于 2020-7-9 12:41
已发送的附件借贷方向有误,修改后重发。

说明:

不懂财务,对借贷一直是迷迷糊糊的,看附件的明细,银行存款有借有贷,但是结果中没有区分出来,不知道是不是我理解错误

TA的精华主题

TA的得分主题

发表于 2020-7-9 19:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zgjijinbao 发表于 2020-7-9 16:12
这样的,先谢谢老师了!

把你的文件发上来。

TA的精华主题

TA的得分主题

发表于 2020-7-9 20:17 | 显示全部楼层
chxw68 发表于 2020-7-9 19:05
把你的文件发上来。

谢谢了!给你找麻烦了

台账).rar

284.55 KB, 下载次数: 8

TA的精华主题

TA的得分主题

发表于 2020-7-9 20:29 | 显示全部楼层
zgjijinbao 发表于 2020-7-9 20:17
谢谢了!给你找麻烦了

能不能摘要栏显示上年结存
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-16 07:33 , Processed in 0.046807 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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