VBA将Excel表格复制并粘贴到Word文档中

我正在编写的代码是使用工作表的使用范围(不包括前两行),并将该表(一个或多个表)复制到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 

我用你的代码看到的问题是:

  1. Set fromWB = ActiveWorkbook是多余的,可以删除
  2. 您引用Range没有工作表前缀,所以它将始终默认为当前活动工作表(这是打开工作簿时将显示一个工作表)。 通常我会说这样做: ws.Range("A2")但在这种情况下,我build议ws.Activate作为您的For Each循环内的第一个语句,因为您正在使用物理操作,如复制/粘贴。
  3. 要成为一名优秀的资源公民,你应该退出Excel并且从fromWB = Nothing开始释放内存。 事实上,在VBA中,在离开方法之前,应该将所有分配的对象variables设置为Nothing