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:
-
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.
-
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 |
Друзья, помогите. Необходимо сделать следующее: Прикрепленные файлы
|
Grr Пользователь Сообщений: 595 |
#2 05.10.2016 05:23:55 Одна табличка 3х3
Изменено: Grr — 05.10.2016 10:18:41 |
|
JeyCi Пользователь Сообщений: 3357 |
#3 05.10.2016 07:22:29 4 таблицы
Прикрепленные файлы
Изменено: JeyCi — 05.10.2016 07:34:45 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||
Grr Пользователь Сообщений: 595 |
JeyCi, никакого пространства для самодеятельности не оставили |
JeyCi Пользователь Сообщений: 3357 |
#5 05.10.2016 07:34:29
названия таблиц из word’а выковыривать не буду — оставляю для самодеятельности чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||
Dedmoroz86 Пользователь Сообщений: 6 |
Огромное спасибо!!!! Помогло! =)))))) |
Dedmoroz86 Пользователь Сообщений: 6 |
Один вопрос остался, все цифры не поддаются математическим расчетам, в связи с тем что в конце каждой имеется пробел. Может существует макрос чтобы его убрать? Количество строк динамическое(т.е может быть меньше может быть больше). |
Grr Пользователь Сообщений: 595 |
Стандартный функционал — «Найти/Заменить»? |
JeyCi Пользователь Сообщений: 3357 |
#9 05.10.2016 12:34:13 после 18-й строки (перед Next i) — можете вставить проверку
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||
Alex_24 Пользователь Сообщений: 9 |
#10 03.03.2018 16:30:49 Все похоже сделал правильно, а Excel ругается 5941 ошибкой. Что не так подскажите?
|
||
Юрий М Модератор Сообщений: 60569 Контакты см. в профиле |
Alex_24, Вы видели, как форумчане оформляют свой код? Вот и Вы оформляйте аналогично: для этого есть специальная кнопка <…> |
Alex_24, Вы код вручную набивали, что ли? Бросилось в глаза: Есть еще ошибки, но до устранения замечания не скажу где. Изменено: Казанский — 03.03.2018 21:39:38 |
|
nuroraf Пользователь Сообщений: 1 |
JeyCi, Как при копировании сохранить знаки переноса строки? Код рабочий, но перенос строки не сохраняет.
Можно ли скопировать такое точь в точь в ячейку на экзеле? |
sokol92 Пользователь Сообщений: 4445 |
#14 03.05.2019 21:09:47 Добавьте после строки 18 в #3:
Владимир |
||
Игорь Пользователь Сообщений: 2 |
[CODE][/CODE] Изменено: Игорь — 29.03.2023 15:27:31 |
Игорь Пользователь Сообщений: 2 |
#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
-
Edited by