Excel VBA 7.47将总表的数据分别按照要求填入指定的模板位置中,类似word邮件合并功能
一起学习,一起进步~~
word的邮件合并功能,相信大家都非常的熟悉了,一些固定模板的批量打印功能都会用到这样的操作,但是很多时候我们的数据是Excel中的,那么我们是否能够在Excel中实现类似于word中这种数据b合并的功能呢?
代码区
其实这样的话,就有点类似于我们之前学过的Excel的数据汇总的逆推,数据的拆分了,按照计划,我们很快就会接触到更多类型的数据的拆分了,我们这里就先热个场,提前接触下数据的拆分,之所以在这里说数据拆分,主要还是因为他的操作也类似于在多个工作表中同时进行数据填充,和我们之前的章节又有一点关系,所以正好有承上启下的作用
来看看我们的场景
现在我们手上的这个工作表里面有两个表,一个就是成绩总表,一个就是模板,类似于我们通知的模板,
我们现在需要将总成绩的表中所有的同学的成绩按照模板中指定的样式进行填充,并且形成一个人一个工作表的样式来进行打印,并交给学生查看。如果手动复制粘贴,这个工作量就非常的大了,因为不仅仅是复制粘贴,还要找到正确的位置,所以这里我们需要使用VBA来帮助我们实现这样的功能。
Sub sssss()
Dim rng As Range, sth As Worksheet, sthn As Worksheet
Set rng = Application.InputBox("请选择数据源,不含表头", "数据源的确定", , , , , , 8)
For i = 1 To rng.Rows.Count
arr = rng.Rows(i)
Worksheets("模板").Copy after:=Worksheets(Worksheets.Count)
ActiveSheet.Name = arr(1, 1)
Set sthn = ActiveSheet
sthn.Cells(4, 3) = arr(1, 1)
sthn.Cells(4, 5) = arr(1, 2)
sthn.Cells(6, 4) = i
sthn.Cells(8, 4) = arr(1, 3)
sthn.Cells(9, 4) = arr(1, 4)
sthn.Cells(10, 4) = arr(1, 5)
sthn.Cells(11, 4) = arr(1, 6)
sthn.Cells(12, 4) = arr(1, 7)
sthn.Cells(13, 4) = arr(1, 8)
Next i
End Sub
看着代码挺长,请示非常的简单,中间一大段都是理解之后就非常的简单了。
先来看下效果
首先我们需要选择好数据源的范围,这里的数据源我的设计是不含表头的,因为在这里表头并没有任何的用处,我们可以根据实际的需要进行调整数据的位置
确定了数据源的范围之后,程序就可以开始运作了,我们来看看最终的结果
我们选择最后一个A22的成绩来对比下,看看是否正确
完全是没有问题的,非常的完美。
代码分析
虽然说今天的代码比较的长,但是理解之后就会觉得非常的简单,我们来看看代码的操作流程
Set rng = Application.InputBox("请选择数据源,不含表头", "数据源的确定", , , , , , 8)
首先我们确定数据源的范围,这里前面也说明了不需要选择表头,大家可能比较的疑惑,不是应该对着表头来填入数据嘛
我们来看看模板终端这些字段,我们都能够在内容中找到数据源中找到具体的位置,并且格式都是固定的,这个时候我们反而不需要那么麻烦去通过表头来选择,直接通过固定的位置来选择反而更加的快,而且代码简单
然后我们将数据源的每一行,装入数组中,这样每一行都是一个数组,我们只需要将数组中的内容填入新建的工作表中对应的位置就可以了。
可以看出来,数组中每个元素的顺序正好就是每一行数据的顺序,我们有了这个顺序之后就可以根据字段在模板中的位置,来进行一一对应了。
姓名是在模板中的cells(4,3)的位置,而姓名在数组中是第一个,所以是arr(1,1)
最终结果就是
sthn.Cells(4, 3) = arr(1, 1)
其他的都是按照这个标准依次类推,就算是这个过程中出现了某些字段没有按照这个顺序来的,也不要紧,我们直接在代码中进行更改就可以了。 更改成对应的位置
假设我们这里讲化学和物流的位置更换下
我们也仅仅是需要更换下代码中的顺序就可以了
=============================
好了,明晚21:00,准时再见!