|
blackfire 发表于 2014-3-21 17:11
兄弟,我试了真不错,还有点细节想请教。给我留个Q吧,我的邮箱是zhang7836@126.com - Sub test()
- Dim filename, arr, wdapp, cel, i%, n%
- '提示用户选择要填充数据的word文档,文档名赋予变量filename;如果用户取消选择,那么就直接退出程序.
- filename = Application.GetOpenFilename _
- (FileFilter:="word Files (*.doc),*.doc," _
- & "Word Files (*.docx),*docx", _
- Title:="请选择需要填充数据的word文件")
- If filename = False Then Exit Sub
-
- '把工作表中的数据赋予数组arr,放进数组下面循环取值更快.
- arr = Sheets(1).[a1].CurrentRegion
-
- '定义绑定一个word应用实例,要在excel中打开word文档必须这样,是标准语句.
- Set wdapp = CreateObject("word.application")
- wdapp.Visible = True
-
- '打开上面选择的word文档
- With wdapp.Documents.Open(filename)
-
- '以下语句是确定word表格已有数据的行数
-
- '选择文档中的第一个表格(tables(1))的第一列(columns(1)),所以如果你的文档中要填充数据的表格不是第一个,就要修改
- .Tables(1).Columns(1).Select
- '从上至下遍历第一列中的单元格,直到找到空单元格,最后得到的n值,就是表格中已经有数据的行数.
- For Each cel In .Parent.Selection.Cells
- n = n + 1
- If cel.Range.Text = Chr(13) & Chr(7) Then 'word工作表中空单元格里的字符是chr(13)与chr(7)
- n = n - 1
- Exit For
- End If
- Next
-
- '比较excel表格的数据行与word表格的数据行,如果excel的数据行少于或等于word表格的数据行,表明没有新的数据,代码执行直接转到over以下的语句.
- If UBound(arr) <= n Then GoTo over
-
- '以下语句是把excel表格第n行以下的数据传送到word表格的n行以下区域.
-
- '首先在word表格的第n行以下增加unound(arr)-n行空行.这个行范围就是需要传送的数据行
- .Tables(1).Rows(n).Select
- .Parent.Selection.InsertRowsBelow UBound(arr) - n
- '从excel的n+1后开始循环,分别把序号/n+1行第一列单元格/第6列单元格的值赋予word相应行列
- For i = n + 1 To UBound(arr)
- .Tables(1).Cell(i, 1).Range = i - 1
- .Tables(1).Cell(i, 2).Range = arr(i, 1)
- .Tables(1).Cell(i, 3).Range = Format$(arr(i, 6), "percent")
- Next
-
- '保存并关闭已经填充完毕的word文档
- over:
- .Save
- .Close wdSaveChanges
- wdapp.Quit
- End With
- End Sub
复制代码 |
|