专栏名称: 完美Excel
Excel与VBA技术学习与实践
目录
相关文章推荐
完美Excel  ·  VBA正则表达式 ·  4 天前  
Excel之家ExcelHome  ·  FILTER函数,数据筛选南波万 ·  4 天前  
完美Excel  ·  使用VBA创建单元格颜色改变事件 ·  5 天前  
Excel之家ExcelHome  ·  化繁为简的动态数组公式 ·  1 周前  
Excel之家ExcelHome  ·  给Excel中的数字开美颜 ·  1 周前  
51好读  ›  专栏  ›  完美Excel

将Excel中的数据表、图表、图片等导入到Word中

完美Excel  · 公众号  · Excel  · 2024-09-25 05:39

正文

学习Excel技术,关注微信公众号:
excelperfect

标签:VBAOffice整合应用

下面的代码使用书签将Excel工作表数据复制到Word文档中,Word文档必须打开并处于活动状态,即当前可见的Word文档。你可以反复操作,不用担心会取消掉Word中的书签,只需在Excel中为文本、单元格区域和图表命名,并在Word书签中创建相匹配的名称。

要复制一个表,先为其指定一个以tbl开头的单元格区域名称,然后在Word文档中希望表所放置的位置插入一个相同名称的书签,并在名称前加上tag_,例如,如果Excel中表的名称是tblmytable,则Word中的书签名为tag_tblmytable

图表也类似,给图表起一个以“cht”开头的名字(确保选择了完整的图表,而不仅仅是其中的一部分,在给图表起名字时,最安全的方法是先按住Ctrl键然后点击图表)。在Word中应包含一个与这个名字同名的书签,也是要加上前缀tag_

注意,采用这种方法意味着同一图表/表格不能插入多次,因为Word不允许重复的书签名称。

代码清单:

Dim WdApp As Object 'Word.ApplicationDim doc As Object 'Word.DocumentDim t
'主程序Public Sub MergeToWord() Application.Calculation = xlCalculationManual Application.ScreenUpdating = False '打开Word Set WdApp = Nothing Set doc = Nothing On Error Resume Next Set WdApp = GetObject(, "Word.Application") If Err <> 0 Then MsgBox "检查你的Word文档是否已打开" Exit Sub End If '获取当前文档 Set doc = WdApp.ActiveDocument If Err <> 0 Then   MsgBox "错误地连接当前Word文档: " & Err.Message Exit Sub End If On Error GoTo 0 '查找Word中所有相关书签并进行处理 ReDim B(WdApp.ActiveDocument.bookmarks.Count) As Object Dim i As Long '在数组中存储标签, 然后逐个处理 '当发生粘贴时Word会销毁书签 '下面的代码重新创建书签 For i = 1 To WdApp.ActiveDocument.bookmarks.Count  Set B(i) = WdApp.ActiveDocument.bookmarks(i) Next i
For i = 1 To UBound(B)   If InStr(1, B(i).Name, "tag_", vbTextCompare) = 1 Then PasteToWord B(i) End If Next i '激活Word以方便用户检查结果 WdApp.Activate Set WdApp = Nothing Application.StatusBar = False t = Timer - tEnd Sub
'处理Word书签Private Sub PasteToWord(B As Object, Optional Method As String = "Metafile") 'tag As String On Error Resume Next Dim strTag As String Dim tag As String tag = B.Name strTag = Mid$(B.Name, 5) If Err <> 0 Then Exit Sub On Error GoTo 0 '选择书签区域 B.Range.Select '标记书签开始 Dim rngMark As Object Set rngMark = WdApp.Selection.Range 'b.Range.Text = vbNullString 'b.Range.Delete '基于书签名选择是否粘贴表或图表 If InStr(tag, "tag_tbl") > 0 Then rngMark.Collapse 1 PasteTableToWord B ElseIf InStr(tag, "tag_cht") > 0 Then 'b.Range.Text = vbNullString 'rngMark.Collapse 1 B.Range.Delete 'b.Range.Select CopyChartToWord B, rngMark, Method rngMark.End = WdApp.Selection.End   WdApp.ActiveDocument.bookmarks.Add tag, rngMark ElseIf InStr(tag, "tag_txt") > 0 Then rngMark.Collapse 1 PasteTextToWord B ElseIf InStr(tag, "tag_pic") > 0 Then rngMark.Collapse 1 PastePicToWord B Else Exit Sub End If If InStr(tag, "tag_cht") = 0 Then '标记粘贴的末尾 rngMark.End = WdApp.Selection.End '再添加书签   WdApp.ActiveDocument.bookmarks.Add tag, rngMark End IfCleanup: Application.CutCopyMode = False Application.StatusBar = FalseEnd Sub
'粘贴文本Private Sub PasteTextToWord(B As Object) Dim strTag As String On Error Resume Next strTag = Mid$(B.Name, 5) If Err <> 0 Then Exit Sub On Error GoTo 0 Dim txtTag As String Dim u As Long txtTag = strTag On Error Resume Next Range(txtTag).Copy If Err = 0 Then  If InStr(1, txtTag, "txt", vbTextCompare) > 0 Then With WdApp.Selection .Select .ClearContents .PasteAndFormat (22) End With Else With WdApp.Selection .Select .ClearContents       WdApp.Selection.PasteAndFormat(22) End With End If Else  WdApp.ActiveDocument.Selection = "***没有发现 ***" End If On Error GoTo 0End Sub
Private Sub PastePicToWord(B As Object) Dim strTag As String On Error Resume Next strTag = Mid$(B.Name, 5) If Err <> 0 Then Exit Sub On Error GoTo 0 Dim txtTag As String Dim u As Long txtTag = strTag Dim w As Worksheet, pic As Picture For Each w In ActiveWorkbook.Sheets Set pic = w.Pictures(strTag) If Not pic Is Nothing Then Exit For Next w If pic Is Nothing Then Exit Sub On Error Resume Next pic.Copy If Err = 0 Then   WdApp.Selection.Paste 'SpecialLink:=False, DataType:=8, Placement:=0 End If On Error GoTo 0End Sub
'Private Sub PasteTableToWord(B As Object) Dim strTag As String On Error Resume Next strTag = Mid$(B.Name, 5) If Err <> 0 Then Exit Sub On Error GoTo 0 Dim tblTag As String Dim u As Long tblTag = strTag On Error Resume Next Range(tblTag).Copy If Err = 0 Then   If InStr(1, tblTag, "tbl", vbTextCompare) > 0 Then With WdApp.Selection .Tables(1).Select .Tables(1).Delete       .PasteSpecial DataType:=1, Placement:=0 '.PasteAndFormat (0) '默认粘贴 End With Else With WdApp.Selection .Tables(1).Select .Tables(1).Delete        WdApp.Selection.PasteAndFormat(22) End With End If Else     WdApp.ActiveDocument.Selection = "*** 没有发现 ***" End If On Error GoTo 0End Sub
'粘贴图表Private Sub CopyChartToWord(B As Object, rngMark, Optional Method As String = "Metafile") On Error Resume Next Dim strTag As String strTag = Mid$(B.Name, 5) If Err <> 0 Then Exit Sub On Error GoTo 0
Dim w As Worksheet, cht As ChartObject For Each w In ActiveWorkbook.Sheets Set cht = w.ChartObjects(strTag) If Not cht Is Nothing Then Exit For Next w If cht Is Nothing Then Exit Sub On Error Resume Next cht.Copy If Err = 0 Then Select Case Method   Case "Metafile"      rngMark.PasteSpecial DataType:=3, Placement:=0 Case "Enhanced metafile"     WdApp.Selection.PasteSpecial DataType:=9, Placement:=0 Case "Bitmap"     WdApp.Selection.PasteSpecial DataType:=4, Placement:=0 Case "Drawing"     WdApp.Selection.PasteSpecial link:=False, DataType:=8, Placement:=0 Case "JPG" Dim fName As String     fName = ThisWorkbook.Path & "\tmp.jpg"     cht.Chart.Export fName, "JPG" WdApp.Selection.InlineShapes.AddPicture Filename:=fName, LinkToFile:=False, SaveWithDocument:=True Kill fName End Select Else   WdApp.ActiveDocument.Selection.Text = "*** 没有发现 ***" End If On Error GoTo 0End Sub

欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。欢迎到知识星球:完美Excel社群,进行技术交流和提问,获取更多电子资料,并通过社群加入专门的微信讨论群,更方便交流。

推荐文章
完美Excel  ·  VBA正则表达式
4 天前
Excel之家ExcelHome  ·  FILTER函数,数据筛选南波万
4 天前
完美Excel  ·  使用VBA创建单元格颜色改变事件
5 天前
Excel之家ExcelHome  ·  化繁为简的动态数组公式
1 周前
Excel之家ExcelHome  ·  给Excel中的数字开美颜
1 周前
闹闹每日星运  ·  测试:TA为什么不爱你?
7 年前
哲学园  ·  英伦花艺完整手册
7 年前