
内容提要
银行明细账与银行流水核对勾选
大家好,我是冷水泡茶,这两天在某论坛上看到一则求助贴,[求助] 麻烦帮忙看看这段代码要怎么修改关于流水匹配问题。
代码就不看了,我们看看他的表格,是这样的:

他的要求是(原话):
好久没有来论坛了,最近遇到银行流水与金蝶导出核对明细账问题,想请教一下各位大神需要怎么处理,上面有一段代码,但是这段代码只能核对两边1贷方数据是否有相同的,如果有,就清楚相同数据+前面日期,但是我想要的效果是左边的借方,贷方数据日期,与右边的借方,贷方,日期核对重复值,也就是日期+金额一起核对,当日期+金额一致时,才算重复,并且清空对应两边数据,金额匹配的话,希望能实现不会因为千分号与没有千分号情况,而导致匹配不上,非常感谢!
他的要求是把同日期,同金额的数据清除,留下的就是未达账了。但我觉得这样的做法不是太好。
我觉得我们最好是把核对相符的记录标志出来,核对完成后,未标志的数据就是未达账。并且,按照日期相同来核对,是不是过于严格,感觉没有太大的必要。
不过,我还是按照他的需求写了一段清除相同记录的代码:
Sub check() Dim ws As Worksheet Dim arr() Dim lastRow As Long Dim lastCol As Long Set ws = Sheets("Sheet1") With ws lastRow = .UsedRange.Rows.Count lastCol = .UsedRange.Columns.Count arr = .Range("A4:M" & lastRow).Value End With For i = 1 To UBound(arr) If arr(i, 3) <> "" Then For j = 1 To UBound(arr) If CDate(arr(i, 1)) = CDate(arr(j, 10)) Then If arr(i, 5) <> 0 Then If CDbl(arr(i, 5)) = CDbl(arr(j, 11)) Then arr(i, 5) = 0 arr(j, 11) = 0 GoTo NextFor End If ElseIf arr(i, 4) <> 0 Then If CDbl(arr(i, 4)) = CDbl(arr(j, 12)) Then arr(i, 4) = 0 arr(j, 12) = 0 GoTo NextFor End If End If End If Next End IfNextFor: Next ws.Range("A4").Resize(UBound(arr), UBound(arr, 2)) = arrEnd Sub
另外,我按照自己的想法,重新设计了表单,采用标志相同金额的方式,不考虑日期,做了一个简单的银行对账明细记录核对勾选小工具,分享给大家:

基本思路与实现过程
1、重新设计表头,规范字段:企业借方,企业贷方,LeftCheck,银行借方,银行贷方,RightCheck,为关键字段,不可修改。
左边为企业银行日记账:

右边为银行流水明细表:

2、我们在勾选之前,要先清除一下已有核对标志。我们点“勾对”,运行核对过程。核对完之后,点“未达”把未标志的数据复制到“未达账“这张表中,供编制银行余额调节表使用。在我们自动勾对之后,我们还可以手工勾对,把一对多,甚至多对多的记录手工标志(在LeftCheck、RightCheck填上内容),然后再提取未达账。
3、勾选核对过程:
(1)把明细数据装入数组arr。数据包括表头。为了增加灵活适用性(可以插入列),一方面指定表头字段不能修改,另一方面,我们把关键的几列采用变量的形式表示:
With ws lastRow = .UsedRange.Rows.Count lastCol = .UsedRange.Columns.Count arr = .Range(.Cells(3, 1), .Cells(lastRow, lastCol)).Value leftDebitPos = Pxy(arr, "企业借方", 2) leftCreditPos = Pxy(arr, "企业贷方", 2) rightDebitPos = Pxy(arr, "银行借方", 2) rightCreditPos = Pxy(arr, "银行贷方", 2) leftCheckPos = Pxy(arr, "LeftCheck", 2) rightCheckPos = Pxy(arr, "RightCheck", 2)End With
(2)循环数组,比较左边、右边对应借贷方的金额,如果相同的,就在各自的右边勾选列填上内容,什么内容并不重要,刚开始我是用“√”,后来因为调试代码,改为显示对方所在的行号。找到相同金额的,就进入下一个循环。
If leftDebit = rightCredit Then 'arr(i, leftCheckPos) = "√" 'arr(j, rightCheckPos) = "√" arr(i, leftCheckPos) = "R-" & j + 2 arr(j, rightCheckPos) = "L-" & i + 2 GoTo NextForEnd If
(3)把结果写入数组,并将勾选记录标上颜色:
ws.Range("A3").Resize(UBound(arr), UBound(arr, 2)) = arrCall ColorChecked(ws, leftCheckPos, rightCheckPos)
标色的代码原来是写在这个过程里面的,但不知为何,总是有问题,后来试着把它单独列一个过程,基本是同样的代码,倒是正常了,真是有点百思不得其解。
4、生成未达账明细过程。
(1)把勾选完成的“核对表”装入数组arr。
(2)循环数组,把LeftCheck、RightCheck为空的记录提取出来,存到一个数组arrTem里。
(3)把结果写入“未达账“表。这里进行了容错处理,如果没有”未达账“这张表,我们就新建,如果有,则清除内容。
5、今天这个案例,应该说有一定的实用性,特别是对于银行流水非常多的单位,又没有财务软件支持自动对账的,可以减轻一点人工核对的工作量。
6、当然,这个案例在功能方面,还有很大的深挖空间,我也准备继续做,今天先发出来呢,一方面这个功能可以用了,不必追求完美,另一方面是为了更新公众号文章:
(1)一对多匹配。
这里主要指企业账面存在合并银行单据入账的情况,反过来,一个银行流水金额,对应多个企业银行明细账金额,这种情况不能说没有,只能说极少(我曾经工作过的一个集团公司,有按照部门核算资金的,经常出现一笔货款分属于几个部门的情况,在做账的时候就不得不按部门拆分成几个金额,造成银行对账非常麻烦。)
我们财务人员在账务处理时,要根据实际情况来决定是否需要合并银行单据来填制会计凭证。如果经常会造成银行对账困难的,那我们就应该尽量按照银行单据逐一输入银行科目的发生额。如果大多数月份,银行单据均能完全入账,而且账面存款余额与对账单余额经常能够保持一致,那么,对于同类型的业务,合并制单应该也是可以的,比如银行手续费,几毛几块的,没有必要一笔笔地去做。
(2)直接生成“银行存款余额调节表“
(A)读取上月“银行存款余额调节表“中的未达账到”核对表“中,参与勾选。
(B)读取“企业银行存款明细账”,按核对表相关字段整理成固定格式的Excel文档。手工复制粘贴进来也行。
(C)读取“银行流水明细表”,这是网银导出来的电子表格,处理方式同上。
(D)核对完成后,按“核对表第二行”银行账户“名称,加上”月份“保存为单独的文件。
今天就这样!完整代码见第二条推文。
~~~~~~End~~~~~~
喜欢就点个赞、点在看、留言评论、分享一下呗!感谢支持!
本文于2023年10月12日首发于本人同名公众号:Excel活学活用(VBA编程实战),更多文章案例请搜索关注!
案例文件分享说明:请关注本人同名VX公众号(VBA编程实战)了解文件获取方式,免费!