很多打工人们经常遇到一个问题,我左手有一堆数据,右手有格式一模一样的表格,我要把数据填到这些表格,并且全部一份份打印出来,如何才能快速做到?一个数据一个数据地贴真是太悲惨了,比如员工的工资单、固定资产的盘点单、订货单、快递单等
这个问题来自我原来的一位同事,前些天请我帮忙,也是知乎上不少人问过我的问题,我发现这个小小业务竟然困扰了很多人,所以准备把自己一个比较不成熟的解决方法分享出来,我们使用最简单的VBA。
具体思路如下,设计两张表格,一张是数据表,一张是单据模板:
数据列表:把我们要填入单子的数据以数据列表形式整理出来,形式如下:
注意点:我们需要将第一列
的固定资产号
,作为非重复唯一值字段
,注意必须第一列
![2232b55add315b8a95c43c3e2d982c38.png](https://i-blog.csdnimg.cn/blog_migrate/78fb0ceaf2b9159506bf23f18e4d7669.jpeg)
然后我们设计好单据模板,这里可以调整好我们需要打印的格式:
注意点:我们现在B2单元格粘贴复制其中一个数据列表中的固定资产编号
,也就是我们设定的非重复唯一值
列表中的其中一个,然后其他几个字段内容我们用vlookup函数带出来,这样一来,一张模板就做好了
![fe3a76aafdc44d534951fd7bf186daec.png](https://i-blog.csdnimg.cn/blog_migrate/c035d574a1a754036e1d407a9996ee2e.jpeg)
然后我们把表格保存成*.xlsm
格式,这是一个可以带宏运行模式的表格,接着点开Excel选项-自定义功能区-主选项卡
复选框内把我们的开发工具勾选上
![da988cdd9e210fd27d63527ec22a74fd.png](https://i-blog.csdnimg.cn/blog_migrate/c8e06d57dcd6fe65839f32a0d25795c6.jpeg)
这样一来,我们回到Excel主页面可以看到开发工具选显卡
,我们从这里进入Visual Basic功能区
,进入我们的编程页面
![8d2efce4babb77fcccb7824ab4ae2359.png](https://i-blog.csdnimg.cn/blog_migrate/69c40dc16c6321604366f56457417a31.jpeg)
之后,会来到一个编程界面,我们在工程页面,点击-右键-插入-模块
![b42b3f351c9e900da6b0c648976fdf3f.png](https://i-blog.csdnimg.cn/blog_migrate/afd830d697255c0595d050ca184585b0.jpeg)
然后将以下代码复制到模块当中:
Sub createCard()
'行索引
Dim i As Long
'存放临时表单名
Dim sname As String
'从第2行开始
i = 2
'进入循环,如果数据列表A列第i行为空,或者出现结束文本内容,就结束循环
'sname先保存数据列表中Ai位置的内容,也就是固定资产编号
'然后复制一张单据模板,将单据模板中B2位置的内容,也就是数据编号字段替换为当前的sname
'将赋值出来的表格名称改为sname,也就是固定资产编号,如此一来生成的表格不会重名
'这也是为何数据列表一定要有一列是非重复唯一值字段的原因
Do
If Sheets("数据列表").Range("A" & i) = "" Or Sheets("数据列表").Range("A" & i) = "结束" Then Exit Do
sname = Sheets("数据列表").Range("A" & i)
Sheets("单据模板").Copy Before:=Sheets(1)
Sheets("单据模板 (2)").Range("B2") = sname
Sheets("单据模板 (2)").Name = sname
i = i + 1
Loop
End Sub
然后我们保存一下工程,回到Excel主页面中,在数据列表这里插入一个按钮,链接一下我们刚写的程序,这样我们点一下按钮程序就会跑起来了
![81132a28d457a12e17aa59138469d0a2.png](https://i-blog.csdnimg.cn/blog_migrate/e96c504d57f2b4daa6f53c6dbfb8c94f.jpeg)
Excel会让我们选择宏,我们只要指定刚才编写的createCard()
事件即可
![9d17dc68dfab54b6f32f5da7171d4076.png](https://i-blog.csdnimg.cn/blog_migrate/2d689621cf2c0765e2e75b0e9b14f42f.png)
然后我们按住ctrl键点击按钮,可以给它重命名:批量生成卡片
按一下,我们需要的表单都生成了!数据列表中的每条流水,都有了自己对应的表格
![f7ebdca5192251fd6af6550fb671ac2d.png](https://i-blog.csdnimg.cn/blog_migrate/e1efc5a48a54cbe89a4dad328e710c0f.png)
![571c24b42276d7b38e10e4ee7713272a.png](https://i-blog.csdnimg.cn/blog_migrate/0021ca3296c4953ff55877fbc9e8dcd1.jpeg)
如果我们需要批量打印,那么只需要,按住crlt选中数据列表和数据模板这两张表,右键隐藏
![d99a540102cc67baab58fbedf43f9c4b.png](https://i-blog.csdnimg.cn/blog_migrate/7d456a49b2fb9c367bce226d03c6c5b3.png)
然后在打印页面选择打印整个工作簿即可
![14c1af9d165d4f5461f6f563097e3811.png](https://i-blog.csdnimg.cn/blog_migrate/f9203b9f647c8255b8197e47784ba185.jpeg)
如果下次要重用就先把隐藏的数据列表和表单模板放出来,把已经生成的表格都删除就行了
是不是很简单呢,是不是vba也不难呢?
然而这就结束了吗,当然不是,通过这样一个简单的例子,我们要思考,背后隐藏了什么原理?
这是一个非常典型的数据库查询模式,数据列表的呈现形式是很多管理系统中数据表的table,而单据模板,则是典型的view,我们可以在单据模板上加上更复杂的功能比如做一些字段的运算、拼接、求值、判断等,但这一切都来源于我们对数据列表的设计,正如我在
郑天玑:为什么不用复杂的EXCEL函数zhuanlan.zhihu.com中写的那样,数据处理和数据分析工作的前端是如何能够快速高效地整理和存储数据,如何切割数据之间的关系,满足数据库设计的范式需求又能满足业务逻辑,可能还需要一点设计模式的概念,这会省去我们很多后期绞尽脑汁想一些奇技淫巧、写完三个月自己都看不懂的代码和函数,减少数据清理工作的工作量。
同时,这篇作为vba入门的基础,同时涉及了几个基本知识点:
如何创建vba工程、数据声明、赋值、循环(进入和结束)、判断、表格区域的定位模式(取值与赋值)
相信很多同学看到这里,肯定觉得vba不难,不需要去学习很长的视频,也不需要花钱去培训班,甚至书都不需要买,哪里不懂在Excel按F1,查询内容,依样画葫芦,不知道功能怎么用直接录制宏,根据系统生成的宏代码拿来就用即可。
如果你有同样的业务困扰,试着根据以上步骤练习一下,拿自己的数据修改一下,跑一下试试,相信会有收获,同时也思考下如果数据列表第一列值不唯一的时候会发生什么呢?
模板下载:
链接: https://pan.baidu.com/s/1NxltoxyZ3bL8kxxXopOifg 提取码: x6et