Страницы: 1
RSS
VBA Найти текст в документе Word и скопировать его в Excel
 

Доброе время суток :)

Помогите, пожалуйста, с заданием. Необходимо найти выделенный определенным цветом текст в документе Word и скопировать его в Excel, где каждому цвету будет соответствовать свой лист. Каждое новое выделение ворда копируется в следующую ячейку экселя. Причем макрос нужно написать в экселе, а файл ворда должен быть формата doc/docx. Я новичок в VBA, поэтому алгоритм вижу таким:

1) Поиск выделенного красным цветом текста

2) Его сохранение в переменную

3) Вставка текста в первую ячейку

4) Поиск следующего выделенного красным цветом текста по документу и повторение первых трех пунктов до конца документа

5) Затем те же пункты для других цветов

Можно сделать сохранение переменных в список (List), но не знаю, есть ли такое в VBA.

С проблемой столкнулся, по канону, сразу на первом этапе. Нашел в инете способ и написал следующий код:

Код
Sub FindData()
    Dim rng As Range
    Set rng = ActiveDocument.Range
    With rng.Find
        '.ClearFormatting
        .Highlight = wdColorRed
        '.Font.Color = wdColorRed
        '.Format = True
        '.Text = "<.*>"
        .Wrap = wdFindContinue
        '.MatchWildcards = True
        .Execute
    End With
    MsgBox "" & rng.Text & " найден"
    
End Sub
Внутри ворда макрос работает правильно, показывает первую выделенную нужным цветом фразу. Внутри экселя код выглядит так:
Код
Sub InsertText()
    
    Dim objWrdApp As Object
    Dim objWrdDoc As Object
    Dim text As Object
    
    On Error Resume Next
    
    Set objWrdApp = GetObject(, "Word.Application")
    
    If objWrdApp Is Nothing Then
        Set objWrdApp = CreateObject("Word.Application")
    End If
    
    ' путь, который прописывается в ячейке
    Dim path As String
    path = [H2]
       
    Set objWrdDoc = objWrdApp.Documents.Open(path)
    
    With objWrdDoc.Content.Find
        '.ClearFormatting
        .Highlight = wdColorRed
        '.Font.Color = wdColorRed
        '.Format = True
        '.Text = "<.*>"
        '.MatchWildcards = True
        .Execute
    End With
    MsgBox "" & objWrdDoc.Content.text & " найден"
    Set objWrdDoc = Nothing
    Set objWrdApp = Nothing
    
End Sub
И показывает весь текст документа вместо выделенной части. Помогите, пожалуйста ^^
 
А что Excel знает о константе wdColorRed?
Добавьет определение
Const wdColorRed=255 или используйте 255 вместо нее.
почему  "<.*>",  а не  "<*>"?
ну и конечно надо получачть результат и записывать несколько раз в цикле.
Изменено: БМВ - 26.11.2023 21:51:51
По вопросам из тем форума, личку не читаю.
 
БМВ, это не помогло, все равно показывает весь текст документа. А .Text = "<*>" все равно в комментариях, поэтому не учитывается. Точка там стоит, так как я играл с регулярными выражениями, думал, что может проблема в них была.
Изменено: yur7yur7 - 26.11.2023 22:54:25
 
yur7yur7,  Так и в Word у вас не работало, просто совпало. При поиске не учитывается цвет выделения, его нужно проверять уже в найденном.
По вопросам из тем форума, личку не читаю.
 
БМВ, спасибо за подсказку, дальше сам допер.
Решение будет таким:
Код
Sub InsertText()
    
    ' поиск пустой ячейки в каждом листе
    Dim indexEmpty1 As Integer
    Dim indexEmpty2 As Integer
    Dim indexEmpty3 As Integer
    Dim indexEmpty4 As Integer
    
    ' задаем поиск пустой ячейки с первой строки
    indexEmpty1 = 1
    indexEmpty2 = 1
    indexEmpty3 = 1
    indexEmpty4 = 1
    
    ' сам поиск
    Do While Sheets(1).Cells(indexEmpty1, 1).Value <> ""
        indexEmpty1 = indexEmpty1 + 1
    Loop
    
    Do While Sheets(2).Cells(indexEmpty2, 1).Value <> ""
        indexEmpty2 = indexEmpty2 + 1
    Loop
    
    Do While Sheets(3).Cells(indexEmpty3, 1).Value <> ""
        indexEmpty3 = indexEmpty3 + 1
    Loop
    
    Do While Sheets(4).Cells(indexEmpty4, 1).Value <> ""
        indexEmpty4 = indexEmpty4 + 1
    Loop

    ' поиск выделенного текста в word
    Dim objWrdApp As Object
    Dim objWrdDoc As Object
    
    On Error Resume Next
    
    Set objWrdApp = GetObject(, "Word.Application")
    
    If objWrdApp Is Nothing Then
        Set objWrdApp = CreateObject("Word.Application")
    End If
    
    ' путь, который прописывается в ячейке
    Dim path As String
    path = Sheets(5).Cells(1, 2).Value
    
    
    Set objWrdDoc = objWrdApp.Documents.Open(path)
    
    
    
    Dim bFound As Boolean
    Dim i As Integer
    
    Set Rng = objWrdDoc.Range
    
    ' задаем критерий поиска
    With Rng.Find
        .ClearFormatting
        .Highlight = 4 ' как я понял, неважно какое тут будет значение, главное, что поиск будет затрагивать только выделенные любым цветом участки
        .Wrap = 0 ' константа wdFindStop
        bFound = .Execute
    End With
    
    Dim rangeReplace As Range
    Dim textPlace As String
    
    ' поиск значений по всему тексту
    Do While bFound
    
        ' замена символа переноса строки без нового параграфа в ворде (SHIFT + ENTER)
        textPlace = Rng.text
        If InStr(1, Rng.text, "") > 0 Then
            Sheets(5).Cells(2, 1).Value = Rng.text
            Set rangeReplace = Sheets(5).Range("A2")
            textPlace = rangeReplace.Replace("", " ", MatchCase:=True)
            textPlace = Sheets(5).Cells(2, 1).Value
        End If
        
        ' очистим temp ячейку
        rangeReplace.ClearContents
        
        ' зеленый цвет
        If Rng.HighlightColorIndex = 4 Then
            Sheets(4).Cells(indexEmpty4, 1) = textPlace
            indexEmpty4 = indexEmpty4 + 1
        End If
        ' серый цвет
        If Rng.HighlightColorIndex = 16 Then
            Sheets(3).Cells(indexEmpty3, 1) = textPlace
            indexEmpty3 = indexEmpty3 + 1
        End If
        ' желтый цвет
        If Rng.HighlightColorIndex = 7 Then
            Sheets(2).Cells(indexEmpty2, 1) = textPlace
            indexEmpty2 = indexEmpty2 + 1
        End If
        ' аква цвет
        If Rng.HighlightColorIndex = 3 Then
            Sheets(1).Cells(indexEmpty1, 1) = textPlace
            indexEmpty1 = indexEmpty1 + 1
        End If
        bFound = Rng.Find.Execute

    Loop

    Set objWrdDoc = Nothing
    Set objWrdApp = Nothing
    
    
End Sub
 
В пункте замены служебного символа ворда пустое место, так как символ не отображается в текущей кодировке. В прикрепленном файле он есть, все работает :)  
Страницы: 1
Наверх