vba - текст в ворде находится, но не заменяется
От: fegdri  
Дата: 29.10.10 17:46
Оценка:
Задача была, в экселе выбрать строку, макрос запустить, а он должен взять шаблон, туда всё подставить из ячеек, и чтобы сразу распечатывать потом.

Sub Export_to_Word()

    If vbOK = MsgBox("Номер строки: " & ActiveCell.Row, vbOKCancel) Then
    
        currentRow = ActiveCell.Row ' номер строки получили
        
        ' вынимаю содержимое ячеек
       
        firstName = Cells.Range("A" & currentRow).Text
        lastName = Cells.Range("B" & currentRow).Text
        age = Cells.Range("C" & currentRow).Text
        salary = Cells.Range("D" & currentRow).Text
        
        Dim appWord As Object
        Dim wordDoc As Object
        Set appWord = CreateObject("Word.Application")
        Set wordDoc = appWord.Documents.Open(ThisWorkbook.Path & "\pattern.doc") ' шаблон
        
        ' pattern.doc помечен "только для чтения", но я пробовал отключать, и всё равно
        
        appWord.Visible = True
        
        appWord.Activate
        
        With appWord
            .Selection.Find.ClearFormatting
            .Selection.Find.Replacement.ClearFormatting
            With .Selection.Find
                .Text = "#1"
                .Replacement.Text = "blablabla" ' сюда будут подставляться firstName, lastName...
                .Forward = True
                .Wrap = wdFindContinue
                .Format = False
                .MatchCase = False
                .MatchWholeWord = False
                .MatchWildcards = False
                .MatchSoundsLike = False
                .MatchAllWordForms = False
            End With
            .Selection.Find.Execute replace:=wdReplaceAll
        End With
        
    End If
    
End Sub

Так вот, окно открывается, "#1" в шаблоне выделяется, но не заменяется. Не знаю, что делать.
vba
Re: vba - текст в ворде находится, но не заменяется
От: fegdri  
Дата: 30.10.10 10:25
Оценка:
Переделал через DocVariable, всё работает. Но просто замена текста меня всё еще беспокоит.
Вот работающий код для потомков:

Sub Export_to_Word()

    If vbOK = MsgBox("Номер строки: " & ActiveCell.Row, vbOKCancel) Then
    
        currentRow = ActiveCell.Row ' номер строки получили
        
        ' вынимаем содержимое ячеек
        ' Value - это значение в том виде, как юзер ее ввел (40000)
        ' Text - в том виде, как оно выглядит в экселе (40 000,00р.)
        
        firstName = Cells.Range("A" & currentRow).Text
        lastName = Cells.Range("B" & currentRow).Text
        age = Cells.Range("C" & currentRow).Text
        salary = Cells.Range("D" & currentRow).Text
        
        Dim appWord As Object
        Dim wordDoc As Object
        
        Set appWord = CreateObject("Word.Application") ' запускаем ворд
        appWord.Visible = True
        
        ' так можно открыть документ
        ' Set wordDoc = appWord.Documents.Open(ThisWorkbook.Path & "\pattern.doc")
        
        ' но мы открываем как бы его копию
        Set wordDoc = appWord.Documents.Add(ThisWorkbook.Path & "\pattern.doc", False, True)
        
        ' больше инфы об относительных путях к файлам
        ' http://stackoverflow.com/questions/213584/relative-instead-of-absolute-paths-in-excel-vba
                
        With wordDoc
  
          ' назначить значения полям DocVariable
          .Variables("name") = firstName
          .Variables("surname") = lastName
          .Variables("age") = age
          .Variables("salary") = salary
          
          ' обновить поля DocVariable
          .Fields.Update
          
          ' узнал про DocVariable
          ' отсюда http://sql.ru/forum/actualthread.aspx?tid=794788
          
        End With
        
        appWord.Activate
        
        ' Вид -> Разметка страницы
        ' больше инфы здесь: http://www.ozgrid.com/forum/showthread.php?t=44834&page=1
        appWord.ActiveWindow.ActivePane.View.Type = 3
        appWord.WordBasic.AcceptAllChangesInDoc
        
    End If
    
End Sub
Re[2]: vba - текст в ворде находится, но не заменяется
От: ZAMUNDA Земля для жалоб и предложений
Дата: 31.10.10 12:33
Оценка:
Здравствуйте, fegdri, Вы писали:

Только собрался тебе рассказать, как ты сам до всего дошёл. Потомкам советую пользоваться Tools->References и ThisWorkbook. Быстрее будет если сначала все поля заполнить, а потом уж appWord.Visible делать.
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.