Помогите с переводом из VBA в VB

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

forlord
Сообщения: 7
Зарегистрирован: 09 июл 2008, 09:42

Есть макрос написанный на VBA WORD, как перевести его в VB?
нужно чтобы не было видно выполнения процесса
открывая процесс так:
Set WordApp = New Word.Application
Set DocWord = WordApp.Documents.Open(Path1doc & activ_doc2 & ".doc")
WordApp.Visible = False
DocWord.Activate

For j = 1 To 5
Selection.Find.ClearFormatting
With Selection.Find
.Text = "ПРИЛОЖЕНИЕ № " & j
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute
Selection.EndKey Unit:=wdLine, Extend:=wdExtend
Selection.Font.Size = 12
Selection.MoveDown Unit:=wdLine, Count:=1
Selection.TypeBackspace

Selection.Find.ClearFormatting
With Selection.Find
.Text = "Таблица 1"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute
Selection.MoveDown Unit:=wdLine, Count:=2
Selection.TypeBackspace



Selection.MoveDown Unit:=wdLine, Count:=20
Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
Selection.TypeBackspace

Selection.MoveDown Unit:=wdLine, Count:=20
Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
Selection.TypeBackspace
Selection.TypeBackspace
Selection.TypeBackspace
Selection.TypeBackspace
Selection.TypeBackspace

Selection.MoveDown Unit:=wdLine, Count:=16
Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
Selection.TypeBackspace

Next j
В итоге ошибка. Может есть более простой способ перемещения по Word средсвами VB, если знаете подскажите пожалуйста :confused:
Аватара пользователя
EducatedFool
Сообщения: 197
Зарегистрирован: 06 апр 2008, 14:03
Откуда: Россия, Урал
Контактная информация:

Есть макрос написанный на VBA WORD, как перевести его в VB?
нужно чтобы не было видно выполнения процесса
Например, так: ( проверено в VB 6.0 )

Код: Выделить всё

Sub main()
    [B]MyPath = "C:\Microsoft Windows XP.doc"[/B]
    Dim WordApp As New Word.Application, DocWord As Word.Document
    Set DocWord = WordApp.Documents.Open(MyPath)
    WordApp.Visible = False
    
    With DocWord
        For j = 1 To 5
            Selection.Find.ClearFormatting
            With Selection.Find
                .Text = "ПРИЛОЖЕНИЕ № " & j
                .Replacement.Text = ""
                .Forward = True
                .Wrap = wdFindContinue
                .Format = False
                .MatchCase = False
                .MatchWholeWord = False
                .MatchWildcards = False
                .MatchSoundsLike = False
                .MatchAllWordForms = False
            End With
            Selection.Find.Execute
            Selection.EndKey Unit:=wdLine, Extend:=wdExtend
            Selection.Font.Size = 12
            Selection.MoveDown Unit:=wdLine, Count:=1
            Selection.TypeBackspace
            
            Selection.Find.ClearFormatting
            With Selection.Find
                .Text = "Таблица 1"
                .Replacement.Text = ""
                .Forward = True
                .Wrap = wdFindContinue
                .Format = False
                .MatchCase = False
                .MatchWholeWord = False
                .MatchWildcards = False
                .MatchSoundsLike = False
                .MatchAllWordForms = False
            End With
            Selection.Find.Execute
            Selection.MoveDown Unit:=wdLine, Count:=2
            Selection.TypeBackspace
            
            Selection.MoveDown Unit:=wdLine, Count:=20
            Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
            Selection.TypeBackspace
            
            Selection.MoveDown Unit:=wdLine, Count:=20
            Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
            Selection.TypeBackspace
            Selection.TypeBackspace
            Selection.TypeBackspace
            Selection.TypeBackspace
            Selection.TypeBackspace
            
            Selection.MoveDown Unit:=wdLine, Count:=16
            Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
            Selection.TypeBackspace
            
        Next j
    End With
    DocWord.Close True
    WordApp.Quit True
End Sub
Замените в коде MyPath = "C:\Microsoft Windows XP.doc" на свой путь, например, MyPath = Path1doc & activ_doc2 & ".doc"

Не забудьте в проекте VB поставить ссылку на библиотеку Word.
Может есть более простой способ перемещения по Word средсвами VB
Данный код, безусловно, можно оптимизировать, но не зная точной задачи, это сделать сложно.
forlord
Сообщения: 7
Зарегистрирован: 09 июл 2008, 09:42

Спасибо, это можно делать для всех перемещений по тексту?
В этом примере программа создает документ, который не отформатирован, а это форматирование приводящие в норму.
Аватара пользователя
EducatedFool
Сообщения: 197
Зарегистрирован: 06 апр 2008, 14:03
Откуда: Россия, Урал
Контактная информация:

это можно делать для всех перемещений по тексту?
Вопрос не совсем понятен...
При помощи VB, как и при помощи VBA, с документами MS Office можно делать всё, что угодно.


В общем, используйте следующий код как обёртку для макроса VBA:

Код: Выделить всё

Sub main()
    MyPath = "C:\Microsoft Windows XP.doc"
    Dim WordApp As New Word.Application, DocWord As Word.Document
    Set DocWord = WordApp.Documents.Open(MyPath)
    WordApp.Visible = False
    
    With DocWord
          [B]' здесь размещаете код макроса VBA[/B]
    End With
    DocWord.Close True [B]' закрывает документ с сохранением изменений[/B]
    WordApp.Quit True [B]' закрывает Word[/B]
End Sub
forlord
Сообщения: 7
Зарегистрирован: 09 июл 2008, 09:42

Выдает Object variable or With block variable not set (Error 91). что-то не так
Аватара пользователя
EducatedFool
Сообщения: 197
Зарегистрирован: 06 апр 2008, 14:03
Откуда: Россия, Урал
Контактная информация:

Выдает Object variable or With block variable not set (Error 91). что-то не так
Создание обработчика ошибок на вашей совести...

Укажите строку, на которой появляется ошибка.

По идее, после Set DocWord = WordApp.Documents.Open(MyPath)
надо бы написать if docword is nothing then WordApp.Quit : end
forlord
Сообщения: 7
Зарегистрирован: 09 июл 2008, 09:42

Selection.Find.ClearFormatting может можно по аське пообщаться?
Аватара пользователя
EducatedFool
Сообщения: 197
Зарегистрирован: 06 апр 2008, 14:03
Откуда: Россия, Урал
Контактная информация:

<данные удалены>
forlord
Сообщения: 7
Зарегистрирован: 09 июл 2008, 09:42

Какой Город?
Аватара пользователя
EducatedFool
Сообщения: 197
Зарегистрирован: 06 апр 2008, 14:03
Откуда: Россия, Урал
Контактная информация:

Вопрос знатокам:

Заменили исходный код VB-проекта на следующий:

Код: Выделить всё

Sub main()
    MyPath = "C:\Documents and Settings\Администратор\Рабочий стол\0011.doc"
    Dim WordApp As New Word.Application, WordDoc As Word.Document, p As Word.Paragraph, AddLF As Boolean
    WordApp.Visible = False:    WordApp.DisplayAlerts = wdAlertsNone
    
    Set WordDoc = WordApp.Documents.Open(MyPath): AddLF = False
    If WordDoc Is Nothing Then WordApp.Quit False: End
           'Debug.Print "start": t = Now
    With WordDoc
        For Each p In .Paragraphs
            If InStr(1, p.Range.Text, "Приложение", vbTextCompare) > 0 Then
                If InStr(1, p.Range.Text, "Приложение № 2", vbTextCompare) > 0 Then AddLF = True
                p.Range.Font.Size = 16
                p.Next.Range.Font.Size = 12
            End If
            If p.Next Is Nothing Then p.Range.Delete
            If AddLF Then If InStr(1, p.Range.Text, "Инженер-испытатель", vbTextCompare) > 0 Then p.Previous.Range.Text = String(30, vbCrLf)
        Next
        .Close True
    End With
    Debug.Print Second(Now - t)
    WordApp.Quit:     End
End Sub

Данный код в виде макроса VBA выполняется в Word-е за секунду, но в VB его выполнение занимает 24 секунды и более (порой доходит до минуты)

В то же время изначальный код (см. выше в этом топике) с использованием объекта Selection в Word-e работает медленнее, но в VB превосходит по скорости оптимизированный код (с перебором абзацев)

Вопрос: почему VB (используется раннее связывание) так медленно работает с объектами из коллекции Paragraphs?

Даже выполнение простого перебора абзацев документа

Код: Выделить всё

   With WordDoc
        For Each p In .Paragraphs
        Next
   End With
занимает 17 секунд ...
В чём может быть причина таких тормозов по сравнению с VBA Word?
Ответить