接着上篇文章来写,上篇说了Word程序的几个常见对象,表格要单独拿出来说,因为Word的表格和Excel的表格有类似之处,有很多要说的地方。
Excel数据和Word数据交互,很多时候就是和Word内部的表格内容进行交互读取:
一、了解Word VBA表格的表示方法
■知识点一:创建表格
在Word中插入2行3列的表格,录制宏得到下面的代码:
Sub 宏1() ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=2, NumColumns:= _ 3, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _ wdAutoFitFixed With Selection.Tables(1) If .Style <> "网格型" Then .Style = "网格型" End If .ApplyStyleHeadingRows = True .ApplyStyleLastRow = False .ApplyStyleFirstColumn = True .ApplyStyleLastColumn = False .ApplyStyleRowBands = True .ApplyStyleColumnBands = False End WithEnd Sub
简化后这就是插入表格得核心代码:
Sub 宏1() ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=2, NumColumns:=3 Selection.Tables(1).Style = "网格型" '如果不表格样式,看不到边框。End Sub
■知识点二:表格中单元格表示方法
Word和Excel中表示表格的方法类似,cell和cells两种方式。看下面例子就很容易明白了。
•Cell 对象
代表单个表格单元格。Cell 对象是 Cells 集合中的元素。Cells 集合代表指定对象中所有的单元格。
用 Cell(row, column) 或 Cells(index)可返回 Cell 对象,其中 row 为行号,column 为列号,index为索引序号。
上面的动画是演示的Word表格动态写入内容,以下两段代码均可以实现。
Sub 第一种写入方法() Dim t As Table Set t = ActiveDocument.Tables(1) t.Cell(1, 1).Range = 1 t.Cell(1, 2).Range = 2 t.Cell(1, 3).Range = 3 t.Cell(2, 1).Range = 4 t.Cell(2, 2).Range = 5 t.Cell(2, 3).Range = 6End SubSub 第二种写入方法() Set t = ActiveDocument.Tables(1).Range For i = 1 To t.Cells.Count t.Cells(i).Range = i NextEnd Sub
也可以看得出来Word种表格的表示方法:一种是根据行、列坐标;一种是按照单元格的前后顺序。
从第二种方法,我们可以清晰的看出来,Word中表格默认的前后顺序。
■知识点三:合并单元格表示方法
利用第二种单元格的表示方法,按照顺序写入单元格数据,可以看到,合并单元格也是按照前后顺序表示的。
Word VBA中遍历文档中所有表格,统计表格个数。
Sub 遍历表格() Dim i As Integer Debug.Print "共" & ThisDocument.Tables.Count; "个表格" For i = 1 To ThisDocument.Tables.Count Tables(i).Range.Select Debug.Print "第" & i & "表格" Debug.Print Tables(i).Range.Rows.Count & "行" Debug.Print Tables(i).Range.Columns.Count & "列" Debug.Print Tables(i).Range.Cells.Count & "个单元格" Debug.Print Next End Sub
二、提取Word表格到Excel
这两天刚帮人写的一小段代码,这老哥有几万个这样的文档,每个文档有五六个表格,需要从中提取数据到excel中。
如图中的表格,需要提取红色内框中的数值,可以用方法一和方法二分别获取得到。我用的方法二读取的单元格数据。直接放总的代码,其中涉及循环打开Word文档的代码,比较综合。
Word表格样式
Excel表格样式
Sub test() Dim arr() k = 1 Set doc = CreateObject("word.application") '创建Word对象 With Application.FileDialog(msoFileDialogFilePicker) .AllowMultiSelect = True '多选择 .Filters.Clear '清除文件过滤器 .Filters.Add "Word 文件