![](/img/trans.png)
[英]Is there a way to use excel vba to open a word document, copy a word table, and paste it to another word document
[英]VBA Copy and Paste Excel Table into Word Document
我正在编写的代码将使用工作表的使用范围(不包括前两行),并将该表(或多个表)复制到Word文档中自己的页面上。 在我不得不对其进行一些更改之前,代码工作正常。现在的问题是,它遍历了工作簿中的所有工作表,但仅重新粘贴了最后一个工作表的内容。 另外,我似乎无法让VBA将粘贴的表识别为表-因此,这并不能让我将它们放在Word文档中。 关于如何解决这些问题的任何想法? 提前致谢。
Sub toWord()
Dim ws As Worksheet
Dim fromWB As Variant
Dim wdApp As Object
Dim wdDoc As Object
Dim docName As Variant
Dim rng As Range
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.EnableEvents = False
Set wdApp = CreateObject("Word.Application")
wdApp.Visible = True
Set wdDoc = wdApp.Documents.Add
wdDoc.Activate
'Creates InputBox that allows user to enter name to save document as
docName = Application.InputBox(Prompt:="Enter Document Name", Title:="Save Word Document", Type:=2)
wdDoc.SaveAs2 fileName:=docName, FileFormat:=wdFormatDocument 'Saves document under user-provided name
fromWB = Application.GetOpenFilename(FileFilter:="Excel Workbook(*.xlsx),*.xlsx", Title:="Open Merged Data")
If fromWB <> False Then
Set fromWB = Workbooks.Open(fromWB)
Set fromWB = ActiveWorkbook
ElseIf fromWB = False Then
MsgBox "No File Selected"
GoTo ResetSettings
End If
For Each ws In fromWB.Worksheets
Range("A2").CurrentRegion.Offset(2).Resize(Range("A2").CurrentRegion.Rows.Count - 2).Select
Selection.Copy
Set wdApp = GetObject(, "Word.Application")
wdApp.Visible = True
wdDoc.Activate
wdDoc.Range(wdDoc.Characters.Count - 1).Paste
wdDoc.Range(wdDoc.Characters.Count - 1).InsertBreak Type:=7
ActiveDocument.Tables(1).Select
Selection.Tables(1).Rows.Alignment = wdAlignRowCenter
Next ws
wdDoc.Styles("Normal").NoSpaceBetweenParagraphsOfSameStyle = True
wdDoc.Save
Set wdDoc = Nothing
Set wdApp = Nothing
MsgBox "Imported into Word Document"
ResetSettings:
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.EnableEvents = True
End Sub
我在您的代码中看到的问题是:-
Set fromWB = ActiveWorkbook
是多余的,可以删除 Range
没有工作表前缀,因此它将始终默认为当前活动的工作表(这是打开工作簿时可见的工作表)。 通常,我会说要这样做: ws.Range("A2")
但是在这种情况下,我建议将ws.Activate
作为For Each
循环中的第一条语句,因为您正在使用诸如复制/粘贴之类的物理操作。 fromWB = Nothing
来释放内存。 实际上,在VBA中,应该在离开方法之前将所有分配的对象变量设置为Nothing
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.