分享

Excel和Word数据交互读取(一)

 VBA说 2020-04-07

最近一直研究,Excel和Word数据交互读取的东西。市面上Word VBA的教程比较少,我学习这个基本是各种百度和遇到实例的摸索总结,可以说是学习和实践的结晶。我尽可能详细的写。

我把我整理的干货分享给大家,希望各取所需。

一、实际案例引入

在实际中还是有很多的应用的,只是大多数人不知道有VBA这种东西,以至于做无谓的重复性工作。比如下面这种情况:把Excel题库导入Word

Excel题库

导入Word后的效果

这东西如果手动去做,费时费力,生无可恋。还好有VBA这东西。我们用Excel代码操作Word,直接把Excel中的数据写入Word。(附件后台回复:"试题"获取)

Sub 导出题库()
    Set doc = CreateObject("word.application"'创建Word对象
    Set wd = doc.Documents.Add
    With ThisWorkbook.Worksheets(2)
        rrow = .Range("a65536").End(3).Row
        For i = 2 To rrow
            arr = Split(.Cells(i, 3), "|")
            If UBound(arr) > 1 Then
                strr = .Cells(i, 1) & "、" & .Cells(i, 2).Value & vbCrLf & _
                "A." & arr(1) & "B." & arr(2) & "C." & arr(3) & "D." & arr(4) & vbCrLf & "标准答案:" & .Cells(i, 4)
                With doc.Selection
                    .TypeText strr
                    .TypeParagraph
                End With
            Else
            End If
        Next
        wd.SaveAs ThisWorkbook.Path & "\例子.docx"
    End With
End Sub

实现代码

看代码,其实很简单。操作Word,最重要的就是要知道Word VBA的对象、属性以及方法。有Excel VBA基础,学习Word VBA很快。

二、分析上面的代码

■知识点一:创建Word程序,新建Word程序对象

Excel程序与Word程序交互,首先要引用Word对象,可以前期绑定,也可以后期。除了和正则、字典对象的前期绑定后期绑定的区别以外,excel操作word,后期绑定还有一点需要

特别注意:

一些属性的应该直接写他的值,而不是写成Word VBA中可以直接用的常量。比如,让段落格式居中,下面这句在Word VBA中运行没问题,但是移植到Excel就出问题了。提示:“无效的过程调用或参数”。

ParagraphFormat.Alignment=wdAlignParagraphCenter

像这种,我们需要把这些常量换成Word程序内部定义的数值。

ParagraphFormat.Alignment = 1  

而这种常量的值,直接在Word VBA,msgbox  wdAlignParagraphCenter即可。


·后期绑定:(我用的)

    Set doc = CreateObject("word.application"'创建Word对象
    Set wd = doc.documents.Add

·前期绑定:前期绑定需要根据电脑中的Word版本勾选:Microsoft Excel XX.0 Object Library

前期绑定示意

前期绑定,调用Word程序的代码写法:

Dim doc As Word.Application
Dim wd As Document
Set doc = New Word.Application '将word程序对象赋给变量doc
Set wd = doc.Documents.Add '新建

知识点二:Word程序的对象

Excel VBA有基础以后,Word VBA可以类比来学习,主要是搞清楚对象、属性、方法。然后看帮助文件、具体例子不清楚再百度即可。

Word2010  VBA 离线帮助文件,后台回复“word”获取。

Excel有:

Excel.Application                        ’Excel程序对象

Excel.Application. Workbooks             ’工作簿

Excel.Application. Workbooks.Sheets(1)      ’工作表

工作表下是Range,区域;Cells(row,col),'单元格

Word有:

Word.Application                         ’Word程序对象

Word.Application.Documents           ’文档

文档下有节、段落、句子、单词、字符对象。具体特征见下面表格

前三个返回Range对象,能直接使用任何区域属性或方法修改该Range 对象。Paragraphs、Sections、Tables返回该集合的单个成员,而不是 Range 对象,不能直接使用区域属性或方法。如:Words(1)后面直接.Copy,而段落要写成Paragraphs(1).Range.Copy。之间多了一个Range。

知识点三:向Word中分段写入数据

 With doc.Selection 'doc是前面声明的Word程序对象
      .TypeText strr 'strr是需要写入的储存数据变量
      .TypeParagraph  '插入一个新的空段落
 End With


·TypeText方法:是在当前光标所在的位置入插要添加的文本内容。

·TypeParagraph方法:是在当前光标所在的位置插入一个新的空白的段落,相当于ENTER 键。

要在空白的word文档中逐段落的添加文本内容,可以先用TypeText方法插入文本,然后再用TypeParagraph方法插入下一个段落,如此循环即可。

(这里只讲本段代码用到的,具体更详细的用法,可看帮助文件。这里不再累赘) 

三、Word数据导入Excel

Word数据导入Excel就是一个反过程,创建Word对象、对Word文档的具体内容进行循环提取即可。

下面说个反向的例子,从Word取题目数据到Excel。这里我们只取题目,答案不取。

通过分析发现,用正则表达式再好不过。

Sub test()
    Set doc = CreateObject("word.application"'创建Word对象
    doc.Documents.Open ThisWorkbook.Path & "\计算题.docx"
    With doc
        c = .Documents(1).Range '这里直接引用Word程序打开的第一个文档的所有内容
        Set regx = CreateObject("vbscript.regexp"'引用正则表达式对象
        With regx
            .Global = True
            .Pattern = "\d+、\S+。" '题目部分的正则表达式
            Set Mat = .Execute(c)
            For Each m In Mat '循环所有符合条件的匹配值
                n = n + 1
                Cells(n, 1) = m.Value '提取所有符合条件的段落到excel中
            Next
        End With
    End With
    doc.Quit '退出word程序
End Sub
四、个人总结

还是前面说的,有了VBA基础,学习Word VBA很快,着重熟悉Word VBA的属性对象和方法。代码不会的可在Word中录制宏解决,再移植到Excel中。这样就可以以Excel为遥控器,操控Word进行各种数据交互。

下篇文章说下Word 中的表格Table对象,来总结下如何操控Word的表格数据。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多