簡體   English   中英

VBA將Excel表復制並粘貼到Word文檔中

[英]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

我在您的代碼中看到的問題是:-

  1. Set fromWB = ActiveWorkbook是多余的,可以刪除
  2. 您引用的Range沒有工作表前綴,因此它將始終默認為當前活動的工作表(這是打開工作簿時可見的工作表)。 通常,我會說要這樣做: ws.Range("A2")但是在這種情況下,我建議將ws.Activate作為For Each循環中的第一條語句,因為您正在使用諸如復制/粘貼之類的物理操作。
  3. 要成為一個好的資源公民,您應該退出Excel並設置fromWB = Nothing來釋放內存。 實際上,在VBA中,應該在離開方法之前將所有分配的對象變量設置為Nothing

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM