Обработка word-файлов

Программирование на Visual Basic for Applications
Bananovyy
Новичок
Новичок
Аватара пользователя
 
Сообщения: 25
Зарегистрирован: 03.08.2008 (Вс) 16:04

Обработка word-файлов

Сообщение Bananovyy » 21.12.2011 (Ср) 21:00

ИДЕЯ:
Свести кучу word-файлов («*.docx») стандартного образца в единую базу

РЕШЕНИЕ:
- Поочередно открываю файлы «*.docx» из книги Excel
- Копирую содержимое и вставляю на первый лист Excel
- Откуда затем из определенных ячеек переношу информацию в базу
- Удаляю вставленную ранее информацию
- Повторяю процедуру по новой…

ПРОБЛЕМА:
- Макрос каждый раз прерывается «ошибкой 1004» на строке: ActiveSheet.Paste
- Есть какие-нидь другие варианты / примеры подобной обработки word-файлов?

КОД:
Код: Выделить всё
Sub Обработка_файлов()
i = 1
MyPath = ThisWorkbook.Path & "\"
MyName = Dir(MyPath & "*.docx")
Do While MyName <> ""
   doc = MyPath & MyName
   Set wd = CreateObject("Word.Application")
   Set wdd = wd.Documents.Open(doc)
   wdd.Content.Select
   wdd.Content.Copy
   wdd.Close (False)
   wd.Quit (False)

   Sheets(1).Activate
   ActiveSheet.Paste

   'ЗДЕСЬ БУДЕТ БЛОК ОБРАБОТКИ ВСТАВЛЕННОЙ ИНФОРМАЦИИ   

   Rows("1:50").Delete Shift:=xlUp
   i = i + 1
   MyName = Dir
Loop
End Sub

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Обработка word-файлов

Сообщение ger_kar » 21.12.2011 (Ср) 21:58

Что-то какое то нагромождение.
Если идея
Свести кучу word-файлов («*.docx») стандартного образца в единую базу
Какую базу?
И зачем промежуточно использовать Excel, какой в этом смысл? Может проще сразу обрабатывать (парсить) текст в Word, получать нужные элементы и сразу вставлять их в базу данных?
Что касается приведенного кода, то нафига в цикле каждый раз создавать Set wd = CreateObject("Word.Application")?
это же будет жуткий тормоз. Создай уж тогда его перед циклом, а в цикле открывай/закрывай документ, без создания/уничтожения "Word.Application"
Bananovyy писал(а):- Есть какие-нидь другие варианты / примеры подобной обработки word-файлов?

Да вариантов валом, но пока сама задача не ясна, то что-то более конкретное сказать сложно.
Что за текст? Что нужно из него выделить? Что за база данных и т.д.
Бороться и искать, найти и перепрятать

Bananovyy
Новичок
Новичок
Аватара пользователя
 
Сообщения: 25
Зарегистрирован: 03.08.2008 (Вс) 16:04

Re: Обработка word-файлов

Сообщение Bananovyy » 21.12.2011 (Ср) 23:24

ger_kar писал(а):Да вариантов валом, но пока сама задача не ясна, то что-то более конкретное сказать сложно.
Что за текст? Что нужно из него выделить? Что за база данных и т.д.


Прикладываю образец файла word – необходимо вытащить данные из желтых ячеек и систематизировать их в табличке (базе) Excel, типа:
№ | ИМЯ | ИНН | ОГРН | Бланки
Вложения
Форма.doc
(58.5 Кб) Скачиваний: 186

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 21.12.2011 (Ср) 23:30

А ты уверен, что такое закрытие Word'a не очищает буфер обмена?
А ещё в возможности вставить то, что ты скопировал?

Bananovyy
Новичок
Новичок
Аватара пользователя
 
Сообщения: 25
Зарегистрирован: 03.08.2008 (Вс) 16:04

Re:

Сообщение Bananovyy » 22.12.2011 (Чт) 6:32

Qwertiy писал(а):А ты уверен, что такое закрытие Word'a не очищает буфер обмена?
А ещё в возможности вставить то, что ты скопировал?


Все копируется отлично… если прогнать макрос через F8, то вообще проблем нет. Выхожу из режима редактирования, запускаю… вылетает «ошибка 1004»… жму Debug / F8 – код прокручивается дальше, опять до этой строчки

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Обработка word-файлов

Сообщение Sam777e » 22.12.2011 (Чт) 8:03

Ну, если не обращать внимания на сказанное коллегой ger_kar [- а, в принципе, он всё сказал правильно ] и помочь сделать так, как тебе удобно / привычно / понятно . . . то вот модель. Перед запуском запихни что-либо в БуферОбмена. [ Я проверял на WinXP SP2 Excel 2003 ].

Код: Выделить всё
Sub Обработка_файлов()
  Dim i As Long
 
  For i = 1 To 5
    Sheets(1).Activate
    Cells(1, 1) = i
    Rows("2:50").Delete Shift:=xlUp
    Cells(2, 1).Select                      ' <<<<
     
    ActiveSheet.Paste
    DoEvents                                ' <<<<

    '  ЗДЕСЬ БУДЕТ БЛОК ОБРАБОТКИ ВСТАВЛЕННОЙ ИНФОРМАЦИИ 
  Next i
End Sub
Здоровья и удачи

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Обработка word-файлов

Сообщение ger_kar » 22.12.2011 (Чт) 8:26

Посмотрел я твой документ и пришел к выводу, что использование Excel там нафиг не нужно. это лишние нагромождения и жуткие тормоза. В твоем документе даже парсить то особо ничего не надо, ибо у тебя там и так всё разложено по полочкам, то бишь по ячейкам таблицы.
Надо просто брать нужные значения используя при этом коллекцию Tables и объекты этой коллекции Table, и далее использовать Cell и Range.
Если до вечера ничего не получиться, вечером напишу тебе код. Сейчас просто некогда этим заниматься.
Бороться и искать, найти и перепрятать

Bananovyy
Новичок
Новичок
Аватара пользователя
 
Сообщения: 25
Зарегистрирован: 03.08.2008 (Вс) 16:04

Re: Обработка word-файлов

Сообщение Bananovyy » 22.12.2011 (Чт) 9:03

ger_kar писал(а):Посмотрел я твой документ и пришел к выводу, что использование Excel там нафиг не нужно. это лишние нагромождения и жуткие тормоза. В твоем документе даже парсить то особо ничего не надо, ибо у тебя там и так всё разложено по полочкам, то бишь по ячейкам таблицы.
Надо просто брать нужные значения используя при этом коллекцию Tables и объекты этой коллекции Table, и далее использовать Cell и Range.
Если до вечера ничего не получиться, вечером напишу тебе код. Сейчас просто некогда этим заниматься.


Если не трудно, был бы благодарен, опыта шары word-файлов вообще не имею...

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Обработка word-файлов

Сообщение ger_kar » 22.12.2011 (Чт) 11:53

Вот тебе код
Код: Выделить всё
Function GetName(oActiveDocument As Document) As String

    Dim objRange        As Range
    Dim strReplacement  As String
   
    strReplacement = Chr$(13) & Chr$(7)
   
    Set objRange = oActiveDocument.Tables(1).Cell(8, 2).Range
    GetName = objRange.Text
    GetName = Replace(GetName, strReplacement, vbNullString)
   
End Function


Function GetOGRN(oActiveDocument As Document) As String

    Dim lngColumn   As Long
    Dim objRange    As Range
    Dim strReplacement  As String
   
    strReplacement = Chr$(13) & Chr$(7)
   
    For lngColumn = 2 To 17
        Set objRange = oActiveDocument.Tables(1).Cell(10, lngColumn).Range
        GetOGRN = GetOGRN & Replace(objRange.Text, strReplacement, vbNullString)
    Next
   
End Function


Function GetINN(oActiveDocument As Document) As String

    Dim lngColumn   As Long
    Dim objRange    As Range
    Dim strReplacement  As String
   
    strReplacement = Chr$(13) & Chr$(7)
   
    For lngColumn = 2 To 11
        Set objRange = oActiveDocument.Tables(1).Cell(12, lngColumn).Range
        GetINN = GetINN & Replace(objRange.Text, strReplacement, vbNullString)
    Next
   
End Function


А вот твой документ с работающим примером (смотри модуль). Сделал три ф-ции. Остальное надеюсь сам доделаешь как тебе надо. Там все очень просто
Вложения
Форма.doc
(72.5 Кб) Скачиваний: 203
Бороться и искать, найти и перепрятать

Bananovyy
Новичок
Новичок
Аватара пользователя
 
Сообщения: 25
Зарегистрирован: 03.08.2008 (Вс) 16:04

Re: Обработка word-файлов

Сообщение Bananovyy » 22.12.2011 (Чт) 12:30

ger_kar писал(а):А вот твой документ с работающим примером (смотри модуль). Сделал три ф-ции. Остальное надеюсь сам доделаешь как тебе надо. Там все очень просто


Спсб, как забирать данные понял.
Не ясно как это реализовать для группы файлов:
- Откуда будет запускаться макрос
- Как в этой цепочке открываются word-файлы
- Где соответственно сохранять результаты

хотя бы на словах

Bananovyy
Новичок
Новичок
Аватара пользователя
 
Сообщения: 25
Зарегистрирован: 03.08.2008 (Вс) 16:04

Re: Обработка word-файлов

Сообщение Bananovyy » 22.12.2011 (Чт) 12:49

Sam777e писал(а):Ну, если не обращать внимания на сказанное коллегой ger_kar [- а, в принципе, он всё сказал правильно ] и помочь сделать так, как тебе удобно / привычно / понятно . . . то вот модель. Перед запуском запихни что-либо в БуферОбмена. [ Я проверял на WinXP SP2 Excel 2003 ].


DoEvents в 2007 видимо не пашет... та же 1004 ошибка

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Обработка word-файлов

Сообщение ger_kar » 22.12.2011 (Чт) 15:24

Bananovyy писал(а):Не ясно как это реализовать для группы файлов:
Ну у тебя же, в том куске кода, который ты привел в первом посте это уже реализовано, надо его просто немного видоизменить выкинув ненужное и воспользовавшись моим советом с выносом Set wd = CreateObject("Word.Application") за тело цикла.
Например так:
Код: Выделить всё
Sub Обработка_файлов()
     Dim i as Long
     Dim MyPath as string, MyName as string, doc as string
     Dim wd as Word.Application, wdd as Word.Document
     Dim strName as string
     
     i = 1
     MyPath = ThisWorkbook.Path & "\"
     MyName = Dir(MyPath & "*.docx")
     Set wd = CreateObject("Word.Application")
     Do While MyName <> ""
         doc = MyPath & MyName
         Set wdd = wd.Documents.Open(doc)
         
        'Вызываем ф-цию из моего примера       
        strName = GetName(wdd)
        'Вызываем другие ф-ции аналогичным образом

                   'ЗДЕСЬ БУДЕТ БЛОК ВСТАВКИ В БАЗУ ДАННЫХ   

         wdd.close 'закрываем документ
         MyName = Dir
     Loop
     wd.Quit 'Закрываем Word
     set wd = Nothing 'Обнуляем объектную переменную
End Sub


Bananovyy писал(а):- Откуда будет запускаться макрос
Странный вопрос. Я откуда знаю, как тебе надо и откуда надо его запускать? Вариантов валом. Можно сделать процедуру экспорта из Word. Можно сделать процедуру импорта в той базе, куда ты это все собираешься вставлять. Можно сделать отдельное приложение на VB. Тут уж как тебе удобно, так и надо делать.
Bananovyy писал(а):- Где соответственно сохранять результаты

Ну в базу которую ты собираешься заполнять, ты же этого хотел. Ты в самом первом посте писал:
Bananovyy писал(а):- Поочередно открываю файлы «*.docx» из книги Excel
- Копирую содержимое и вставляю на первый лист Excel
- Откуда затем из определенных ячеек переношу информацию в базу
- Удаляю вставленную ранее информацию
- Повторяю процедуру по новой…


Получится:
- Открываю документ
- Откуда затем из определенных ячеек переношу информацию в базу
- Закрываю документ
- Открываю другой документ
И так много раз подряд ;)
Бороться и искать, найти и перепрятать

Bananovyy
Новичок
Новичок
Аватара пользователя
 
Сообщения: 25
Зарегистрирован: 03.08.2008 (Вс) 16:04

Re: Обработка word-файлов

Сообщение Bananovyy » 22.12.2011 (Чт) 15:37

ger_kar писал(а):Получится:
- Открываю документ
- Откуда затем из определенных ячеек переношу информацию в базу
- Закрываю документ
- Открываю другой документ
И так много раз подряд ;)


А мне не до смеха)))
Спасибо, поковыряюсь вечером

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Обработка word-файлов

Сообщение ger_kar » 22.12.2011 (Чт) 16:27

Bananovyy писал(а):А мне не до смеха)))
Надо ко всему относиться с юмором! Нам юмор строить и жить помогает ;)
Тут все элементарно, у тебя все получится, ну а если... Тогда поможем.
Бороться и искать, найти и перепрятать

Bananovyy
Новичок
Новичок
Аватара пользователя
 
Сообщения: 25
Зарегистрирован: 03.08.2008 (Вс) 16:04

Re: Обработка word-файлов

Сообщение Bananovyy » 16.01.2012 (Пн) 14:53

Вопрос по теме, вдогонку: подскажите дельные ссылки по парсингу интернета / вордов на VBA, может примеры где-то в нете весят?

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Обработка word-файлов

Сообщение Sam777e » 17.01.2012 (Вт) 2:31

Bananovyy писал(а):Вопрос по теме, вдогонку: подскажите дельные ссылки по парсингу интернета / вордов на VBA, может примеры где-то в нете весят?


http://word.tips.net/
Здоровья и удачи

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Обработка word-файлов

Сообщение ger_kar » 17.01.2012 (Вт) 9:17

Я думаю, что в данном деле (парсинге) тебе обязательно понадобятся регулярные выражения, поэтому если ты что-то будешь серьезно парсить, то без изучения регулярных выражений тебе не обойтись, да и для общего развития их изучить будет полезно.
Начни пожалуй с этой статьи, а потом прочти здесь
Бороться и искать, найти и перепрятать

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Обработка word-файлов

Сообщение ger_kar » 17.01.2012 (Вт) 9:36

Что касается именно Word, то обязательно почитай Это и вот здесь
И еще вот
Бороться и искать, найти и перепрятать

Bananovyy
Новичок
Новичок
Аватара пользователя
 
Сообщения: 25
Зарегистрирован: 03.08.2008 (Вс) 16:04

Re: Обработка word-файлов

Сообщение Bananovyy » 17.01.2012 (Вт) 13:39

ger_kar писал(а):Я думаю, что в данном деле (парсинге) тебе обязательно понадобятся регулярные выражения, поэтому если ты что-то будешь серьезно парсить, то без изучения регулярных выражений тебе не обойтись, да и для общего развития их изучить будет полезно.
Начни пожалуй с этой статьи, а потом прочти здесь

Блин, даже здесь Wikipedia)))
:) Спасибо!


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 48

    TopList