EXCEL表如何用VBA将汇总表中符合要求的数据自动写入到其他明细表中,其他明细表格式和总表不一致

将凭证明细表符合科目名称为银行存款和库存现金的数据自动录入到表现金银行明细表相应的不为空的行相应列内。

您好,


请问 “现金银行明细” 表中的 “借方金额” 列中的数据比如 “627354.46” 是从哪里来的?是之前累加起来的呢还是另有其源?


以下是附件运行后的效果图:

【凭证明细表】


【银行现金明细】 


注意:这里是把相应的科目名称进行汇总计算后录入到 “银行现金明细” 表中,还有比如 “银行存款” 中同时有借有贷,所以在 “借或贷” 列就用公式生成了 “借和贷”,如果不是您要的结果,请告知。另外,为了确定 “借或贷”,您也可以手动在 “借方金额” 或 “贷方金额” 列中输入其他数值,比如零或负数进行测试下即可看到 K 列公式的具体效果了。对于其他科目名称比如 “其他应收款” 的自动录入该宏也是适用的。


这个问题主要是用 “公式+VBA” 的方式来处理,也就是说通过 VBA 将公式动态写入到单元格中,具体请参考下列代码:

Option Explicit

' ##############################
' [功能描述] è‡ªåŠ¨è¾“入账单.
' [参数列表] æ— .
' [返回类型] æ— .
' ------------------------------
' [创 å»º äºº] Cristin
' [创建时间] 2013-06-29 00:46:07
' ##############################
Public Sub AutoAccountBill()
    ' ----------------
    ' 0: å‡­è¯æ˜Žç»†è¡¨;
    ' 1: é“¶è¡ŒçŽ°é‡‘明细.
    ' ----------------
    Dim wsTarget(1) As Worksheet
    ' --------------------------------------------
    ' 0: å‡­è¯æ˜Žç»†è¡¨ä¸­ "总账科目" åˆ—的最大数据行;
    ' 1: é“¶è¡ŒçŽ°é‡‘明细中 "科目名称" åˆ—的最大数据行.
    ' --------------------------------------------
    Dim lngMaxRow(1)    As Long
    
    On Error GoTo ERR_HANDLER
    
    ' è®¾ç½®å¯¹å‡­è¯æ˜Žç»†è¡¨çš„引用.
    Set wsTarget(0) = Worksheets("凭证明细表")
    ' è®¾ç½®å¯¹é“¶è¡ŒçŽ°é‡‘明细的引用.
    Set wsTarget(1) = Worksheets("银行现金明细")
    
    ' /* æ£€æµ‹å½“前活动工作表. */
    If Not (ActiveSheet Is wsTarget(1)) Then wsTarget(1).Activate
    
    ' èŽ·å–凭证明细表中 "总账科目" åˆ—的最大数据行.
    lngMaxRow(0) = wsTarget(0).Cells(Application.Rows.Count, "$E").End(xlUp).Row
    ' èŽ·å–银行现金明细中 "科目名称" åˆ—的最大数据行.
    lngMaxRow(1) = wsTarget(1).Cells(Application.Rows.Count, "$A").End(xlUp).Row
    
    ' æ‰‹åŠ¨è®¡ç®—.
    Application.Calculation = xlCalculationManual
    
    With wsTarget(1)
        ' /* è®¾ç½®å•å…ƒæ ¼å…¬å¼ (借方金额 | è´·æ–¹é‡‘额 | å€Ÿæˆ–è´·). */
        .Cells(7, "$I").FormulaR1C1 = "=SUMIF(凭证明细表!R3C5:R" & _
                                       CStr(lngMaxRow(0)) & "C5,RC[-8],凭证明细表!R3C7:R" & _
                                       CStr(lngMaxRow(0)) & "C7)"
        .Cells(7, "$J").FormulaR1C1 = "=SUMIF(凭证明细表!R3C5:R" & _
                                       CStr(lngMaxRow(0)) & "C5,RC[-9],凭证明细表!R3C8:R" & _
                                       CStr(lngMaxRow(0)) & "C8)"
        .Cells(7, "$K").Formula = "=IF(OR(I7>0,J7>0)," & _
                                   "IF(AND(I7>0,J7<=0),""借""," & _
                                   "IF(AND(I7<=0,J7>0),""è´·"",""借和贷"")),"""")"
        
        ' /* è‡ªåŠ¨å¡«å……单元格公式 (借方金额 | è´·æ–¹é‡‘额 | å€Ÿæˆ–è´·). */
        .Cells(7, "$I").AutoFill Range("$I$7:$I$" & CStr(lngMaxRow(1)))
        .Cells(7, "$J").AutoFill Range("$J$7:$J$" & CStr(lngMaxRow(1)))
        .Cells(7, "$K").AutoFill Range("$K$7:$K$" & CStr(lngMaxRow(1)))
    End With
    
SUB_EXIT:
    ' è‡ªåŠ¨è®¡ç®—.
    Application.Calculation = xlCalculationAutomatic
    
    ' /* æ¸…空对象占用的内存资源. */
    If Not (wsTarget(0) Is Nothing) Then Set wsTarget(0) = Nothing
    If Not (wsTarget(1) Is Nothing) Then Set wsTarget(1) = Nothing
    
    MsgBox "处理完成!", vbInformation, "提示"
    
    Exit Sub
    
ERR_HANDLER:
    MsgBox Err.Description, vbCritical + vbSystemModal, "错误"
    GoTo SUB_EXIT
End Sub


您也可以通过下载该附件来运行上述宏(只需点击【银行现金明细】表中的 "录入" 按钮即可),以便查看是否满足您的需求。

追问

非常感谢这位朋友的解答,代码也提供得很详细,但和我想要实现的要求还是有出入,首先我要求的是以流水方式记录到明细表中,不是汇总后记入银行明细表中。第二记录时要从空白行开始记录,不能覆盖之前存在的年初数据。凭证汇总表中可能会有很多科目,要求只是符合银行存款和库存现金两个科目的流水记入这张银行存款明细表,日期,凭证号,摘要都要顺序记录到明细表相应的列中。不知这样是否表达清楚。希望能再次帮助解答。谢谢!

追答

您好,


您说的大致意思我能明白,根据您说的最后一句:

日期,凭证号,摘要都要顺序记录到明细表相应的列中。

可以发现摘要两表中是明显都有的对吧?


然后 “日期” 应该是和 “年”、“月” 对应的吗?如果是这样的,那么进一步问一下:

是把 â€å‡­è¯æ˜Žç»†è¡¨â€œ 中的 “日期” 直接传输到 â€é“¶è¡ŒçŽ°é‡‘明细“ 表中的 ”年“ 列还是 ”月“ 列?如果都不是,”凭证明细表“ 中的 “日期” 是否需要拆分 "å¹´" 和 ”月“ 然后填到 ”银行现金明细“ 表中的 ”年“、”月“ 列?

如:日期 → 2013年7月,拆分出年份 ”2013“ 填到 ”年“ 这一列,拆分出月份 ”7“ 填充到 ”月“ 这一列。

如果需要拆分,那么原日期是什么格式的?比如 ”2013.07“、”2013-07“、”13 年 7 月“ 等等等。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-07-05
把问题作为内容(邮件主题一定要包含“Form”,本人以此为依据辨别非垃圾邮件,以免误删)、excel文件作为附件发来看下 [email protected]
相似回答