В вордовском документе каждая страница представляет собой однотипный шаблон. Нужно в Excel создать реестр, чтобы одной странице вордовского документа соответствовала одна строка в Excel. Макрос можно создать или в word или в excel.
В вордовском документе каждая страница представляет собой однотипный шаблон. Нужно в Excel создать реестр, чтобы одной странице вордовского документа соответствовала одна строка в Excel. Макрос можно создать или в word или в excel.SergeyKorotun
Код жёсткий, поэтому просьба строго соблюсти условия, иначе код может не сработать:
1). Все вордовские документы на момент запуска кода должны быть закрыты. Иначе их закроет принудительно без сохранения. 2). Вместо "C:\Data_1.docm" в двух местах надо вставить точный путь к вордовскому документу на Вашем ПК. 3). Там же точно укажите разрешение файла. Я за какой-то надобностью Ваш вордовский документ сохранил с поддержкой макросов, это .docm =) В самом вордовском файле ничего не менял.
Код перебирает все таблицы в документе и из ячеек с расположением как в примере вытягивает данные.
[vba]
Код
Sub Take_Data_From_Word() Application.ScreenUpdating = False With ThisWorkbook.Sheets(1)
Dim objWrdApp As Object Dim objWrdDoc As Object Dim A As Long 'Счётчик
If objWrdApp Is Nothing Then Set objWrdApp = CreateObject("Word.Application") Set objWrdDoc = objWrdApp.Documents.Open("C:\Data_1.docm") objWrdApp.Visible = False End If
Set objWrdDoc = objWrdApp.Documents.Open("C:\Data_1.docm")
A = 1
Dim TableX As Object
For Each TableX In objWrdDoc.tables .Cells(A + 1, 1).Value = Left(objWrdDoc.tables(A).Rows(2).Cells(1).Range.Text, Len(objWrdDoc.tables(A).Rows(2).Cells(1).Range.Text) - 1) .Cells(A + 1, 2).Value = Left(objWrdDoc.tables(A).Rows(3).Cells(3).Range.Text, Len(objWrdDoc.tables(A).Rows(3).Cells(3).Range.Text) - 1) .Cells(A + 1, 3).Value = Left(objWrdDoc.tables(A).Rows(4).Cells(5).Range.Text, Len(objWrdDoc.tables(A).Rows(4).Cells(5).Range.Text) - 1) A = A + 1 Next TableX
.Columns("A:C").EntireColumn.AutoFit
objWrdDoc.Close False objWrdApp.Quit
Set objWrdDoc = Nothing Set objWrdApp = Nothing
End With Application.ScreenUpdating = True End Sub
[/vba]
Сергей, здравствуйте.
Во вложении файл с макросом.
Код жёсткий, поэтому просьба строго соблюсти условия, иначе код может не сработать:
1). Все вордовские документы на момент запуска кода должны быть закрыты. Иначе их закроет принудительно без сохранения. 2). Вместо "C:\Data_1.docm" в двух местах надо вставить точный путь к вордовскому документу на Вашем ПК. 3). Там же точно укажите разрешение файла. Я за какой-то надобностью Ваш вордовский документ сохранил с поддержкой макросов, это .docm =) В самом вордовском файле ничего не менял.
Код перебирает все таблицы в документе и из ячеек с расположением как в примере вытягивает данные.
[vba]
Код
Sub Take_Data_From_Word() Application.ScreenUpdating = False With ThisWorkbook.Sheets(1)
Dim objWrdApp As Object Dim objWrdDoc As Object Dim A As Long 'Счётчик
If objWrdApp Is Nothing Then Set objWrdApp = CreateObject("Word.Application") Set objWrdDoc = objWrdApp.Documents.Open("C:\Data_1.docm") objWrdApp.Visible = False End If
Set objWrdDoc = objWrdApp.Documents.Open("C:\Data_1.docm")
A = 1
Dim TableX As Object
For Each TableX In objWrdDoc.tables .Cells(A + 1, 1).Value = Left(objWrdDoc.tables(A).Rows(2).Cells(1).Range.Text, Len(objWrdDoc.tables(A).Rows(2).Cells(1).Range.Text) - 1) .Cells(A + 1, 2).Value = Left(objWrdDoc.tables(A).Rows(3).Cells(3).Range.Text, Len(objWrdDoc.tables(A).Rows(3).Cells(3).Range.Text) - 1) .Cells(A + 1, 3).Value = Left(objWrdDoc.tables(A).Rows(4).Cells(5).Range.Text, Len(objWrdDoc.tables(A).Rows(4).Cells(5).Range.Text) - 1) A = A + 1 Next TableX
.Columns("A:C").EntireColumn.AutoFit
objWrdDoc.Close False objWrdApp.Quit
Set objWrdDoc = Nothing Set objWrdApp = Nothing
End With Application.ScreenUpdating = True End Sub
В примере вордовский документ был упрощенный, поэтому перенести данный макрос на реальный файл не выйдет. Вы в макросе конкретно указываете координаты ячейки, а мне желательно немного другой алгоритм поиска ячейки со значением, например: - ищем в таблице "FIO" и считываем значение из ячейки ниже - то же самое для ID - ищем "Summa" и считываем значение с ячейки справа - ищем ... и считываем значение с ячейки, смещенной относительно данной на две ячейки влево/вправо и на три вниз/вверх Искомые значения (FIO, ID, Summa, ...) могут располагаться в разных таблицах . Но количество таблиц на страницах постоянно.
В примере вордовский документ был упрощенный, поэтому перенести данный макрос на реальный файл не выйдет. Вы в макросе конкретно указываете координаты ячейки, а мне желательно немного другой алгоритм поиска ячейки со значением, например: - ищем в таблице "FIO" и считываем значение из ячейки ниже - то же самое для ID - ищем "Summa" и считываем значение с ячейки справа - ищем ... и считываем значение с ячейки, смещенной относительно данной на две ячейки влево/вправо и на три вниз/вверх Искомые значения (FIO, ID, Summa, ...) могут располагаться в разных таблицах . Но количество таблиц на страницах постоянно.SergeyKorotun
- количество столбцов и строк в таблицах одинаковое? - сколько всего искомых значений? Нужен список с указанием в какую сторону на сколько ячеек отступать для вывода данных. - оторвали ли руки тому, кто организовал систему с таким классным расположением данных? =)
SergeyKorotun, вопросы:
- количество столбцов и строк в таблицах одинаковое? - сколько всего искомых значений? Нужен список с указанием в какую сторону на сколько ячеек отступать для вывода данных. - оторвали ли руки тому, кто организовал систему с таким классным расположением данных? =)Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
- программа формирует платежные уведомление. Одно уведомление - один файл. Но во-первых файл занимает немного больше одной страницы, а во вторых мы в целях экономии печатаем два уведомления на одном листе, а в третьих программа не все заполняет, и приходится дозаполнять вручную. Поэтому все файлы собираю в один, форматирую чтобы уведомление помещалось на одну страницу и вставляю разрыв страницы. Так вот вроде как бы количество строк и столбцов постоянно, но при редактировании макросом приходилось изловчаться, чтобы правильно выделить искомое значение. То какое то верхнее значение искал, чтобы перескочить в от него в нужную ячейку, то снизу или справа заходил. Вобщем есть объединенные ячейки. Кроме того форма уведомления иногда корректируется. -искомых значений будет больше, чем я приводил в примере. Мне бы примерчик как найти искомое значение и как переместится на x ячеек вверх/вниз и на y ячеек влево вправо. К тому же коллеги в любой момент могут попросить еще какие-то данные добавить в реестр. - не поверите, но от творений этих программистов страдают тысячи человек.
- программа формирует платежные уведомление. Одно уведомление - один файл. Но во-первых файл занимает немного больше одной страницы, а во вторых мы в целях экономии печатаем два уведомления на одном листе, а в третьих программа не все заполняет, и приходится дозаполнять вручную. Поэтому все файлы собираю в один, форматирую чтобы уведомление помещалось на одну страницу и вставляю разрыв страницы. Так вот вроде как бы количество строк и столбцов постоянно, но при редактировании макросом приходилось изловчаться, чтобы правильно выделить искомое значение. То какое то верхнее значение искал, чтобы перескочить в от него в нужную ячейку, то снизу или справа заходил. Вобщем есть объединенные ячейки. Кроме того форма уведомления иногда корректируется. -искомых значений будет больше, чем я приводил в примере. Мне бы примерчик как найти искомое значение и как переместится на x ячеек вверх/вниз и на y ячеек влево вправо. К тому же коллеги в любой момент могут попросить еще какие-то данные добавить в реестр. - не поверите, но от творений этих программистов страдают тысячи человек.SergeyKorotun
SergeyKorotun, есть ли возможность выгружать данные в Excel? Это откроет больше возможностей для обработки.
Похоже, что работа объёмная. Здесь на форуме есть раздел "Работа и Фриланс" где светлые рыцари Excel готовы решить Ваши вопросы.
Если хотите пробовать сами - то Вам надо изучать .offset() метод VBA - он позволяет перенести на Х по вертикали и на Y по горизонтали ячейку. Также изучите циклы со счётчиками - они позволят перебирать таблицы по ячейкам и сравнивать значения. Например, нашли ячейку со значением "FIO" и говорим программе - нашёл, молодец, а теперь вытяни с помощью .offset() значение в таком-то направлении от неё.
По сути, это будет прикладыванием подорожника. По совести - надо настроить корректную выгрузку. И если есть IT-отдел - то это они тогда должны работать над макросами, если не смогли ничего сделать с изначальным источником. Такая выгрузка нарушает почти все известные правила организации Баз Данных.
SergeyKorotun, есть ли возможность выгружать данные в Excel? Это откроет больше возможностей для обработки.
Похоже, что работа объёмная. Здесь на форуме есть раздел "Работа и Фриланс" где светлые рыцари Excel готовы решить Ваши вопросы.
Если хотите пробовать сами - то Вам надо изучать .offset() метод VBA - он позволяет перенести на Х по вертикали и на Y по горизонтали ячейку. Также изучите циклы со счётчиками - они позволят перебирать таблицы по ячейкам и сравнивать значения. Например, нашли ячейку со значением "FIO" и говорим программе - нашёл, молодец, а теперь вытяни с помощью .offset() значение в таком-то направлении от неё.
По сути, это будет прикладыванием подорожника. По совести - надо настроить корректную выгрузку. И если есть IT-отдел - то это они тогда должны работать над макросами, если не смогли ничего сделать с изначальным источником. Такая выгрузка нарушает почти все известные правила организации Баз Данных.Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
Сообщение отредактировал Rioran - Вторник, 17.06.2014, 14:14
Спасибо. С основами программирования знаком, просто на vba мало опыта. Благодаря вам буду сам пытаться что то написать, так как вы показали как в excel подтянуть данные из ворда. Если будут какие то затруднения, буду обращаться, уверен что поможете.
Спасибо. С основами программирования знаком, просто на vba мало опыта. Благодаря вам буду сам пытаться что то написать, так как вы показали как в excel подтянуть данные из ворда. Если будут какие то затруднения, буду обращаться, уверен что поможете.SergeyKorotun