摘要
一位60后财务从业者回顾从早期电子表格、Excel 函数,到学习 VBA 代码助手与语音编程的过程。文章结合 SAP 数据转换、生产系统与财务软件间的数据整理,以及工资核算代码,分享围绕岗位需求持续改进工具的经历,并附数组、字典匹配示例。处理用时、人员投入和职业经历均为作者自述,硬件条件变化也在原文中说明。
作者:小李*(财务) · 学员投稿;文中效果与效率为作者自述。
昨天办好了退休手续。66年出生,81年参加高考,83年毕业。上学时没有电脑(也没听说过电脑)。毕业后分配到机关工作。92年参加县审计局招聘,考了全市(不是全县是全市)第1名,因为没有背景面试被刷,一气之下自动离职去了外资企业。
那家外资92年刚成立,老板带来2台电脑,一台黑白屏一台彩色屏,应该是286,数据要保存在A/B盘保存才能带出,听到磁盘保存的嘶啦声,别提多美了。
98年到另一家日企,那时还没有EXCEL,表格叫Lotus。那时国内也没有财务软件,我用Lotus做了个财务凭证新增保存查询,用起来挺好的。
后来,office开始使用了,我一直用。
我记得2010年我到一家民企,几个月后这家民企被德企全资收购了。那家德企有一套德国的管理查询表格,用的是国际会计准则,欧元为货币单位。我按表格的要求,将中国的会计准则与国际会计准则进行转换(这项工作原来是请一家四大做的,一年要收80万人民币),一开始老外不相信,后来我做一套,事务所做一套,两个一比较,真的没有差异,第2年就用我做的了。因为不懂英语(德企用英语),在德企工作了4年多(从民企开始算5年),给了15万辞退金,离开了德企。
2014年,找到一个叫“我要自学网”,看到excel课程,跟着学。一点一点的,也掌握了十几二十个函数,用起来挺顺手的。

因为我2009年考了注会,2015年就到会计师事务所工作了。大家可能对会计师不太了解,小所资金、人才不足,基本上是靠手工加加减减,大部分的人只能用审计软件刷刷底稿。遇到大项目就干瞪眼了。其实大事务所也是如此,我曾见过大事务所因为无法从客户的国内软件中导数据,请客户财务电子填表格满足审计底稿的事,而且这种情况现在还存在。
我们事务所也有使用SAP软件的客户(而且是集团公司,下面有几十家子公司),这个软件无法用审计软件取数,怎么办呢,我就用函数,记得那时用函数转换一家子公司,100万行的数据要用一天的时间主要是电脑配置不足(4G内存、机械硬盘)。
那时我还给同事讲如何转换,10个人一个都没有学会。没办法,只能自己摸索。2023年在网上找到郑广学老师的vba代码助手,果断买了。

这是用代码助手改进后的SAP转换代码

这时,100万行的数据大约需要2个小时(电脑硬件条件也好了一些有16G内存)。
这些年,一直在琢磨VBA助手,现在在一家民营任财务顾问,帮助企业写了很多的转换程序,节省了很多人力。如:原来数据中心用了6个人,整天从生产系统中数据转换到金蝶星空软件,现在半个人就可以了(半个人的原因是还要做其他工作)。

说句老实话,代码助手中,我保存了几十个自己编写的代码,极大地提高了工作效率和准确性。
大家看看下面的这段代码就是运用VBA代码助手写出来的。
Sub 匹配字典方式表1匹配表2内容()
'VBA,表1有两列分别为卷号、净重,表2有两列分别为卷号、等级,请用中文变量、数组、字典方式,将表2的卷号对应等级对应到表1的第3列,数组写回表1
Dim ws1 As Worksheet, ws2 As Worksheet
Dim 表1数据 As Variant, 表2数据 As Variant
Dim 字典 As Object
Dim i As Long, 最后行 As Long
' 设置工作表对象
Set ws1 = ThisWorkbook.Sheets("表1") ' 修改为你的表1名称
Set ws2 = ThisWorkbook.Sheets("表2") ' 修改为你的表2名称
' 读取表2数据到字典(卷号 → 等级)
Set 字典 = CreateObject("Scripting.Dictionary")
最后行 = ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row
表2数据 = ws2.Range("A2:B" & 最后行).Value ' 假设表2数据从第2行开始
For i = 1 To UBound(表2数据, 1)
If Not 字典.Exists(表2数据(i, 1)) Then
字典.Add 表2数据(i, 1), 表2数据(i, 2) ' 键=卷号,值=等级
End If
Next i
' 读取表1数据到数组,并匹配等级
最后行 = ws1.Cells(ws1.Rows.Count, "A").End(xlUp).Row
表1数据 = ws1.Range("A2:C" & 最后行).Value ' 表1的C列用于写入等级
For i = 1 To UBound(表1数据, 1)
If 字典.Exists(表1数据(i, 1)) Then
表1数据(i, 3) = 字典(表1数据(i, 1)) ' 将等级写入数组第3列
Else
表1数据(i, 3) = "无匹配等级" ' 未匹配时的提示
End If
Next i
' 将数组写回表1的C列
ws1.Range("C2:C" & 最后行).Value = Application.Index(表1数据, 0, 3)
MsgBox "等级匹配完成!", vbInformation
End Sub
今年3月5日,刚过完春节,我在听郑老师PYTHON课时听到老师又推出了vbayyds用嘴编程课程,果断买了。只要一有时间,就听老师的直播课。
今天给大家展示一下,用VBA编写自动完成月工资核算的VBA代码

学无止境,虽花甲之年,不忘努力上进。感谢郑老师,与同学们共勉。

