Здравствуйте, подскажите, можно ли программным путем решить следующую задачу. В приложенном файле архив, в котором находится файл-пример и папка "2017 год" содержащая документы Word. Вопрос состоит с следующем, в столбце A файла примера определенные фразы и т.д., необходимо, что бы в той же строке в столбцах B, C и т.д. в результате выполнения программы значения равнялись именам файлов который содержит данную фразу (при этом таких файлов может быть много).
Здравствуйте, подскажите, можно ли программным путем решить следующую задачу. В приложенном файле архив, в котором находится файл-пример и папка "2017 год" содержащая документы Word. Вопрос состоит с следующем, в столбце A файла примера определенные фразы и т.д., необходимо, что бы в той же строке в столбцах B, C и т.д. в результате выполнения программы значения равнялись именам файлов который содержит данную фразу (при этом таких файлов может быть много).Sashagor1982
Другой вариант - открывать файлы Word вручную, также вручную поиском искать нужное и отмечать, если найдено.
Я бы мог сделать нужный макрос, но на это нужно потратить не менее полноценного рабочего дня. Оно мне надо? ...может найдется кто, кому это интересно ради саморазвития...
Другой вариант - открывать файлы Word вручную, также вручную поиском искать нужное и отмечать, если найдено.
Я бы мог сделать нужный макрос, но на это нужно потратить не менее полноценного рабочего дня. Оно мне надо? ...может найдется кто, кому это интересно ради саморазвития...Michael_S
Сообщение отредактировал Michael_S - Воскресенье, 04.06.2017, 11:53
Попробовал ради саморазвития. Уверен что можно упростить и оптимизировать, но так скажем, для начала, можно попробовать так:
[vba]
Код
Sub SearchInMSWord() Dim FSO As Object Dim SourceFolder As Object Dim FileItem As Object Dim objWord As Word.Application Dim wrdDoc As Word.Document Dim SearchValue As String Dim s As Variant Dim elem As Variant Dim i As Long Dim n As Long Dim k As Long Dim lLastRow As Long
lLastRow = Cells(Rows.Count, 1).End(xlUp).Row
Set FSO = CreateObject("Scripting.FileSystemObject") Set SourceFolder = FSO.getfolder(ThisWorkbook.Path & "/2017 год") For Each FileItem In SourceFolder.Files k = k + 1 n = 0 Set objWord = CreateObject("Word.Application") Set wrdDoc = objWord.Documents.Open(FileItem.Path) With wrdDoc s = Split(.Range.Text, " ") For Each elem In s For i = 2 To lLastRow SearchValue = Worksheets("Лист1").Cells(i, 1).Value If elem = SearchValue Then n = n + 1 Worksheets("Лист1").Cells(n + 1, k + 1).Value = FileItem.Name End If Next Next End With wrdDoc.Close objWord.Quit Next End Sub
[/vba]
И еще, я немного переформатировал ваш пример, добавив пробел, как разделитель между словами, иначе не знаю как использовать функцию Split. Возможно, нужно искать символ новой строки.
Попробовал ради саморазвития. Уверен что можно упростить и оптимизировать, но так скажем, для начала, можно попробовать так:
[vba]
Код
Sub SearchInMSWord() Dim FSO As Object Dim SourceFolder As Object Dim FileItem As Object Dim objWord As Word.Application Dim wrdDoc As Word.Document Dim SearchValue As String Dim s As Variant Dim elem As Variant Dim i As Long Dim n As Long Dim k As Long Dim lLastRow As Long
lLastRow = Cells(Rows.Count, 1).End(xlUp).Row
Set FSO = CreateObject("Scripting.FileSystemObject") Set SourceFolder = FSO.getfolder(ThisWorkbook.Path & "/2017 год") For Each FileItem In SourceFolder.Files k = k + 1 n = 0 Set objWord = CreateObject("Word.Application") Set wrdDoc = objWord.Documents.Open(FileItem.Path) With wrdDoc s = Split(.Range.Text, " ") For Each elem In s For i = 2 To lLastRow SearchValue = Worksheets("Лист1").Cells(i, 1).Value If elem = SearchValue Then n = n + 1 Worksheets("Лист1").Cells(n + 1, k + 1).Value = FileItem.Name End If Next Next End With wrdDoc.Close objWord.Quit Next End Sub
[/vba]
И еще, я немного переформатировал ваш пример, добавив пробел, как разделитель между словами, иначе не знаю как использовать функцию Split. Возможно, нужно искать символ новой строки.VSerg
Лучше конечно указывать какую ошибку. Но рискну предположить, что нет ссылки на Microsoft Word Object Library. Нужно зайти в меню Инструменты => ссылки и установить галочку. Если разделитель запятая, то попробуйте изменить строку[vba]
Лучше конечно указывать какую ошибку. Но рискну предположить, что нет ссылки на Microsoft Word Object Library. Нужно зайти в меню Инструменты => ссылки и установить галочку. Если разделитель запятая, то попробуйте изменить строку[vba]
VSerg, я думаю, что проблема состоит в том, что у вас 2013, а у ТС - 2007. У Экселя есть проблема обратной совместимости и ваш файл пытается найти у Sashagor1982 библиотеку 2013 Word, которой просто нет. Поскольку вы всё равно используете позднее связывание в области имён достаточно переписать [vba]
Код
Dim objWord As Object Dim wrdDoc As Object
[/vba] и тогда ссылка на библиотеку вовсе не нужна
VSerg, я думаю, что проблема состоит в том, что у вас 2013, а у ТС - 2007. У Экселя есть проблема обратной совместимости и ваш файл пытается найти у Sashagor1982 библиотеку 2013 Word, которой просто нет. Поскольку вы всё равно используете позднее связывание в области имён достаточно переписать [vba]
Код
Dim objWord As Object Dim wrdDoc As Object
[/vba] и тогда ссылка на библиотеку вовсе не нужнаbuchlotnik
Сообщение отредактировал buchlotnik - Воскресенье, 04.06.2017, 18:08
VSerg, buchlotnik, Спасибо, чуть доработал код, программа в принципе рабочая. Однако, есть ли другие варианты решения задачи? В этом варианте программа разбивает файлы на слова и каждое проверяет что при большом количестве файлов и данных в файлах очень долго, а достаточно просто знать содержит ли Word-файл данное значение или нет.
VSerg, buchlotnik, Спасибо, чуть доработал код, программа в принципе рабочая. Однако, есть ли другие варианты решения задачи? В этом варианте программа разбивает файлы на слова и каждое проверяет что при большом количестве файлов и данных в файлах очень долго, а достаточно просто знать содержит ли Word-файл данное значение или нет.Sashagor1982
Sub SearchInMSWord() Dim FSO As Object Dim SourceFolder As Object Dim FileItem As Object Dim objWord As Object Dim wrdDoc As Object Dim i As Long Dim lLastRow As Long Dim myRange As Object
lLastRow = Cells(Rows.Count, 1).End(xlUp).Row Set FSO = CreateObject("Scripting.FileSystemObject") Set SourceFolder = FSO.getfolder(ThisWorkbook.Path & "/2017 год") Set objWord = CreateObject("Word.Application")
For Each FileItem In SourceFolder.Files Set wrdDoc = objWord.Documents.Open(FileItem.Path, , True) For i = 1 To lLastRow Set myRange = wrdDoc.Content myRange.Find.Execute Cells(i, 1).Value, , , , , , True If myRange.Find.Found Then Cells(i, Columns.Count).End(xlToLeft).Next = wrdDoc.Name Set myRange = Nothing Next wrdDoc.Close Next objWord.Quit Set wrdDoc = Nothing: Set objWord = Nothing: Set SourceFolder = Nothing: Set FSO = Nothing End Sub
[/vba] Протестировал, поправил
Писать с нуля и тестировать было лениво. [vba]
Код
Sub SearchInMSWord() Dim FSO As Object Dim SourceFolder As Object Dim FileItem As Object Dim objWord As Object Dim wrdDoc As Object Dim i As Long Dim lLastRow As Long Dim myRange As Object
lLastRow = Cells(Rows.Count, 1).End(xlUp).Row Set FSO = CreateObject("Scripting.FileSystemObject") Set SourceFolder = FSO.getfolder(ThisWorkbook.Path & "/2017 год") Set objWord = CreateObject("Word.Application")
For Each FileItem In SourceFolder.Files Set wrdDoc = objWord.Documents.Open(FileItem.Path, , True) For i = 1 To lLastRow Set myRange = wrdDoc.Content myRange.Find.Execute Cells(i, 1).Value, , , , , , True If myRange.Find.Found Then Cells(i, Columns.Count).End(xlToLeft).Next = wrdDoc.Name Set myRange = Nothing Next wrdDoc.Close Next objWord.Quit Set wrdDoc = Nothing: Set objWord = Nothing: Set SourceFolder = Nothing: Set FSO = Nothing End Sub
Всем привет! А можно сделать то же самое, только чтобы поиск значения осуществлялся в конкретном месте файла ворд? Например в таблице или пометить нужное место стилем "Заголовок/подзаголовок" Вышеизложенное решение уж больно долго работает в больших документах
Всем привет! А можно сделать то же самое, только чтобы поиск значения осуществлялся в конкретном месте файла ворд? Например в таблице или пометить нужное место стилем "Заголовок/подзаголовок" Вышеизложенное решение уж больно долго работает в больших документах Leprotto
Можно. И чтобы не менять оформление документов - пометьте нужные куски закладками, а затем вместо всего wrdDoc.Content ищите по коллекции wrdDoc.Bookmarks (Bookmarks(i).Range.Text -содержимое закладки).
Можно. И чтобы не менять оформление документов - пометьте нужные куски закладками, а затем вместо всего wrdDoc.Content ищите по коллекции wrdDoc.Bookmarks (Bookmarks(i).Range.Text -содержимое закладки).AndreTM
AndreTM, СУПЕР, СПАСИБО! Правда сначала помечал закладкой кусок текста и выяснилось, что при корректировке этого текста объем закладки меняется. Поместил нужное в таблицу и пометил закладкой всю ячейку. Работает отлично
AndreTM, СУПЕР, СПАСИБО! Правда сначала помечал закладкой кусок текста и выяснилось, что при корректировке этого текста объем закладки меняется. Поместил нужное в таблицу и пометил закладкой всю ячейку. Работает отлично Leprotto