随心所欲在Word中调用Excel数据你如果是一个办公室工作人员的话,相信你一定碰到过在Word中调用Excel中的数据打印名单的情况。你是否每次在这个时候就感到特别烦恼呢? 当然,有一些方法解决问题,譬如Word的“邮件合并”功能可以让众多数据自动按照自己的要求插入到文档中。 但假如又有另外一个要求——在同一个A4页面中要打印多项数据(为了不浪费纸张^_^),这个时候“邮件合并”功能就不能满足了,因为合并功能不能在一页中设置多项数据(譬如完整的一个信封——包括收件人地址、收件人姓名、寄件人地址等就被视为一页,而不能在同一页中打印两份信封。)
随心所欲在Word中调用Excel数据
你如果是一个办公室工作人员的话,相信你一定碰到过在Word中调用Excel中的数据打印名单的情况。你是否每次在这个时候就感到特别烦恼呢?
当然,有一些方法解决问题,譬如Word的“邮件合并”功能可以让众多数据自动按照自己的要求插入到文档中。
但假如又有另外一个要求——在同一个A4页面中要打印多项数据(为了不浪费纸张^_^),这个时候“邮件合并”功能就不能满足了,因为合并功能不能在一页中设置多项数据(譬如完整的一个信封——包括收件人地址、收件人姓名、寄件人地址等就被视为一页,而不能在同一页中打印两份信封。)
那么是否有合适的方法呢?当然,微软OFFICE被称为“只有想不到,没有做不到”的顶级办公软件,为我们准备好了足够的功能,那就是使用VBA来减轻我们的负担!
相信大家对VBA有所耳闻,只是很多朋友没有使用过。VBA是Visual Basic for Application的简称。大家知道Visual Basic是一种编程语言,而VBA就是在Visual Basic平台中将Microsoft Office中的每个应用程序都看成一个对象。每个应用程序都由各自的Application对象代表。在Word中Application对象中包含了Word的菜单栏、工具栏、Word命令等的相应对象,以及文档对象等。各对象包括了Word菜单中的所有命令按钮。如文档对象名称为Documents,其中包括Selections、Tables等。
要从Excel中引用数据,首先要知道的是其中数据单元格的表示方法。主要有两种方式,即A1和R1C1引用样式。前者是软件默认的方式,即第一个字母表示表格中的列数,第二个数字表示行数,例如A1就表示A列第一个单元格。而在R1C1引用样式中,Excel使用“R”加行数字和“C”加列数字来指示单元格的位置。例如,R1C1即指该单元格位于第1行第1列。
在Word中调用Excel数据,有两种方式,一种是OLE(对象的链接和嵌入)和DDE(动态数据交换)。这里我们要讲的是后面一种。DDE是一个协议,它允许两个应用程序通过一个DDE“通道”连续自动地进行数据交换。要控制两个应用程序之间的DDE会话,需要建立一个通道,选定一个主题,请求并传送数据,然后关闭通道。
现在,我们有名称为“1.xls”Excel数据表,如图1,要将其中的数据以个人为单位在Word中打印出来。通过在Word中创建一个名称为“获取数据”的宏,使用DDE方法即可调用出“1.xls”中的数据。运行后的结果如图2。
2楼
下面就来看看具体的代码。
Sub 获取数据()
Dim i As Integer //代表行号
Dim j As Integer //代表列号
Dim r As String
Dim c As String
For i = 2 To 4
For j = 1 To 3
chan = DDEInitiate(app:="Excel", topic:="system") //打开一个DDE通道
DDEExecute channel:=chan, Command:="[open(" & Chr(34) & "d:\1.xls" & Chr(34) & ")]"
//在一个应用程序中执行打开.xls文件命令,需要指出的是,系统要求所需文件必须放在D盘。
DDETerminate channel:=chan ——关闭DDE通道
chan = DDEInitiate(app:="Excel", topic:="1.xls") //打开一个DDE通道
dse = "r" + CStr(i) + "c" + CStr(j) //确定单元格位置
b = "教育硕士姓名:"
e = "准考证号:"
f = "地址:"
If j = 1 Then
a = b + Space(3) + DDERequest(channel:=chan, Item:=dse)
//需要显示的文字加上三个空格以及按指定单元格获取到的数据,下同
End If
If j = 2 Then
a = e + Space(3) + DDERequest(channel:=chan, Item:=dse)
End If
If j = 3 Then
a = f + Space(3) + DDERequest(channel:=chan, Item:=dse)
End If
// 通过判断列号选择显示的文字
Selection.InsertAfter (a) //在鼠标停留位置插入获得数据
With Selection.Font //对前面显示的数据进行字体设置
.NameFarEast = "宋体"
.Name = "宋体"
.Size = 14
.Bold = True
End With
Next j
Next i
DDETerminateAll //关闭所有以及打开的DDE通道
End Sub
这是一个使用DDE的简单例子,在WIN2K+Word2003环境下调试通过。相信很多朋友顺着这样的思路,肯定可以摸索出更多实用的应用方法!
回复
3楼
这东西复杂了,还带编程的。一般人都不太用的,有没有更简单点的?
回复
4楼
最简单的就是复制\粘贴.这个你总会用吧.呵呵
回复
5楼
上面的附件我已经完成,只是速度太慢,不知道谁有办法将速度加快些???
回复
6楼
要认真的学一下,因为我很久就觉得在excel计算,然后回帖到word太烦了,希望这个能解决我的这个问题。
回复
7楼
希望你能够修改一下,完善完善!提高运行速度!
回复
8楼
Sub 获取数据()
Dim i As Integer ’//代表行号
Dim r As String
Dim c As String
把下面这个赋值提到前面,不用每一个循环都执行一次赋值
b = "姓名:"
e = "准考证号:"
f = "地址:"
把这个提到前面,不用每一个循环都执行一次打开操作
chan = DDEInitiate(app:="Excel", topic:="system") DDEExecute channel:=chan, Command:="[open(" & Chr(34) & "d:\随心所欲在Word中调用Excel数据.xls" & Chr(34) & ")]"
DDETerminate channel:=chan ’——关闭DDE通道
chan = DDEInitiate(app:="Excel", topic:="随心所欲在Word中调用Excel数据.xls") ’//打开一个DDE通道
尽量减少循环的次数
For i = 2 To 9
a1 = b + Space(3) + DDERequest(channel:=chan, Item:="r" + CStr(i) + "c" + CStr(2))
a2 = e + Space(3) + DDERequest(channel:=chan, Item:="r" + CStr(i) + "c" + CStr(3))
a3 = f + Space(3) + DDERequest(channel:=chan, Item:="r" + CStr(i) + "c" + CStr(4))
Selection.InsertAfter (a1) ’//在鼠标停留位置插入获得数据
With Selection.Font ’//对前面显示的数据进行字体设置
.NameFarEast = "宋体"
.Name = "宋体"
.Size = 14
.Bold = True
Selection.InsertAfter (a2)
With Selection.Font
.NameFarEast = "宋体"
.Name = "宋体"
.Size = 14
.Bold = True
Selection.InsertAfter (a3)
With Selection.Font
.NameFarEast = "宋体"
.Name = "宋体"
.Size = 14
.Bold = True
End With
Next i
DDETerminateAll ’//关闭所有以及打开的DDE通道
End Sub
改了一下,还是比较慢
回复
9楼
这句为红色,可能语法上不对吧!?!???!
回复
10楼
不知道怎么回事,可以得出结果,但是排版不对,运行时有错误提示
红色是因为上面有一些字没有用注释符号
回复
11楼
找回自己的帖子,留个记号!
:lol
回复