使用书签将 excel 个单元格(例如 A1:C10)复制到 word 文档而不删除书签
Copying excel cells (ex. A1:C10) to word document using bookmarks without deleting the bookmarks
我曾尝试寻找解决方案,但收效甚微。我成功地更新了我的 Word 文档,但只有一次。我检查了 word 文档,书签已经消失,所以第二次不起作用,除非我在 Word 文档中再次添加书签。请找到下面的代码,让我知道可以做些什么来达到要求。谢谢!!
Sub Rectangle2_Click()
Dim tbl As Excel.Range
Dim WordApp As Word.Application
Dim myDoc As Word.Document
Dim WordTable As Word.Table
'Optimize Code
Application.ScreenUpdating = False
Application.EnableEvents = False
'Copy Range from Excel
Set tbl = ThisWorkbook.Worksheets("Sheet1").Range("C6:M10")
'Create an Instance of MS Word
On Error Resume Next
'Is MS Word already opened?
Set WordApp = GetObject(class:="Word.Application")
'Clear the error between errors
Err.Clear
'If MS Word is not already open then open MS Word
If WordApp Is Nothing Then Set WordApp = CreateObject(class:="Word.Application")
'Handle if the Word Application is not found
If Err.Number = 429 Then
MsgBox "Microsoft Word could not be found, aborting."
GoTo EndRoutine
End If
On Error GoTo 0
'Make MS Word Visible and Active
WordApp.Visible = True
WordApp.Activate
'Open the Report
Set myDoc = WordApp.Documents.Open("C:\Users\Test.docx")
'Copy Excel Table Range
tbl.Copy
'Delete old Table in MS Word & Paste New Table into MS Word
Dim bkm As Bookmark
For Each bkm In ActiveDocument.Bookmarks
If bkm.Name = bkmname Then
If bkm.Range.Information(wdWithInTable) = True Then
bkm.Range.Expand (wdCell)
bkm.Range.Cells.Delete
End If
End If
Next bkm
myDoc.Bookmarks(1).Range.PasteExcelTable _
LinkedToExcel:=False, _
WordFormatting:=False, _
RTF:=False
'Autofit Table so it fits inside Word Document
Set WordTable = myDoc.Tables(1)
WordTable.AutoFitBehavior (wdAutoFitWindow)
EndRoutine:
'Optimize Code
Application.ScreenUpdating = True
Application.EnableEvents = True
'Clear The Clipboard
Application.CutCopyMode = False
'Closing the MS Word
ActiveDocument.Close SaveChanges:=wdSaveChanges
End Sub
注意:我纯粹是第一次使用 VBA,但是我从不同的来源拼凑了这个,希望能记住正确的逻辑
有一种方法可以重新使用书签,但如果我正确理解你在做什么,你最好创建一个模板文件 (.dotx) 并生成一个 new 每次迭代都从中记录。
你的代码应该是
Set myDoc = Documents.Add("template path")
然后您使用 Document.SaveAs
方法保存每个文档。
书签将保持不变,因为您的代码始终使用从模板创建的新文档。
附加说明:由于您要声明一个对象 (myDoc),所以请使用它而不是 ActiveDocument!这将使您的代码更加健壮,因为用户或其他代码 可以 更改当前在 Word UI 中处于活动状态的文档。所以,例如:
For Each bkm In myDoc.Bookmarks
如果需要保留书签,方法是先保存书签Range,将内容赋给书签(即删除),然后在Range周围恢复书签。类似于:
Dim rngBkm as Word.Range
For Each bkm In myDoc.Bookmarks
If bkm.Name = bkmname Then
Set rngBkm = bkm.Range
rngBkm.Text = "new content"
myDoc.Bookmarks.Add(rngBkm, bkmname)
End If
Next
我曾尝试寻找解决方案,但收效甚微。我成功地更新了我的 Word 文档,但只有一次。我检查了 word 文档,书签已经消失,所以第二次不起作用,除非我在 Word 文档中再次添加书签。请找到下面的代码,让我知道可以做些什么来达到要求。谢谢!!
Sub Rectangle2_Click()
Dim tbl As Excel.Range
Dim WordApp As Word.Application
Dim myDoc As Word.Document
Dim WordTable As Word.Table
'Optimize Code
Application.ScreenUpdating = False
Application.EnableEvents = False
'Copy Range from Excel
Set tbl = ThisWorkbook.Worksheets("Sheet1").Range("C6:M10")
'Create an Instance of MS Word
On Error Resume Next
'Is MS Word already opened?
Set WordApp = GetObject(class:="Word.Application")
'Clear the error between errors
Err.Clear
'If MS Word is not already open then open MS Word
If WordApp Is Nothing Then Set WordApp = CreateObject(class:="Word.Application")
'Handle if the Word Application is not found
If Err.Number = 429 Then
MsgBox "Microsoft Word could not be found, aborting."
GoTo EndRoutine
End If
On Error GoTo 0
'Make MS Word Visible and Active
WordApp.Visible = True
WordApp.Activate
'Open the Report
Set myDoc = WordApp.Documents.Open("C:\Users\Test.docx")
'Copy Excel Table Range
tbl.Copy
'Delete old Table in MS Word & Paste New Table into MS Word
Dim bkm As Bookmark
For Each bkm In ActiveDocument.Bookmarks
If bkm.Name = bkmname Then
If bkm.Range.Information(wdWithInTable) = True Then
bkm.Range.Expand (wdCell)
bkm.Range.Cells.Delete
End If
End If
Next bkm
myDoc.Bookmarks(1).Range.PasteExcelTable _
LinkedToExcel:=False, _
WordFormatting:=False, _
RTF:=False
'Autofit Table so it fits inside Word Document
Set WordTable = myDoc.Tables(1)
WordTable.AutoFitBehavior (wdAutoFitWindow)
EndRoutine:
'Optimize Code
Application.ScreenUpdating = True
Application.EnableEvents = True
'Clear The Clipboard
Application.CutCopyMode = False
'Closing the MS Word
ActiveDocument.Close SaveChanges:=wdSaveChanges
End Sub
注意:我纯粹是第一次使用 VBA,但是我从不同的来源拼凑了这个,希望能记住正确的逻辑
有一种方法可以重新使用书签,但如果我正确理解你在做什么,你最好创建一个模板文件 (.dotx) 并生成一个 new 每次迭代都从中记录。
你的代码应该是
Set myDoc = Documents.Add("template path")
然后您使用 Document.SaveAs
方法保存每个文档。
书签将保持不变,因为您的代码始终使用从模板创建的新文档。
附加说明:由于您要声明一个对象 (myDoc),所以请使用它而不是 ActiveDocument!这将使您的代码更加健壮,因为用户或其他代码 可以 更改当前在 Word UI 中处于活动状态的文档。所以,例如:
For Each bkm In myDoc.Bookmarks
如果需要保留书签,方法是先保存书签Range,将内容赋给书签(即删除),然后在Range周围恢复书签。类似于:
Dim rngBkm as Word.Range
For Each bkm In myDoc.Bookmarks
If bkm.Name = bkmname Then
Set rngBkm = bkm.Range
rngBkm.Text = "new content"
myDoc.Bookmarks.Add(rngBkm, bkmname)
End If
Next