VBA Excel: создание нескольких вкладок и вывод в виде одного слова - PullRequest
1 голос
/ 16 октября 2019

У меня есть несколько вкладок Excel, которые я хотел бы вывести в текстовый документ. Мне удалось взять некоторый код (конечно, с помощью сообщества!) И вывести первую вкладку моего Excel в текстовый документ. Когда я пытаюсь взять вторую вкладку на листе 3, она просто заменяет первую страницу, которую я создал.

Я также попробовал другой способ экспорта каждого листа в виде отдельного текстового документа, а затем слияния их, но также возникла та же проблема, когда слово просто заменяло первую страницу снова и снова.

В основном мой код выполняет следующие действия:

  1. Создает файл слов с определенными контурами полей.
  2. Устанавливает таблицу как используемый диапазон в листе Excel. копирует это
  3. Вставляет в слово.

Пытается снова перейти к следующему листу. Встречается с проблемами.

(Set tbl = ThisWorkbook.Worksheets (Sheet3.Name) .UsedRange)

Dim tbl As Excel.Range
Dim WordApp As Word.Application

Dim WordTable As Word.Table

Dim MainDoc As Word.Document
Dim mydoct1 As Word.Document

Dim sFolderPath As String

Sub Export_to_Word()

    Application.ScreenUpdating = False
    Application.EnableEvents = False
    '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
        
    'Create a New Document
    Set mydoc1 = WordApp.Documents.Add
    With mydoc1.PageSetup
        .TopMargin = Application.CentimetersToPoints(1)
        .BottomMargin = Application.CentimetersToPoints(1)
        .LeftMargin = Application.CentimetersToPoints(1)
        .RightMargin = Application.CentimetersToPoints(1)
    End With
    
    Set tbl = ThisWorkbook.Worksheets(Sheet2.Name).UsedRange
    tbl.Copy
        
    'Paste Table into MS Word
    mydoc1.Paragraphs(1).Range.PasteExcelTable False, False, False
    
    'Autofit Table so it fits inside Word Document
    Set WordTable = mydoc1.Tables(1)
    WordTable.AutoFitBehavior (wdAutoFitWindow)
    
    
    mydoc1.Range.InsertAfter Chr(13) & "Hello"
    
    my.Collapse Direction:=wdCollapseEnd
    mydoc1.Range.InsertBreak
    
    Set tbl = ThisWorkbook.Worksheets(Sheet3.Name).UsedRange
    tbl.Copy
    
    mydoc1.Range.PasteExcelTable False, False, False
    
EndRoutine:
    
    'Clear The Clipboard
    Application.CutCopyMode = False
    
    mydoc1.SaveAs Filename:=Application.ActiveWorkbook.Path & "\Application_Temp\" & "Sheet1"
    mydoc1.Close
    
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    
End Sub

1 Ответ

0 голосов
/ 17 октября 2019

Хитрость для добавления вещей в существующий контент в Word заключается в использовании Range объектов. Представьте себе диапазоны, подобные невидимым выборкам , с основным отличием в том, что может быть только один выбор, но код может использовать столько диапазонов, сколько необходимо для манипулирования контентом.

К вашему комментарию: Selectionв Word очень похоже на ActiveCell в Excel;Специалисты по кодированию в Excel всегда скажут: избегайте использования «Active» - ничего, работайте с конкретными объектами, например, Ranges вместо ActiveCell. То же самое верно для Word :-) Вы никогда не можете быть уверены, какая ячейка активна или где выбор;Range("A3") говорит вам точно, что имеется в виду, Document.Paragraphs(2) то же самое.

В этом духе я изменил фрагмент кода в вопросе, объявив (Dim) и создавая экземпляр (* 1014). *) объект Range ко всему основному тексту документа. Затем диапазон «сворачивается» (воспринимается как нажатие стрелки вправо на выделенном фрагменте) до конечной точки, так что добавление нового содержимого не заменяет предыдущего содержимого (та же проблема, что и при наборе текста над выделением).

Dim rngTarget as Object     'Word.Range for early-binding or within Word
Set rngTarget = mydoc1.Paragraphs(1).Range

'Paste Table into MS Word
rngTarget.PasteExcelTable False, False, False

'Autofit Table so it fits inside Word Document
Set WordTable = mydoc1.Tables(1)
WordTable.AutoFitBehavior (wdAutoFitWindow)

rngTarget.InsertAfter Chr(13) & "Hello"    
rngTarget.Collapse Direction:=wdCollapseEnd

rngTarget.InsertBreak 7  'Word.WdBreakType.wdPageBreak (default type)
rngTarget.Collapse Direction:=wdCollapseEnd

Set tbl = ThisWorkbook.Worksheets(Sheet3.Name).UsedRange
tbl.Copy

rngTarget.PasteExcelTable False, False, False

Я также внес некоторые коррективы в очистку. При работе с внешним приложением важно правильно освобождать его объявленные и созданные экземпляры объектов. Это должно быть сделано в обратном порядке , в котором они были созданы. Если они не были правильно освобождены, они могут удержать их в памяти, что приведет к ошибкам при следующем запуске кода.

EndRoutine:

  'Clear The Clipboard
  Application.CutCopyMode = False

  mydoc1.SaveAs Filename:=Application.ActiveWorkbook.Path & "\Application_Temp\" & "Sheet1"
  mydoc1.Close
  Set rngTarget = Nothing
  Set WordTable = NOthing
  Set tbl = Nothing
  Set mdyDoc1 = Nothing

  'Possibly you also want
  'WordApp.Quit
  'This you definitely need
  Set WordApp = Nothing

  Application.ScreenUpdating = True
  Application.EnableEvents = True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...