Copy word table vba

Sorry in advance for my bad English and may be simple question.
I want to copy Table object into Dictionary for place it later in another Word document. All works are in Excel VBA.
I try it for copy table:

Dim dict As Dictionary
Dim table1 As Word.table
Set table1 = Word.Application.ActiveDocument.Tables.Item(tableNum)                                            
dict.Add "SampleText","MyText"
dict.Add "tab1", table1

After it I close this document and open another. In it, I try to insert data from Dictionary to Bookmarks:

dim prilDoc As Word.Document
...
prilDoc.Bookmarks.Item("SampleText").Range.Text=dict.Item("SampleText")    

this (insert text) work fine, but I don’t know, how to place Table object on Bookmark place, because I don’t know VBA Word Object Model. I tryed some approaches, but can’t find solution. I think there are two problems:

  1. When I put Table object into Dictionary, I in fact, copyed only reference to Table object in first Word document. And when I close this document and I try to get it from Dictionary object is deleted and I can’t work with it. In Java I can deep cloning object, but I don’t know how to do it in VBA. May be here must be use fully another approach.

  2. I don’t know, how correctly must I insert Table object in new Word document.

Thanks in advance.

The code below does copy the tables to a new document, but they end up as nested tables.  In the original document, there are 3 paragraphs between the two tables.  How can I unselect the first table after I post it in the new document, add a paragraph after the table, and then paste the second table?

Sub ExtractTablesFromOneDoc()
  Dim objTable As Table
  Dim objDoc As Document
  Dim objNewDoc As Document
  Dim objRange As Range
  Dim o As Paragraph
 
  Set objDoc = ActiveDocument
  Set objNewDoc = Documents.Add
 
  For Each objTable In objDoc.Tables
    objTable.Range.Select
    Debug.Print objTable.Title
    Selection.Copy
 
    '  Paste tables to new document in rich text format.
    Set objRange = objNewDoc.Range
    objRange.Collapse Direction:=wdCollapseEnd
    objRange.PasteSpecial DataType:=wdPasteRTF
    objRange.Collapse Direction:=wdCollapseEnd
  Next objTable
 
End Sub

Open in new window

Sub макрос()

        Dim docSrc As Document, docRes As Document, rngTable As Range
    Dim strFN As String

        ‘1. Отключение монитора. Может это уменьшит мерцание и может ускорит макрос.
    Application.ScreenUpdating = False

    ‘2. Юзер выбирает файл, в котором таблица.
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = False
        .Filters.Clear
        .Filters.Add «Документы Word», «*.docx»
        If .Show = 0 Then
            Exit Sub
        End If
        strFN = .SelectedItems(1)
    End With

        ‘3. Присваивание имени «docRes» активного файлу (в который надо вставить таблицу).
        ‘ После открытия другого файла, он станет неактивным.
    Set docRes = ActiveDocument

        ‘4. Открытие файла, в котором таблица. При этом присваиваем файлу имя «docSrc».
    Set docSrc = Documents.Open(FileName:=strFN)

        ‘5. Копирование таблицы из одного файла в другой.
    With docRes.Range.find
        ‘ Текст-метка, куда надо вставить таблицу.
        .Text = «~таблица~»
        ‘ Поиск текста-метки.
        .Execute
        ‘ Присваиваем имя «rngTable» фрагменту, в котором находится текст-метка.
            ‘ Parent — это найденный текст.
        Set rngTable = .Parent
    End With

        ‘6. Убираем цветовую заливку.
    rngTable.HighlightColorIndex = wdNoHighlight

        ‘7. Вставка таблицы. Копируется первая таблица из файла-источника.
    docSrc.Tables(1).Range.Copy
    rngTable.Paste

        ‘8. Очистка буфера обмена. Если таблица большая, то при закрытии ворда
        ‘ будет сообщение, что в буфере много данных.
        ‘ Просто копируем первый символ.
    docSrc.Range.Characters(1).Copy

        ‘9. Закрытие файла-источника.
    docSrc.Close SaveChanges:=False

        ’10. Включение монитора.
    Application.ScreenUpdating = True

    End Sub

[свернуть]

 

Dedmoroz86

Пользователь

Сообщений: 6
Регистрация: 04.10.2016

Друзья, помогите. Необходимо сделать следующее:
Смысл такой: в папке с текущим файлом Excel имеется файл Word(в формате «дизайн.rtf») его необходимо открыть и из него скопировать первые 4 таблицы. Затем вставить в ячейки Exсel и закрыть Word.
Всю голову сломал, никак не получается…. Помогите пожалуйста.  

Прикрепленные файлы

  • дизайн.rar (13.9 КБ)

 

Grr

Пользователь

Сообщений: 595
Регистрация: 17.09.2013

#2

05.10.2016 05:23:55

Одна табличка 3х3

Скрытый текст

Изменено: Grr05.10.2016 10:18:41

 

JeyCi

Пользователь

Сообщений: 3357
Регистрация: 27.11.2013

#3

05.10.2016 07:22:29

4 таблицы
файл должен лежать в одной папке с rtf-файлом

Код
Sub Copy_Word_Tables()
Dim arr As Variant
With Application: .ScreenUpdating = False: .EnableEvents = False: .DisplayAlerts = False: .Calculation = xlManual: End With

'открытие Word-файла
    Set oWord = CreateObject("Word.Application")
    oWord.Visible = True
    Set oDoc = oWord.Documents.Open(ThisWorkbook.Path & "" & "дизайн.rtf")
    
ThisWorkbook.Sheets(1).UsedRange.ClearContents
rr = 1

'On Error Resume Next
For aTbl = 1 To 4   'oDoc.tables.Count
ReDim arr(1 To oDoc.tables(aTbl).Rows.Count, 1 To oDoc.tables(aTbl).Columns.Count)
    For j = 1 To UBound(arr, 2)
        For i = 1 To UBound(arr, 1)
            arr(i, j) = Trim(Replace(oDoc.tables(aTbl).cell(i, j).Range.Text, Chr(7), ""))
        Next i
    Next j
ThisWorkbook.Sheets(1).Range("A" & rr).Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr
rr = rr + oDoc.tables(aTbl).Rows.Count + 2
arr = Empty
Next

oWord.Quit False
'..................
With Application: .ScreenUpdating = True: .EnableEvents = True: .DisplayAlerts = True: .Calculation = xlAutomatic: End With
MsgBox "Tables loaded"
End Sub

Прикрепленные файлы

  • Copy_Word_Tables.xlsm (19.52 КБ)

Изменено: JeyCi05.10.2016 07:34:45

чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах)

 

Grr

Пользователь

Сообщений: 595
Регистрация: 17.09.2013

JeyCi, никакого пространства для самодеятельности не оставили :)

 

JeyCi

Пользователь

Сообщений: 3357
Регистрация: 27.11.2013

#5

05.10.2016 07:34:29

Цитата
Grr написал: никакого пространства для самодеятельности

названия таблиц из word’а выковыривать не буду  :) — оставляю для самодеятельности  

чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах)

 

Dedmoroz86

Пользователь

Сообщений: 6
Регистрация: 04.10.2016

Огромное спасибо!!!! Помогло! =))))))  

 

Dedmoroz86

Пользователь

Сообщений: 6
Регистрация: 04.10.2016

Один вопрос остался, все цифры не поддаются математическим расчетам, в связи с тем что в конце каждой имеется пробел. Может существует макрос чтобы его убрать? Количество строк динамическое(т.е может быть меньше может быть больше).  

 

Grr

Пользователь

Сообщений: 595
Регистрация: 17.09.2013

Стандартный функционал — «Найти/Заменить»?

 

JeyCi

Пользователь

Сообщений: 3357
Регистрация: 27.11.2013

#9

05.10.2016 12:34:13

после 18-й строки (перед Next i) — можете вставить проверку

Код
If IsNumeric(arr(i, j)) Then arr(i, j) = --arr(i, j)

чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах)

 

Alex_24

Пользователь

Сообщений: 9
Регистрация: 22.01.2018

#10

03.03.2018 16:30:49

Все похоже сделал правильно, а Excel ругается 5941 ошибкой. Что не так подскажите?

Код
Sub Copy_Word_Tables()
Dim arr As Variant
Dim fileToOpen
With Application: .ScreenUpdating = False: .EnableEvents = False: .DisplayAlerts = False: Calculation = xManual: End With
Set oWord = CreateObject("Word.Application")
oWord.Visible = True
fileToOpen = Application.GetOpenFilename("Only these Files (*.txt;*.doc*;*.xls*), *.txt; *.doc*; *.xls*")
Set oDoc = oWord.Documents.Open(fileToOpen)
ThisWorkbook.Sheets("Вводный").UsedRange.ClearContents
rr = 1
ReDim arr(1 To oDoc.tables(1).Rows.Count, 1 To oDoc.tables(1).Columns.Count)
For j = 1 To UBound(arr, 2)
    For i = 1 To UBound(arr, 1)
    arr(i, j) = Trim(Replace(oDoc.tables(1).cell(i, j).Range.Text, Chr(7), ""))
    Next i
Next j
ThisWorkbook.Sheets("Вводный").Range("A" & rr).Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr
rr = rr + oDoc.tables(1).RowCount + 2
oWord.Ouit False
With Application: .ScreenUpdating = True: .EnableEvents = True: .DisplayAlerts = True: Calculation = xManual: End With
End Sub
 

Юрий М

Модератор

Сообщений: 60569
Регистрация: 14.09.2012

Контакты см. в профиле

Alex_24, Вы видели, как форумчане оформляют свой код? Вот и Вы оформляйте аналогично: для этого есть специальная кнопка <…>

 

Alex_24, Вы код вручную набивали, что ли? Бросилось в глаза:
— 4 строка .Calculation = xlManual
— 3 c конца строка oWord.Quit False

Есть еще ошибки, но до устранения замечания не скажу где.

Изменено: Казанский03.03.2018 21:39:38

 

nuroraf

Пользователь

Сообщений: 1
Регистрация: 03.05.2019

JeyCi,

Как при копировании сохранить знаки переноса строки? Код рабочий, но перенос строки не сохраняет.
Скажем в одной ячейке таблицы ворд находится следующее:

  • ·           One

  • ·         Two

  • ·         Three

  • ·         Four

Можно ли скопировать такое точь в точь в ячейку на экзеле?

 

sokol92

Пользователь

Сообщений: 4445
Регистрация: 10.09.2017

#14

03.05.2019 21:09:47

Добавьте после строки 18 в #3:

Код
            While Right(arr(i, j), 1) = Chr(10) Or Right(arr(i, j), 1) = Chr(13)
              arr(i, j) = Left(arr(i, j), Len(arr(i, j)) - 1)
            Wend
            arr(i, j) = Replace(arr(i, j), Chr(13), Chr(10))

Владимир

 

Игорь

Пользователь

Сообщений: 2
Регистрация: 28.03.2023

[CODE][/CODE]

Изменено: Игорь29.03.2023 15:27:31

 

Игорь

Пользователь

Сообщений: 2
Регистрация: 28.03.2023

#16

29.03.2023 13:14:58

Код
"спасибо" за помощь. Модераторы удалите мои сообщения.

Изменено: Игорь29.03.2023 15:31:11

  • Remove From My Forums
  • Question

  • Good afternoon and please excuse the interruption.

    I am looking to do the following:

    I have a 2000+ page Word document that contains a table. The table has 5 Columns (lets say they are named Column1-5 accordingly)

    The goal is to export data from the word table and import it into an excel spreadsheet. Here is the twist though. I want the macro to look for a word in Column5, if the word Patent is in there, export that row into excel, if not, dont export it. It needs to
    scan the entire table and pull out the rows where the content in Column5 has the word Patent (it can be anywhere in that cell)

    I came across a VBA code that when placed in Excel and run, will take the table created in word and export it all into excel, which is cool but I feel thats only 80% of what I need it to do.

    Sub ImportWordTable()
    Dim wdDoc As Object
    Dim wdFileName As Variant
    Dim TableNo As Integer 'table number in Word
    Dim iRow As Long 'row index in Excel
    Dim iCol As Integer 'column index in Excel
    
    wdFileName = Application.GetOpenFilename("Word files (*.doc),*.doc", , _
    "Browse for file containing table to be imported")
    
    If wdFileName = False Then Exit Sub '(user cancelled import file browser)
    
    Set wdDoc = GetObject(wdFileName) 'open Word file
    
    With wdDoc
    TableNo = wdDoc.tables.Count
    If TableNo = 0 Then
    MsgBox "This document contains no tables", _
    vbExclamation, "Import Word Table"
    ElseIf TableNo > 1 Then
    TableNo = InputBox("This Word document contains " & TableNo & " tables." & vbCrLf & _
    "Enter table number of table to import", "Import Word Table", "1")
    End If
    With .tables(TableNo)
    'copy cell contents from Word table cells to Excel cells
    For iRow = 1 To .Rows.Count
    For iCol = 1 To .Columns.Count
    Cells(iRow, iCol) = WorksheetFunction.Clean(.cell(iRow, iCol).Range.Text)
    Next iCol
    Next iRow
    End With
    End With
    
    Set wdDoc = Nothing
    
    End Sub

    I need it to also prompt for any doc or docx file.

    Can anyone assist?

Answers

  • Hi Storo1975,

    Actually you’re very close to the answer, just a small change of the code would meet your requirement.

    Firstly let’s say that your word document is as below:

    Modify your code like this:

    Sub ImportWordTable()
        Dim wdDoc As Object
        Dim wdFileName As Variant
        Dim TableNo As Integer 'table number in Word
        Dim iRow As Long 'row index in Excel
        Dim iCol As Integer 'column index in Excel
    
        wdFileName = Application.GetOpenFilename("Word files,*.doc;*.docx", , _
        "Browse for file containing table to be imported")
        
        If wdFileName = False Then Exit Sub '(user cancelled import file browser)
        
        Set wdDoc = GetObject(wdFileName) 'open Word file
        
        With wdDoc
            TableNo = wdDoc.tables.Count
            If TableNo = 0 Then
                MsgBox "This document contains no tables", _
                vbExclamation, "Import Word Table"
            ElseIf TableNo > 1 Then
                TableNo = InputBox("This Word document contains " & TableNo & " tables." & vbCrLf & _
                "Enter table number of table to import", "Import Word Table", "1")
            End If
            With .tables(TableNo)
                'copy cell contents from Word table cells to Excel cells
                For iRow = 1 To .Rows.Count
                    'determine if the text of the 5th column contains the word "Patent"
                  If .cell(iRow, 5).Range.Text Like "*Patent*" Then
                        'find the last empty row in the current worksheet
                        nextRow = ThisWorkbook.ActiveSheet.Range("a" & Rows.Count).End(xlUp).Row + 1
                        For iCol = 1 To .Columns.Count
                            ThisWorkbook.ActiveSheet.Cells(nextRow, iCol) = WorksheetFunction.Clean(.cell(iRow, iCol).Range.Text)
                        Next iCol
                    End If
                Next iRow
            End With
        End With
        Set wdDoc = Nothing
    End Sub

    Please take notice of the code snippet with bold font. When you run this VBA code, the final result would be like this(for table1):

    If you got anything unclear, please let me know. Thanks.


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.

    Click
    HERE to participate the survey.

    • Edited by

      Friday, January 17, 2014 5:27 AM

    • Marked as answer by
      Storo1975
      Friday, January 17, 2014 3:37 PM

Понравилась статья? Поделить с друзьями:
  • Copy the words and word combinations which can be used
  • Copy the words and word combination
  • Copy the word map in your notebook in a minute add
  • Copy the text in excel
  • Copy the formula in excel