Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2498|回复: 9

[已解决]求跨表操作提取折旧的模块代替原函数公式

[复制链接]
发表于 2014-3-27 12:25 | 显示全部楼层 |阅读模式
本帖最后由 icenotcool 于 2014-3-28 11:09 编辑

各位老师,想请老师帮我写跨表操作提取折旧的模块代替原函数公式作用,详情在附件内,谢谢老师了!附件 举例更新.rar (392.54 KB, 下载次数: 45)
发表于 2014-3-27 16:36 | 显示全部楼层
  1. Sub 更新报表1()
  2.     arr = Sheets("系统参数设置").[a1].CurrentRegion
  3.     Set d = CreateObject("scripting.dictionary")
  4.     For i = 2 To UBound(arr)    '把"资产处理"工作表"所属部门" 和  "折旧表总账"工作表"科室" 用字典联系起来
  5.         d(arr(i, 3)) = arr(i, 4)
  6.     Next
  7.     arr = Sheets("系统参数设置").[K1:L25]
  8.     For i = 2 To UBound(arr)    '把"资产处理"工作表"资产类别" 和  "资产分类" 用字典联系起来
  9.         d(arr(i, 2)) = arr(i, 1)
  10.     Next
  11.    
  12.     Set d1 = CreateObject("scripting.dictionary")
  13.     Set d2 = CreateObject("scripting.dictionary")
  14.     arr = Sheets("资产处理").[a1].CurrentRegion
  15.     For i = 2 To UBound(arr)
  16.         bm = arr(i, 8): ks = d(bm)    '部门-->总帐科室
  17.         lb = arr(i, 3): fl = d(lb)    '资产类别-->总帐资产分类
  18.         xkey = ks & fl    '字典的key
  19.         d1(xkey) = d1(xkey) + arr(i, 4)    '资产原值
  20.         d2(xkey) = d2(xkey) + arr(i, 12)    '计提折旧
  21.     Next
  22.    
  23.     With Sheets("折旧表总账")
  24.         arr = .[A1:I41]
  25.         ReDim brr(4 To UBound(arr), 2 To 9)
  26.         For i = 4 To UBound(arr)
  27.             ks = arr(i, 1)        '科室
  28.             For j = 2 To 8 Step 2
  29.                 fl = arr(2, j)       '资产分类
  30.                 xkey = ks & fl
  31.                 brr(i, j) = d1(xkey) '资产原值
  32.                 brr(i, j + 1) = d2(xkey)  '计提折旧
  33.             Next
  34.         Next
  35.         .[b4].Resize(UBound(brr) - 4, 8) = brr
  36.         .Cells(40, 2).Resize(1, 8).Formula = "=sum(r4c:r[-1]c)"   '计算第40行“小计”
  37.     End With
  38.    
  39. End Sub
复制代码
回复

使用道具 举报

发表于 2014-3-27 16:39 | 显示全部楼层
和公式计算的比较了一下,大多数都是对的,就最后“行政后勤”几个数不对。我把不对的数值用红色标出来了。

举例更新.rar

341.12 KB, 下载次数: 24

回复

使用道具 举报

发表于 2014-3-27 16:40 | 显示全部楼层
另外一张表基本可以完全套用此代码,把表名改一下就行了。
回复

使用道具 举报

 楼主| 发表于 2014-3-27 17:07 | 显示全部楼层
本帖最后由 icenotcool 于 2014-3-27 21:12 编辑

谢谢老师了,老师,但是第41行“财政拨付”这个科室单列的数据没有统计出来,我改成42就可以了,还有老师第二个报表的绿色区域要特殊处理的数据该怎么写呢?还有第2个表有2个小计该怎么写呢?(备注:折旧要考虑上面红色区域分摊特别处理。),麻烦老师了,第2个表我改动如下:
Sub 更新报表2()
    arr = Sheets("系统参数设置").[a1].CurrentRegion
    Set d = CreateObject("scripting.dictionary")
    For i = 2 To UBound(arr)    '把"资产处理"工作表"所属部门" 和  "折旧表成本核算"工作表"科室" 用字典联系起来
        d(arr(i, 3)) = arr(i, 5)
    Next
    arr = Sheets("系统参数设置").[K1:L25]
    For i = 2 To UBound(arr)    '把"资产处理"工作表"资产类别" 和  "资产分类" 用字典联系起来
        d(arr(i, 2)) = arr(i, 1)
    Next
   
    Set d1 = CreateObject("scripting.dictionary")
    Set d2 = CreateObject("scripting.dictionary")
    arr = Sheets("资产处理").[a1].CurrentRegion
    For i = 2 To UBound(arr)
        bm = arr(i, 8): ks = d(bm)    '部门-->成本核算科室
        lb = arr(i, 3): fl = d(lb)    '资产类别-->总帐资产分类
        xkey = ks & fl    '字典的key
        d1(xkey) = d1(xkey) + arr(i, 4)    '资产原值
        d2(xkey) = d2(xkey) + arr(i, 12)    '计提折旧
    Next
   
    With Sheets("折旧表成本核算")
        arr = .[A1:I52]
        ReDim brr(4 To UBound(arr), 2 To 9)
        For i = 4 To UBound(arr)
            ks = arr(i, 1)        '科室
            For j = 2 To 8 Step 2
                fl = arr(2, j)       '资产分类
                xkey = ks & fl
                brr(i, j) = d1(xkey) '资产原值
                brr(i, j + 1) = d2(xkey)  '计提折旧
            Next
        Next
        .[b4].Resize(UBound(brr) - 4, 8) = brr
        .Cells(45, 2).Resize(1, 8).Formula = "=sum(r4c:r[-1]c)"   '计算第45行“小计”
       .[b46].Resize(UBound(brr) - 4, 8) = brr                                                             '这个我不会改
        .Cells(50, 2).Resize(1, 8).Formula = "=sum(r46c:r[-1]c)"   '计算第50行“小计”  '这个我不会改
    End With
   
End Sub
请老师纠正,麻烦老师了!
回复

使用道具 举报

发表于 2014-3-28 09:57 | 显示全部楼层
第1个问题:第41行“财政拨付”,代码最后第二句.[b4].Resize(UBound(brr) - 4, 8) = brr改成.[b4].Resize(UBound(brr) - 3, 8) = brr。因为数组brr下标是从4开始的,所以行数应该是Uboud(arr)-4+1。一开始调试的时候没有注意。
回复

使用道具 举报

 楼主| 发表于 2014-3-28 10:44 | 显示全部楼层
谢谢老师,可以了,老师,麻烦你再帮我看看第二张表,可以吗?第二张表,有2个科室数据需要分摊处理
回复

使用道具 举报

发表于 2014-3-28 10:59 | 显示全部楼层
  1.     arr = Sheets("系统参数设置").[a1].CurrentRegion
  2.     Set d = CreateObject("scripting.dictionary")
  3.     For i = 2 To UBound(arr)    '把"资产处理"工作表"所属部门" 和  "折旧表成本核算"工作表"科室" 用字典联系起来
  4.         d(arr(i, 3)) = arr(i, 5)
  5.     Next
  6.     arr = Sheets("系统参数设置").[K1:L25]
  7.     For i = 2 To UBound(arr)    '把"资产处理"工作表"资产类别" 和  "资产分类" 用字典联系起来
  8.         d(arr(i, 2)) = arr(i, 1)
  9.     Next
  10.    
  11.     Set d1 = CreateObject("scripting.dictionary")
  12.     Set d2 = CreateObject("scripting.dictionary")
  13.     arr = Sheets("资产处理").[a1].CurrentRegion
  14.     For i = 2 To UBound(arr)
  15.         bm = arr(i, 8): ks = d(bm)    '部门-->总帐科室
  16.         lb = arr(i, 3): fl = d(lb)    '资产类别-->总帐资产分类
  17.         xkey = ks & fl    '字典的key
  18.         d1(xkey) = d1(xkey) + arr(i, 4)    '资产原值
  19.         d2(xkey) = d2(xkey) + arr(i, 12)    '计提折旧
  20.     Next
  21.    
  22.     With Sheets("折旧表成本核算")
  23.         arr = .[A1:I53]
  24.         ReDim brr(4 To UBound(arr), 2 To 9)
  25.         For i = 4 To UBound(arr)
  26.             ks = arr(i, 1)        '科室
  27.             For j = 2 To 8 Step 2
  28.                 fl = arr(2, j)       '资产分类
  29.                 xkey = ks & fl
  30.                 brr(i, j) = d1(xkey) '资产原值
  31.                 brr(i, j + 1) = d2(xkey)  '计提折旧
  32.             Next
  33.         Next
  34.         .[b4].Resize(UBound(brr) - 3, 8) = brr
  35.         .[b45].Resize(1, 8).Formula = "=sum(r4c:r[-1]c)"   '计算第45行“小计”
  36.         .[b50].Resize(1, 8).Formula = "=sum(r4c:r[-1]c)-r[-5]c"   '计算第50行“小计”(全部小计-第45行小计)
  37.     End With
  38.    
  39. End Sub

  40. Sub 分摊处理()
  41.     Set d = CreateObject("scripting.dictionary")
  42.     With Sheets("折旧表成本核算")
  43.         arr = .[A1:I53]
  44.         brr = .[m1].CurrentRegion
  45.         For j = 2 To 3
  46.             For i = 1 To UBound(brr) Step 2
  47.                 ks = Replace(brr(i, j), "比例", "")
  48.                 If j = 2 Then d(ks) = d(ks) + brr(i + 1, 1) * brr(i + 1, j)    '行政后勤
  49.                 If j = 3 Then d(ks) = d(ks) - brr(i + 1, 1) + brr(i + 1, 1) * brr(i + 1, j)    '其他科室
  50.             Next
  51.         Next
  52.         For i = 4 To UBound(arr)
  53.             ks = arr(i, 1)
  54.             If d.exists(ks) Then .Cells(i, 5) = .Cells(i, 5) + d(ks)
  55.         Next
  56.     End With
  57. End Sub
复制代码
回复

使用道具 举报

发表于 2014-3-28 11:00 | 显示全部楼层    本楼为最佳答案   
分摊处理我单独弄了段代码。另外第一张表的小计也处理过了。

举例更新.rar

345.12 KB, 下载次数: 23

回复

使用道具 举报

 楼主| 发表于 2014-3-28 11:08 | 显示全部楼层
真是谢谢老师了,至于数据出现误差,应该是我设置的科室有遗漏,我核查一下就可以了,谢谢老师,辛苦了!
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-16 21:16 , Processed in 0.411384 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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