Word макрос для перевода

Translator – небольшая, но крайне полезная программа для переводчика, макрос встраиваемый в приложение MS Office Word, простой в освоении и бесплатный. Макрос может быть полезен переводчикам с/на английский язык.

Автор: englishelp.ru
Цена: Бесплатно (любые пожертвования принимаются на кошелек yandex-деньги 41001239288240)
Язык интерфейса: Английский
Размер: 290 кб
Ссылка: Скачать Translator_v1.6.5.1.zip

    Подпишитесь на ленту новостей

  • Поиск в тексте всех дробных чисел разделенных запятой и замена запятых на точки для этих чисел (в формате английского языка)
  • Поиск непереведенного текста, возможность поиска для русского или английского текста (с возможностью транслитерации).
  • Подсчет статистики: подсчет для заданного текста количества содержащихся в нем так называемых «переводческих» страниц (из расчета общее количество символов с разделителями деленное на 1800). Есть возможность выполнить подсчет статистики для выделенного текста. Подсчет количества абзацев, табуляций, изображений, таблиц, сносок и много другого.
  • Замена обычных пробелов между цифрой и единицей измерения на неразрывный пробел.
  • Функция форматирования заголовков в стиле английского языка (первые буквы слов — заглавные).
  • Вставка текста в MS Word с удалением форматирования (plain text).
  • Поиск выделенного в документе word слова или словосочетания в Google.

Установка макроса Translator

Макрос распространяется в виде шаблона .dot (MS Office Word). Для автоматической установки макроса достаточно просто запустить приложенный к шаблону файл Setup.exe. После завершения установки в вашем приложении Office Word должна появиться дополнительная панель Translator. В случае неудачной установки следует обратиться к приложенному в архиве файлу «Как Установить Translator.html» для установки вручную.

Как установить макрос Translator вручную

Установка панели Translator в Word производится в том случае, если после установки макроса файлом Setup.exe панель Translator в Word не присутствует или Setup.exe не смог корректно завершить установку.

Первый вариант установки:

  1. Закройте Office Word!
  2. Скопируйте файл Translator.dot в папку c:Program FilesMicrosoft OfficeOFFICE10Startup
    Указанный путь может отличаться в зависимости от пути куда был установлен Office Word и от его версии.
  3. Запустите Word.
    На основной панели Word должна появиться дополнительная панель Translator.

Второй вариант установки:

  1. Запустите Word.
  2. Войдите в меню Сервис(Tools)Шаблоны и надстройки(Templates and Add-ins).
  3. Нажмите кнопку Добавить(Add…) и выберите файл Translator.dot.
  4. Перезапустите Word!
    На основной панели Word должна появиться дополнительная панель Translator.

Если ни один из перечисленных способов не помог установить программу Translator, напишите письмо разработчику программы.

Скриншоты макроса Translator с описаниями

Замена запятых на точки
Функция Замена запятых в числах на точки в формате английского языка (вид панели Translator встраиваемой в MS Word). Так число в формате 4,5 будет заменено на число 4.5 в формате английского языка.

Поиск непереведенного текста
Функция Поиск непереведенного текста (вид панели Translator встраиваемой в MS Word).

Диалог Поиск непереведенного текста
Диалог поиска непереведенных фрагментов текста (поиск непереведенного английского и русского текста с возможностью транслитерации для русского текста)

Замена обычных пробелов на неразрывные пробелы
Функция Замены обычных пробелов между значением и единицей измерения на неразрывные пробелы (панель Translator в MS Word)

Функция обработки заголовков
Функция Обработка заголовков – все заголовки в тексте на английском языке приводятся к «правильному виду» (первые буквы слов переводятся в верхний регистр). Таким образом, после применения данной функции макроса к выделенному тексту заголовок, к примеру, вида «This is just a title» будет преобразован в «This Is Just a Title». Для начала обработки заголовков нажмите соответствующую кнопку на панели или сочетание горячих клавиш Alt+Ctrl+T

Функция поиска термина в Google
Функция Поиск термина в Google. Выделите слово или словосочетание в документе Word и нажмите эту кнопку или сочетание клавиш Alt+Ctrl+G

Функция вставки текста без форматирования - plain text
Функция Вставка текста без форматирования – plain text (панель Translator в MS Word). Для вставки текста из буфера обмена нажмите эту кнопку или сочетание клавиш Shift+Ins

Извлечение текста из текстовых блоков Word
Функция Извлечение текста из текстовых блоков Word (Shapes, Text boxes). Откройте документ Word, содержащий текстовые блоки, нажмите кнопку Extract Text from Shapes на панели Translator. После этого будет создан еще один файл Word, содержащий весь текст, извлеченный из текстовых блоков.

Подсчет статистики
Функция подсчет статистики (панель Translator в MS Word)

Диалог подсчета статистики
Диалог подсчета статистики

Ссылка на скачивание: Скачать Translator_v1.6.5.1.zip

Теги: translator | макрос для переводчика | подсчет статистики | программа для переводчика

0 / 0 / 0

Регистрация: 06.11.2015

Сообщений: 7

1

Word

14.01.2020, 08:56. Показов 2587. Ответов 12


Студворк — интернет-сервис помощи студентам

Здравствуйте! Подскажите, как решить следующую задачу:
— есть отчет в word, который формирует программа.
— В отчете применяются одни и те же слова, предложения, обозначения на русском языке.
— Их может быть больше, или меньше, в зависимости от входных условий.
— Но важно, что все слова, предложения и обозначения заранее известны.

Появилась необходимость перевода данных отчетов на английский язык. Сделать это сразу в программе не представляется возможным.

Как я вижу решение поставленной задачи — сформировать excel таблицу, где в одном столбце вписаны известные слова, предложения и обозначения на русском языке, а во втором столбце соответствующие им переводы на английском. Таблицу можно пополнять. Далее, должен быть какой-то макрос в word в виде надстройки. Каждый, кому это будет необходимо сможет себе эту надстройку установить и пользоваться. Макрос по команде пользователя (нажатие пиктограммы в надстройке) будет осуществлять поиск в отчете слова, предложения и обозначения, сравнивать их с таблицей excel (которая размещена в известном месте, например Мои документы), и осуществлять замену.

Прошу помочь в решении этой задачи.



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

14.01.2020, 08:56

Ответы с готовыми решениями:

Перевод Eng to Rus через Regex
Есть код, переводящий слова, набранные в английской раскладке,в русскую:

string Ru…

Язык Eng/Rus
У меня только Енг буквы в компе (Ноуте) а как поставить что бы ещё и русс были,я не знаю =(…

RUS или ENG
Вопрос к опытным програмистам на delohi 7, где удобней работать в руссефицированной или в…

Пропал значок RUSENG в языковой панели
подскажите, у меня такая фигня вообщем пропал значок языковой панели RUSENG, пробывал правой…

12

Aleksan7

109 / 60 / 27

Регистрация: 22.02.2018

Сообщений: 189

14.01.2020, 09:30

2

составляете словарь, как вы написали, в два столбца. и далее циклом проходите по всем строкам словаря, и функцией

Visual Basic
1
2
3
    For i = 1 to ...
        Replace(ТЕКСТ, РУС(i), АНГ(i))
    Next i

«переводите»



1



0 / 0 / 0

Регистрация: 06.11.2015

Сообщений: 7

14.01.2020, 10:07

 [ТС]

3

Aleksan7, спасибо вам. Уверен, что код, написанный вами понятен профессионалам, но я таковым, к сожалению, не являюсь. Максимум, что я могу сделать, это прочесть чужой код, попробовать его понять, и местами подкорректировать, или адаптировать, под свои нужны. С вашим же кодом, я чувствую, нужно делать и начало, и завершение кода. Если вас не затруднит, распишите подробнее.



0



109 / 60 / 27

Регистрация: 22.02.2018

Сообщений: 189

14.01.2020, 10:22

4

jonny0, на теоретический вопрос — теоретический ответ
приложите файлы для работы, с вордом не работал, но попробую из соседней темы приемы украсть, там в вордовском файле ищут совпадения со списком(тем же словарем) в екселе и выделяют цветом, по сути то что нам нужно, только не выделять цветом а заменять.



0



Модератор

Эксперт MS Access

11342 / 4661 / 748

Регистрация: 07.08.2010

Сообщений: 13,505

Записей в блоге: 4

14.01.2020, 13:06

5

Цитата
Сообщение от jonny0
Посмотреть сообщение

решить следующую задачу: есть отчет в word, который формирует программа

любой отчет — это сочетание постоянной и переменной информации

— постоянная — это название отчета,его логотип, шапки таблиц, подписи, примечания
— переменная -это данные таблиц

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

перевод слов(словосочетаний) — это одно
но в отчетах часто могут быть предложения, а значит грамматика должна учитывать например пол или обращение типа мистер/мисс или падежи



0



0 / 0 / 0

Регистрация: 06.11.2015

Сообщений: 7

14.01.2020, 15:51

 [ТС]

6

Дайте мне немного времени, я все подготовлю



0



0 / 0 / 0

Регистрация: 06.11.2015

Сообщений: 7

17.01.2020, 16:45

 [ТС]

7

Готово! посмотрите, пожалуйста.



0



Aleksan7

109 / 60 / 27

Регистрация: 22.02.2018

Сообщений: 189

20.01.2020, 15:25

8

jonny0, попробуйте
в ячейке А1 путь к файлу ексель база слов
А2 путь к файлу отчета который нужно перевести
А3 путь куда сохранится переведенный отчет

работает долго, так как это простой перебор

файлы с которыми будет работать макрос должны быть закрыты

вот код или файл во вложении

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Sub Perevod()
    Dim wordtext As Object
    Dim xlwb As Object
    Set xlwb = GetObject(ThisWorkbook.Sheets(1).Cells(1, 1))
    xlwb.Windows(1).Visible = 1
    aSlova = xlwb.Sheets(1).UsedRange.Value
    xlwb.Close False
    Set wordtext = GetObject(ThisWorkbook.Sheets(1).Cells(2, 1))
    wordtext.Windows(1).Visible = 1
    For i = 1 To UBound(aSlova)
        With wordtext.Range.Find
            .ClearFormatting
            .Text = aSlova(i, 1)
            With .Replacement
                .ClearFormatting
                .Text = aSlova(i, 2)
            End With
            .Execute Replace:=wdReplaceAll
        End With
    Next i
    wordtext.SaveAs (ThisWorkbook.Sheets(1).Cells(3, 1)) & "" & Replace(wordtext.Name, (Split(wordtext.Name, ".")(UBound(Split(wordtext.Name)))), "англ.яз.doc")
    wordtext.Close False
End Sub

Вложения

Тип файла: zip Лист Microsoft Excel.zip (16.1 Кб, 1 просмотров)



1



0 / 0 / 0

Регистрация: 06.11.2015

Сообщений: 7

21.01.2020, 09:47

 [ТС]

9

Aleksan7, спасибо вам большое! Все работает. Есть некоторые косяки с переводом, но это поправимо, думаю. Есть вопрос, в развитии решения: 1. можно ли в вашем excel файле сделать список файлов, требующих перевода? Т.е. макрос будет поочередно переводить все файлы по списку. 2. можно ли задавать диапазон листов для перевода? Например из 6-ти листов перевод требуют только 1-й и 3-й, или с 3-го по 6-й?



0



109 / 60 / 27

Регистрация: 22.02.2018

Сообщений: 189

21.01.2020, 10:54

10

jonny0,
1. список файлов это легко, можно например указать папку или список папок откуда все файлы переведутся
2. с вордом первый раз что то делал, не знаю особо в нём ничего. нужно у специалистов спросить, здесь есть такие

если никто не сделает, то попозже допишу.
так нужен список файлов или список папок откуда будут браться файлы?



0



0 / 0 / 0

Регистрация: 06.11.2015

Сообщений: 7

21.01.2020, 10:56

 [ТС]

11

Aleksan7, список файлов в виде полных путей к ним.



0



Aleksan7

109 / 60 / 27

Регистрация: 22.02.2018

Сообщений: 189

21.01.2020, 17:09

12

Лучший ответ Сообщение было отмечено jonny0 как решение

Решение

jonny0, список файлов в столбце В,
A1 словарь
A2 путь сохранения

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Sub Perevod()
    Dim wordtext As Object
    Dim xlwb As Object
    Set xlwb = GetObject(ThisWorkbook.Sheets(1).Cells(1, 1))
    xlwb.Windows(1).Visible = 1
    aSlova = xlwb.Sheets(1).UsedRange.Value
    aD = ThisWorkbook.Sheets(1).UsedRange.Value
    xlwb.Close False
    For k = 1 To UBound(aD)
        If ThisWorkbook.Sheets(1).Cells(k, 2) <> "" Then
            Set wordtext = GetObject(ThisWorkbook.Sheets(1).Cells(k, 2))
            wordtext.Windows(1).Visible = 1
            For i = 1 To UBound(aSlova)
                With wordtext.Range.Find
                    .ClearFormatting
                    .Text = aSlova(i, 1)
                    With .Replacement
                        .ClearFormatting
                        .Text = aSlova(i, 2)
                    End With
                    .Execute Replace:=wdReplaceAll
                End With
            Next i
        wordtext.SaveAs (ThisWorkbook.Sheets(1).Cells(2, 1)) & "" & Replace(wordtext.Name, (Split(wordtext.Name, ".")(UBound(Split(wordtext.Name, ".")))), "англ.яз.doc")
        wordtext.Close False
        End If
    Next k
End Sub



1



0 / 0 / 0

Регистрация: 06.11.2015

Сообщений: 7

23.01.2020, 11:58

 [ТС]

13

Aleksan7, спасибо огромное! Очень выручили.



0



Angry word helper

Возможно, у вас есть ощущение, что тема макросов в Ворде достаточно маргинальная. Кто ими может пользоваться-то вообще? Ну, малварь делают иногда… Да и пишутся они на давно забытом VBA (Visual Basic for Applications, он же несколько урезанный Visual Basic 6 в интерпретируемом виде), фу!

Но на самом деле у многих ведь возникает потребность то какой-нибудь отчётик в ворде написать, то курсовую оформить, то резюме перед отправкой в компанию вашей мечты подправить… А у некоторых работа напрямую связана с Word. Часто различные системы документации предлагают экспорт в форматы doc или docx, которые нужны вашим заказчикам. И бывает, что документы после экспорта выглядят фигово, приходится их исправлять.

Работа в ворде нередко подразумевает выполнение каких-то однообразных повторяющихся действий, которые иногда (но далеко не всегда!) решаются грамотной настройкой стилей и их применением, а также использованием шаблонов. Как же автоматизировать всё остальное? Тут-то нам на помощь приходят те самые макросы.

Что же в них такого хорошего? Ну, например, они автоматически и достаточно быстро выполняют за вас однообразные действия. Могут что-то подсчитать, переформатировать документ, пометить аннотациями подозрительные места, — словом, всё, что запрограммируете. Могут даже в режиме реального времени что-то исправлять и о чем-то предупреждать, пока вы пишете документ. VBA в Word позволяет автоматизировать практически все действия, которые вы можете выполнить с документом вручную.

Макросы можно прикрепить как к конкретному документу (в чём для нас мало пользы, а для писателей троянов это единственная опция), так и к самому ворду, что позволяет применять макросы к любому документу, с которым вы работаете.

Макросы работают в любой версии Word и требуют минимум правок при переносе с одной версии на другую (а чаще всего вообще не требуют). На макросах можно даже реализовать полноценный пользовательский интерфейс с формами!

Давайте же занырнём в Visual Basic и напишем что-нибудь полезное! В качестве первого примера я покажу, как сделать макрос, который заменит два и более последовательных перевода строки на единственный. Это часто требуется при исправлении документов после экспорта из систем документации, или если вы хотите удалить случайно проставленные лишние переводы строк в собственноручно написанном документе. Макрос сделаем добротный, с пользовательским интерфейсом и прогрессом выполнения операции.

Чтобы начать писать или использовать макросы, сначала требуется убедиться, что в Word’е отображается панель «Разработчик» («Developer»). Если она у вас не отображается, следует зайти после создания нового документа в меню «Файл» («File») -> «Параметры» («Options») -> «Настроить ленту» («Customize Ribbon»), после чего найти там и установить флажок «Разработчик» («Developer»).

Enable Word developer tab

После этого нужно зайти на вкладку «Разработчик» и выбрать меню «Visual Basic».

Word Visual Basic button

В открывшемся окне слева вы увидите два проекта: «Normal» и проект, относящийся к текущему открытому документу. Возможно, в проекте «Normal» у вас уже будет какой-то файл в каталоге «Modules». В любом случае, создайте новый модуль, кликнув правой кнопкой по проекту «Normal» и выбрав «Insert» -> «Module».

Word insert new module

Созданный модуль представляет из себя файл, куда мы и будем писать код макросов. Можно переименовать модуль (по умолчанию его имя будет «Module1») в окне «Properties» -> «Name». Я назову свой модуль «AllMacros». Теперь откроем код модуля, дважды кликнув по его имени, и приступим к созданию макроса. Напомню, что наша цель — заменить два и более последовательных перевода строки на единственный, произведя замены по всему документу. Очевидно, нам потребуется функция, которая осуществляет поиск по тексту, ведь мы хотим найти несколько последовательных переводов строки. В Word это эквивалентно началу нового параграфа. Вы могли бы осуществить поиск начала нового параграфа через обычное окно поиска, введя в поле поиска ^p, ^13 или ^013 (что соответствует ASCII-коду перевода строки). Функция поиска будет выглядеть так:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

Private Function FindNextText(text As String, useWildcards As Boolean)

    Selection.Find.ClearFormatting

    Selection.Find.Replacement.ClearFormatting

    With Selection.Find

        .Text = text

        .Forward = True

        .Format = False

        .MatchCase = False

        .MatchWholeWord = False

        .MatchKashida = False

        .MatchDiacritics = False

        .MatchAlefHamza = False

        .MatchControl = False

        .MatchWildcards = useWildcards

        .MatchSoundsLike = False

        .MatchAllWordForms = False

        .Wrap = wdFindStop

    End With

    Selection.Find.Execute

    FindNextText = Selection.Find.Found

End Function

Давайте разберём, что тут происходит. Мы объявляем функцию с двумя параметрами. Первый имеет тип String — это текст для поиска, а второй Boolean говорит о том, нужно ли использовать символы подстановки (wildcards). Про них я поговорю позже. В следующих двух строках 2 и 3 мы очищаем форматирование для строки поиска и строки замены, если оно было задано пользователем. Word позволяет задать форматирование строки поиска/замены, а для нашей задачи это не требуется. Далее мы задаём набор параметров для объекта Selection.Find: выставляем неинтересные нам параметры в False, параметр Text — это текст, который мы хотим найти, а параметр MatchWildcards указывает на использование символов подстановки. Параметр Wrap говорит о том, следует ли продолжать поиск, когда мы дошли до той точки, с которой поиск начали, и у нас его значение установлено в wdFindStop, так как мы хотим остановиться, когда дойдём до конца документа, и не зацикливать поиск.

Вообще, всё это обилие свойств и объектов из объектной модели Word, Excel и PowerPoint (да, там тоже есть макросы) хорошо описано в MSDN. Например, вот тут перечислены свойства и методы объекта Find. Есть русская документация (скажем, эта страница), но она выполнена совершенно кринжовым машинным переводом, невозможно читать:

Есть совершенно смехотворные страницы:

В общем, лучше читайте на английском. :D

Кроме того, все доступные объекты, их свойства и методы можно посмотреть прямо в редакторе VBA в самом Word’е. Для этого нужно нажать F2 или выбрать меню «View» -> «Object browser», что приведет к открытию браузера объектов (Object browser), в котором можно пролистать или поискать то, что вам доступно.

Word object browser

Но вернёмся к нашей функции. На строке 19 мы непосредственно выполняем поиск заданного текста с указанными параметрами. Строка 20 — эта конструкция, аналогичная return в си-подобных языках, указывает возвращаемое значение функции. Мы возвращаем булевое значение Selection.Find.Found, которое говорит о том, было ли что-то найдено.

Хочу заметить, что использование объекта Selection.Find и изменение его свойств заменит их значения и для пользователя. Например, если вы в Word искали что-то хитроумное с конкретно заданными параметрами, то выполнение макроса заменит ваши параметры поиска на те, которые мы задали в макросе. В идеале, их можно запомнить, а потом вернуть, но мы не будем так сильно заморачиваться, а просто всё за собой подчистим. Сделаем функцию, которая сбрасывает параметры в значения по умолчанию:

Private Sub ClearFindAndReplaceParameters()

    With Selection.Find

       .ClearFormatting

       .Replacement.ClearFormatting

       .Text = «»

       .Replacement.Text = «»

       .Forward = True

       .Wrap = wdFindStop

       .Format = False

       .MatchCase = False

       .MatchWholeWord = False

       .MatchWildcards = False

       .MatchSoundsLike = False

       .MatchAllWordForms = False

    End With

End Sub

Обратите внимание, что это уже Sub, а не Function, потому что мы не хотим из этой процедуры возвращать никакое значение. Это аналог функции void в си-подобных языках.

Теперь нужно определить, как нам найти два или более последовательных перевода строки. Для этого нам и потребуются упомянутые ранее wildcards. Word поддерживает символы подстановки при поиске, и по своей функциональности они напоминают регулярные выражения. Кстати, вы можете ими пользоваться и без макросов из окна расширенного поиска:

Word wildcards

Хорошее описание символов подстановки я нашел здесь, правда, на английском языке. Составим регулярное выражение для поиска двух и более последовательных переводов строки: [^013]{2,}. Это очень похоже на классическое регулярное выражение Perl или PCRE, но в квадратных скобках в уникальном стиле Word мы задаем символ перевода строки. Фигурные скобки указывают, что символов перевода подряд должно быть два или более. Тут, кстати, есть нюанс: не во всех версиях/локализациях Word такая регулярка заработает. В некоторых случаях вместо запятой потребуется указать точку с запятой (да, в Microsoft иногда делают крайне странные вещи). Чтобы сделать наш макрос более универсальным, напишем функцию, которая вернёт регулярное выражение, пригодное для поиска в той версии Word, в которой эту функцию запустили:

Private Function GetLineBreakSearchRegExp()

    On Error GoTo Err

    FindNextText «[^013]{2,}», True

    GetLineBreakSearchRegExp = «[^013]{2,}»

    Exit Function

Err:

    GetLineBreakSearchRegExp = «[^013]{2;}»

End Function

Здесь мы сначала пытаемся осуществить поиск с помощью wildcard’а [^013]{2,}. Если всё окей, то вернём из функции этот самый wildcard как рабочий (строка 4). В противном случае произойдёт ошибка, но мы готовы её обработать: мы установили обработчик всех ошибок в строке 2. Нас перекинет на метку Err, и тут мы вернём wildcard, который пригоден для других ревизий Word (в котором запятая внутри фигурных скобок заменена на точку с запятой).

Далее напишем функцию, которая будет заменять несколько последовательных переводов строки на единственный:

Private Sub RemoveNextEnters()

    Selection.MoveStart wdWord, 1

    If Selection.Range.Start <> Selection.Range.End Then Selection.Delete

End Sub

Эта функция подразумевает, что вызывать её будут тогда, когда объект Selection указывает на найденные несколько переводов строки. В строке 2 перемещаем начало выделения (а в выделены у нас будут все найденные последовательные переводы строки) на один символ вперед, а затем в строке 3, если начало выделения не совпадает с его концом, удаляем его содержимое. Таким образом, если было выделено три перевода строки, мы отступаем вперед на 1 символ (оставляя один перевод строки нетронутым), а затем удаляем оставшиеся два.

Осталось написать последнюю функцию, которая будет всем управлять.

Sub RemoveExcessiveEnters()

    Dim lineBreakSearchRegExp As String

    lineBreakSearchRegExp = GetLineBreakSearchRegExp()

    Selection.HomeKey Unit:=wdStory

    While FindNextText(lineBreakSearchRegExp, True) = True

        RemoveNextEnters

    Wend

    ClearFindAndReplaceParameters

End Sub

Здесь мы оперируем ранее написанными функциями. Сначала получаем текст регулярного выражения (wildcard’а) для поиска нескольких переводов строки подряд, затем вызовом HomeKey в строке 5 переходим в самое начало документа (перемещаем туда курсор), а затем в цикле ищем все интересующие нас места и удаляем излишние переводы строки. В конце сбрасываем параметры поиска на значения по умолчанию.

Finished word macro

Вот и всё, макрос можно запускать! Обратите внимание, что все функции, кроме последней, мы пометили Private. Мы не хотим, чтобы их вызывали напрямую. Доступной для вызова снаружи будет только функция RemoveExcessiveEnters. Перед запуском макроса стоит убедиться, что макросы включены. Если вылазит такая панель, то нужно нажать «Включить содержимое» («Enable content»):

Word enable content

Если такой панели нет, то можно зайти в меню «Файл» («File») -> «Сведения» («Info») и включить макросы уже оттуда:

Word enable content from info menu

Вы можете включить макросы на время одного сеанса Word (это по умолчанию и происходит, если нажимаете «Включить содержимое»), так что после перезапуска Word макросы снова будут отключены. Для запуска макроса возвращаемся в Word на панель «Разработчик» и нажимаем кнопку «Макросы» («Macros»), выбираем наш макрос RemoveExcessiveEnters и нажимаем «Выполнить» («Run»). Разумеется, у вас должен быть открыт какой-нибудь подопытный документ, где имеются лишние переводы строк. В качестве бонуса наш макрос ещё и удалит пустые элементы списков, потому что они представляют из себя точно такие же несколько переводов строки подряд.

Word macro: before and after

Макрос выполняется достаточно быстро. Его действие можно отменить (каждый шаг независимо), открыв меню выполненных действий:

Undo Word macro

Макросы можно отлаживать через окно VBA, в котором мы писали макрос. Кликнув слева от строки кода, можно, как и в других средах разработки, поставить точку останова, а потом запустить макрос кнопкой «Run». Запустится та функция, на которой у вас находится курсор. Если вы поставите курсор на функцию с параметрами, то появится обычный запрос на выбор макроса для запуска, как при нажатии на кнопку «Макросы» в Word.

Debug Word macros

Думаю, что материала для одной статьи уже вполне достаточно. Я, конечно, пообещал горы функционала в виде интерфейса пользователя, отслеживания прогресса выполнения, и всё это обязательно будет, но в следующей публикации.

Код макроса можно скачать тут. Вы сможете его импортировать к себе в Word, кликнув правой кнопкой на «Normal» -> «Import file…» и выбрав загруженный файл.

P.S. Кстати, рекомендую создавать бэкапы своих макросов, экспортируя их куда-нибудь на диск. Даже лицензионный Word имеет свойство их иногда по какой-то причине удалять из шаблона Normal, в котором мы их создавали.

Function Translit(ByVal txt As String) As String
    iRussian$ = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"
    iTranslit = Array("", "a", "b", "v", "g", "d", "e", "jo", "zh", "z", "i", "jj", "k", _
                      "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "h", "c", "ch", _
                      "sh", "zch", "''", "'y", "'", "eh", "ju", "ja")
    For iCount% = 1 To 33
        txt = Replace(txt, Mid(iRussian$, iCount%, 1), iTranslit(iCount%), , , vbTextCompare)
    Next
    Translit$ = txt
End Function

Sub ПримерИспользованияФункцииTranslit()
    txt = "проверка работы транслита"
    newtxt = Translit(txt) ' результат = строка "proverka rabot'y translita"
    MsgBox "Строка """ & txt & """" & vbNewLine & "преобразована в строку """ _
         & newtxt & """", vbInformation, "Результат обработки"
End Sub

Надстройку для транслитерации выделенного диапазона ячеек,
а также расширенную версию функции транслитерации, можно скачать в этой статье

(добавлено в связи с просьбой выполнить обратную транслитерацию)
К сожалению, процесс обратной транслитерации весьма затруднён (я бы даже сказал, что в общем случае невозможно сделать такую функцию, которая преобразовывала бы строку после транслитерации к исходному виду).

Попытаюсь объяснить, почему так происходит:
Допустим, в качестве исходной строки у нас будет текст «щзч схш жзх»

Sub ПримерИспользованияФункцииTranslit()
    txt = "щзч схш жзх"
    newtxt = Translit(txt)
    Debug.Print newtxt    ' результат = строка "zchzch shsh zhzh"

    MsgBox "Строка """ & txt & """" & vbNewLine & "преобразована в строку """ _
           & newtxt & """", vbInformation, "Результат обработки"
End Sub

И что же мы видим на выходе?
А вот что: «zchzch shsh zhzh»

Достаточно похожие сочетания букв, не правда ли?
И как теперь макросу определить, что означает сочетание «zch sh zh» — «щ сх ж» или «зч ш ж»?
Или, может, «зч сх зх»? Все варианты для макроса ведь равнозначны…

А сочетание «zhzh» следует перевести как «зхзх» или как «жж»?
То же самое касается некоторых других буквосочетаний.

Специально проверил транслитерацию подобных сочетаний на популярном сервисе http://www.translit.ru/
Результат — при обратном переводе на русский исходная строка изменилась: схш жзх —> shsh zhzh —> шш жж

Вывод: учитывая возможное количество неопределённостей, проще обратную транслитерацию выполнять вручную.


Другой вариант функции:

Function Translit(ByVal txt As String) As String        ' с учётом регистра символов
    txtRussian$ = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"
    arrTranslit = Array("", "a", "b", "v", "g", "d", "e", "e", "zh", "z", "i", "y", "k", _
                        "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "kh", "ts", "tch", _
                        "sh", "sch", "", "y", "", "e", "yu", "ya")
    For iCount% = 1 To 33
        txt$ = Replace(txt$, Mid(txtRussian$, iCount%, 1), arrTranslit(iCount%), , , vbBinaryCompare)      ' строчные
        txt$ = Replace(txt$, UCase(Mid(txtRussian$, iCount%, 1)), UCase(arrTranslit(iCount%)), , , vbBinaryCompare)     ' прописные
    Next
    Translit$ = txt$
End Function

Результат работы (другой набор символов для замены, учитывается регистр)

Исходная строка: «А-Б-В-Г-Д-Е-Ё-Ж-З-И-Й-К-Л-М-Н-О-П-Р-С-Т-У-Ф-Х-Ц-Ч-Ш-Щ-Ъ-Ы-Ь-Э-Ю-Я»
Итоговая строка: «A-B-V-G-D-E-E-ZH-Z-I-Y-K-L-M-N-O-P-R-S-T-U-F-KH-TS-TCH-SH-SCH—Y—E-YU-YA»

  • 53494 просмотра

Не получается применить макрос? Не удаётся изменить код под свои нужды?

Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.

Translator — макрос для переводчика

Translator — макрос для переводчика

Коллеги, здравствуйте.

Хотелось поделиться с вами еще одним небольшим, но весьма полезным инструментом, который может немного облегчить наш с вами труд.

Макрос, который я предлагаю вашему вниманию, встраивается в виде дополнительной панели в MS Word.

Translator умеет:
1. Собирать статистику для текущего документа Word из расчета 1800 знаков = 1 переводческая страница (в том числе подсчет статистики для «разбитых» фрагментов текста, т.е. фрагментов выделенных с зажатой клавишей Ctrl).
2. Осуществлять поиск оставшихся непереведенными фрагментов текста (поиск для текстов на русском и английском, транслитерация).
3. Замена запятых в числах на точки в формате английского языка (5,5 будет заменено на 5.5).

Но самое главное, т.к. я имею выход на разработчика макроса, важно ваше мнение по поводу возможных улучшений и доработки программы.

Скачать макрос Translator можно по этой ссылке

http://www.englishelp.ru/archives/soft/ … slator.zip

Получить более подробное описание со скриншотами можно здесь http://www.englishelp.ru/soft/soft-for-translator/92-translator-macro.html

LyuFi

 
Сообщения: 18
Зарегистрирован: Вт авг 26, 2008 16:16
  • Сайт


Re: Translator — макрос для переводчика

Сообщение Cowboy » Пн мар 23, 2009 13:39

А как заменить Points на Commas? То есть с английского на русский.
Или цифру без первого нолика: .123 на 0,123 ?

С печатью интеллекта под глазами… (R) Ольга Арефьева

Аватара пользователя
Cowboy

 
Сообщения: 1430
Зарегистрирован: Чт сен 08, 2005 10:40
Откуда: Казахстан, пос. Иргиз
Язык(-и): английский <> русский
  • Сайт
  • ICQ

Re: Translator — макрос для переводчика

Сообщение LyuFi » Пн мар 23, 2009 15:32

Cowboy писал(а):А как заменить Points на Commas? То есть с английского на русский.
Или цифру без первого нолика: .123 на 0,123 ?

Наличие данной функциональности обсуждалось некоторое время, но потом было решено не включать ее в макрос.
Причина в том, что часто для нумерации разделов люди не используют функцию автоматической нумерации Word, а попросту пишут «3.1 Глава о чем-то». В таком случае будет больше проблем, чем пользы от макроса, который глобально заменит «3.1 Глава о чем-то» на «3,1 Глава о чем-то».

В обозримом будущем планируется добавить функцию глобальной замены кавычек в формате «текст» на «текст» (для русско-английских переводов) и наборот (для англо-русских).

LyuFi

 
Сообщения: 18
Зарегистрирован: Вт авг 26, 2008 16:16
  • Сайт

Re: Translator — макрос для переводчика

Сообщение LyuFi » Вт май 26, 2009 22:13

В макрос Translator http://www.englishelp.ru/soft/soft-for-translator/92-translator-macro.html была добавлена небольшая, но полезная функциональность — Замена обычных пробелов между значением и единицей измерения на неразрывный пробел (пожелание многих заказчиков).
Поддерживается ~351 названий единиц измерения на английском языке и 205 названий единиц измерения на русском языке. Единицы измерения системы СИ. Если вы захотите использовать функциональность и в процессе работы обнаружите какие-либо единицы, для которых замена не была выполнена, то можете писать прямо сюда или на адрес adminСОБАЧКАenglishelp.ru, всё обязательно исправят.

Также были исправлены незначительные ошибки и несколько оптимизирована скорость работы макроса.

Скачать макрос Translator v1.1 http://www.englishelp.ru/archives/soft/translator/Translator.zip

LyuFi

 
Сообщения: 18
Зарегистрирован: Вт авг 26, 2008 16:16
  • Сайт

Re: Translator — макрос для переводчика

Сообщение Ronny » Вс июл 05, 2009 10:24

Скажите, а планируется дальнейшее развитие этого набора макросов? У меня, например, есть много часто повторяющихся действий над текстом, но которые не автоматизировать простой записью (record) макроса в Word, нужно минимально знать Visual Basic. Можно ли, скажем, сделать заказную версию вашего макроса (с разумной оплатой, конечно :lol:)?

Аватара пользователя
Ronny

 
Сообщения: 123
Зарегистрирован: Пт сен 21, 2007 14:11
Язык(-и): eng-rus
  • Сайт
  • ICQ

Re: Translator — макрос для переводчика

Сообщение LyuFi » Вс июл 05, 2009 15:34

Ronny писал(а):Скажите, а планируется дальнейшее развитие этого набора макросов? У меня, например, есть много часто повторяющихся действий над текстом, но которые не автоматизировать простой записью (record) макроса в Word, нужно минимально знать Visual Basic. Можно ли, скажем, сделать заказную версию вашего макроса (с разумной оплатой, конечно :lol:)?

Большое спасибо за положительный отзыв и внимание к программе! Любые ваши предложения только приветствуются. Пишите ваши идеи здесь или письмом на adminСОБАЧКАenglishelp.ru.

Если есть желание, то с радостью примем любые пожертвования на кошелек yandex-деньги 41001239288240. Все средства пойдут на оплату хостинга сайта http://www.englishelp.ru. Заранее спасибо :wink:

LyuFi

 
Сообщения: 18
Зарегистрирован: Вт авг 26, 2008 16:16
  • Сайт

Re: Translator — макрос для переводчика

Сообщение Ronny » Ср июл 08, 2009 17:20

О нужных мне макросах отписал в ПМ.

Аватара пользователя
Ronny

 
Сообщения: 123
Зарегистрирован: Пт сен 21, 2007 14:11
Язык(-и): eng-rus
  • Сайт
  • ICQ

Re: Translator — макрос для переводчика

Сообщение LyuFi » Пт сен 11, 2009 00:25

Добавлены некоторые улучшения в версии макроса Translator 1.5.

1. Изменен подсчет статистики, теперь, кроме переводческих страниц, посчитать можно следующее:
Изображение

2. Добавлена небольшая функция — «Вставить текст без форматирования». По нажатии кнопки на панели макроса или сочетания клавиш Shift+Ins текст из буфера обмена вставляется как plain text:
Изображение

3. Добавлена небольшая функция — «Поиск термина в Google». Выделенное слово или словосочетание в документе Word, при нажатии соответствующей кнопки на панели макроса или сочетания клавиш Alt+Ctrl+G, отправляется в виде поискового запроса в Google:
Изображение

Скачать обновленную версию макроса Translator 1.5 вы сможете по ссылке: http://www.englishelp.ru/soft/soft-for-translator/92-translator-macro.html

LyuFi

 
Сообщения: 18
Зарегистрирован: Вт авг 26, 2008 16:16
  • Сайт

Re: Translator — макрос для переводчика

Сообщение LyuFi » Пн окт 05, 2009 16:48

Добавлена новая функциональность в макрос Translator — Форматирование английских заголовков (применение заглавных букв в заголовках).
Изображение
Все заголовки в тексте на английском языке приводятся к «правильному виду» (первые буквы слов переводятся в верхний регистр, правила, по которым работает данная функциональность макроса, приведены по следующей ссылке http://www.englishelp.ru/learn-english/articles-for-learners/238-title-capitalization.html — Английские заголовки. Заглавные буквы). Таким образом, после применения данной функции макроса к выделенному тексту заголовок, к примеру, вида «This is just a title» будет преобразован в «This Is Just a Title». Для начала обработки заголовков нажмите соответствующую кнопку на панели или сочетание горячих клавиш Alt+Ctrl+T.

Скачать обновленную версию макроса Translator 1.5.1 вы сможете по ссылке: http://www.englishelp.ru/soft/soft-for-translator/92-translator-macro.html

LyuFi

 
Сообщения: 18
Зарегистрирован: Вт авг 26, 2008 16:16
  • Сайт

Re: Translator — макрос для переводчика

Сообщение Руст » Чт окт 08, 2009 12:32

Спасибо за ваш труд, макросом частенько пользуюсь.

Переводчиком нужно или быть или не быть вообще! ©

Аватара пользователя
Руст

 
Сообщения: 722
Зарегистрирован: Вт авг 30, 2005 10:54
Язык(-и): Английский — русский
  • Сайт

Re: Translator — макрос для переводчика

Сообщение medvedeff » Чт окт 08, 2009 13:37

Было бы здорово, если бы при сборе статистики макрос исправлял недостатки Word , т.е. считал бы текст в текстовых врезках (text box), колонтитулах и т.п., а также учитывал знаки переноса строки. Отдельные примеры кода для этого есть и на этом форуме, например, здесь:

viewtopic.php?f=11&t=10539&start=0

Аватара пользователя
medvedeff

 
Сообщения: 7
Зарегистрирован: Пн окт 05, 2009 08:47
Откуда: Европа
Блог: Просмотр блога (2)

Re: Translator — макрос для переводчика

Сообщение LyuFi » Пн окт 12, 2009 23:08

Руст писал(а):Спасибо за ваш труд, макросом частенько пользуюсь.

Руст, спасибо вам за положительный отзыв! Приятно осознавать, что результат затраченных усилий востребован.

medvedeff писал(а):Было бы здорово, если бы при сборе статистики макрос исправлял недостатки Word , т.е. считал бы текст в текстовых врезках (text box), колонтитулах и т.п., а также учитывал знаки переноса строки. Отдельные примеры кода для этого есть и на этом форуме, например, здесь:

http://trworkshop.net/forum/viewtopic.p … 39&start=0

Функция подсчета статистики была переработана, результатом стало следующее:
Изображение

Скачать обновленную версию макроса Translator 1.6.0 по-прежнему можно по ссылке: http://www.englishelp.ru/soft/soft-for-translator/92-translator-macro.html

Макрос пока не считает статистику для текста, помещенного в text boxes, которые, в свою очередь, помещены в колонтитулы.

LyuFi

 
Сообщения: 18
Зарегистрирован: Вт авг 26, 2008 16:16
  • Сайт

Re: Translator — макрос для переводчика

Сообщение LyuFi » Вс ноя 29, 2009 15:59

Доброго здравия, коллеги!

Очередное обновление макроса Translator.
Во-первых, было много исправлений в макросах Подсчет статистики и Форматирование английских заголовков, если вы пользуетесь этими макросами, то желательно обновиться.

Также добавлена новая функция извлечения текста из текстовых блоков Word (Shapes, TextBoxes и т.п.)
Изображение
Функция Извлечение текста из текстовых блоков Word. Откройте документ Word, содержащий текстовые блоки, нажмите кнопку Extract Text from Shapes на панели Translator. После этого будет создан еще один файл Word, содержащий весь текст, извлеченный из текстовых блоков.

Когда это м.б. полезно? На практике случается переводить файлы, содержащие большое количество изображений с текстом внутри, переводить их с помощью системы CAT становится трудоемкой работой. После извлечения всего текста из текстовых блоков в отдельный файл, переводить становится гораздо проще. После завершения перевода, претранслируем исходный файл, содержащий текстовые блоки и всё. Разумеется, могут возникнуть проблемы с корректурой претранслированного содержимого текстовых блоков, но, в зависимости от объема документа, прирост производительности все равно значительный.

Скачать обновленную версию макроса Translator 1.6.5, можно по ссылке — http://www.englishelp.ru/archives/soft/translator/Translator.zip.

Желаю удачи!

LyuFi

 
Сообщения: 18
Зарегистрирован: Вт авг 26, 2008 16:16
  • Сайт


Вернуться в Полезное программное обеспечение. Аллея Бродяги

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

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

Макрос-переводчик

Обучим немецкому

языку по методу гестапо.

Работающие в иностранных компаниях сотрудники часто вынуждены готовить по два одинаковых отчета для отечественного и зарубежного своего начальства — на русском и английском языках. Цифры в этих отчетах, естественно, одинаковые, а меняются только подписи, заголовки и другой текст.

Такую задачу можно решить более изящно. Создаем новый лист в таком отчете и называем его «Словарь«. Выписываем на этот лист в любом порядке все слова, которые надо автоматически переводить. Для каждого языка добавляем новый столбец, например, так:

translater1.gif

Потом переходим в редактор Visual Basic (меню Сервис — Макрос — Редактор Visual Basic), вставляем новый модуль (меню Insert — Module) и копируем туда текст вот этих двух макросов:

Sub Translate()
Dim cell1 as Range, cell2 As Range
Dim i as Long, Langs As Long 

Langs = 3 'количество языков перевода, включая русский

    For Each cell1 In ActiveSheet.Cells.SpecialCells(xlCellTypeConstants)
        For Each cell2 In Worksheets("Словарь").Cells.SpecialCells(xlCellTypeConstants)
            If cell1.Value = cell2.Value Then
                i = cell2.Column
                If i = Langs Then i = 1 Else i = i + 1
                cell1.Value = Worksheets("Словарь").Cells(cell2.Row, i).Value
                GoTo 1
            End If
        Next cell2
1:   Next cell1

End Sub

Теперь можно вернуться на лист с отчетом и запустить макрос Translate через меню Сервис — Макрос — Макросы (Tools — Macro — Macros) или нажав ALT+F8. Все слова из вашего отчета, найденные в на листе Словарь, будут заменены на слова из соседней колонки, т.е. переведены на другой язык. Запуская макрос несколько раз, мы будем по кругу переводить наш отчет последовательно на русский-английский-немецкий-русский-английский-и т.д. Выглядеть это будет так:

translater2.gif

Praktisch, nicht wahr? :)

Ссылки по теме

  • Что такое макросы, куда вставлять код макроса на VBA, как их использовать
  • Преобразование русского текста в транслит

Я пытаюсь разработать макрос для автоматического перевода текста на другой язык в Word. Макрос выбирает весь текст и отправляет его глубоко, открывая IE и предоставляя перевод.

Я хочу попытаться получить текст перевода без копирования и вставки. Для этого у меня есть:

function (text2translate,langOrigin,langEnd)
...
Set IEapp = CreateObject("InternetExplorer.Application") 'Set IEapp =InternetExplorer
myAddress = "https://www.deepl.com/translator#" & langOrigin & "/" & langEnd & "/"
myAddress = myAddress & text2translate
WebUrl = myAddress
    With IEapp
        .Silent = True 'No Pop-ups
        .Visible = True 'Set InternetExplorer to Visible
        .Navigate WebUrl 'Load web page

        'Run and Wait, if you intend on passing variables at a later stage
        Do While .Busy
            DoEvents
        Loop

        Do While .ReadyState <> 4
            DoEvents
        Loop
        Set myHTML = .Document
    End With
...
end function

Все идет нормально. Передает текст в новое открытое окно IE. Теперь я могу копировать и вставлять.

Теперь я хотел бы пропустить эту последнюю копию и вставить и получить перевод, непосредственно вставленный в word (или excel) в определенном месте. Первое, что мне нужно сделать, это добавить перевод к переменной. Что я не могу сделать.

Я пытаюсь:

theData = myHTML.getElementsByClassName("lmt__textarea lmt__target_textarea lmt__textarea_base_style dl_disabled")
    Dim mystring As String
    mystring = theData.innerText
    MsgBox mystring

Поскольку, согласно обозревателю разработчика Firefox, это имя элемента класса, в который встроен перевод. Тем не менее, текст перевода не отображается в HTML-коде. Что странно. Как я могу увидеть что-то в моем браузере, если это не является частью HTML-кода?

В любом случае последняя часть не работает.

Некоторые идеи?

Благодарю.

Обновление 1: После хорошего ответа от @Andy похоже, что getElementsByClassName возвращает коллекцию, и мне нужно пройти через эту коллекцию.

Dim element As Variant
For Each element In theData
    myString = myString & element.innerText
Next

Я получаю сообщение об ошибке: «Объект, необходимый для каждого элемента в данных». Почему? Спасибо 2

2 ответа

Лучший ответ

Вот код для excel vba. вам не нужен DeepL.com, когда вы можете использовать Google :)

Option Explicit

#If Win64 Then '64?
    Private Declare PtrSafe Function MsgBoxTimeout _
        Lib "user32" _
        Alias "MessageBoxTimeoutA" ( _
            ByVal hwnd As LongPtr, _
            ByVal lpText As String, _
            ByVal lpCaption As String, _
            ByVal wType As VbMsgBoxStyle, _
            ByVal wlange As Long, _
            ByVal dwTimeout As Long) _
    As Long
#Else
    Private Declare Function MsgBoxTimeout _
        Lib "user32" _
        Alias "MessageBoxTimeoutA" ( _
            ByVal hwnd As Long, _
            ByVal lpText As String, _
            ByVal lpCaption As String, _
            ByVal wType As VbMsgBoxStyle, _
            ByVal wlange As Long, _
            ByVal dwTimeout As Long) _
    As Long
#End If

Public Sub Translate_Selection()
Dim IE As InternetExplorer
Dim URL As String
Dim Content As String
Dim SelectedRange As Range
Dim cel As Range
Dim celVal As String
Dim cmt As String
Dim ScriptEngine As ScriptControl
Set ScriptEngine = New ScriptControl

Call MsgBoxTimeout(0, "Please Wait for next pop-up message. Translation of selected range is in Progress.", "Translation In Progress", vbInformation, 0, 4000)

ScriptEngine.Language = "JScript"

ScriptEngine.AddCode "function encode(str) {return encodeURIComponent(str);}"
ScriptEngine.AddCode "function decode(str) {return decodeURIComponent(str);}"

Set SelectedRange = Application.Selection

    For Each cel In SelectedRange.Cells

        cel.Replace Chr(160), " ", xlPart

        cel.Value = Trim(Application.WorksheetFunction.Clean(cel.Value))
        Content = ""
        If cel.Value <> "" And cel.Value <> " " And cel.Value <> Empty Then
            Content = ScriptEngine.Run("encode", cel.Value)
            URL = "https://translate.google.com/#auto/en/" & Content
            'MsgBox URL
            Set IE = New InternetExplorer
            IE.Visible = False
            IE.Navigate URL
            Do Until IE.ReadyState = 4
                DoEvents
            Loop
            Application.Wait (Now + TimeValue("0:00:3"))
            Do Until IE.ReadyState = 4
                DoEvents
            Loop

            If Content <> "" And Content <> " " And IE.Document.getElementsByClassName("tlid-translation translation")(0).innerText <> "" Then
                Content = IE.Document.getElementsByClassName("tlid-translation translation")(0).innerText
                cel.Value = ScriptEngine.Run("decode", Content)
            End If
            IE.Quit
            Set IE = Nothing
        End If
        cmt = ""
        If Not cel.Comment Is Nothing Then
            cmt = ScriptEngine.Run("encode", cel.Comment.Text)
            URL = "https://translate.google.com/#auto/en/" & cmt
            Set IE = New InternetExplorer
            IE.Visible = False
            IE.Navigate URL
            Do Until IE.ReadyState = 4
                DoEvents
            Loop
            Application.Wait (Now + TimeValue("0:00:3"))
            Do Until IE.ReadyState = 4
                DoEvents
            Loop
            If cmt <> "" And cmt <> " " And IE.Document.getElementsByClassName("tlid-translation translation")(0).innerText <> "" Then
                cmt = ScriptEngine.Run("decode", IE.Document.getElementsByClassName("tlid-translation translation")(0).innerText)
                With cel
                    .ClearComments
                    .AddComment
                    .Comment.Text Text:=cmt
                End With
            End If
            IE.Quit
            Set IE = Nothing
        End If
    Next cel
    Call MsgBoxTimeout(0, "Done...", "Task Completed", vbInformation, 0, 2000)
End Sub
Public Sub Translate_Page()
    Dim IE As InternetExplorer
    Dim URL As String
    Dim Content As String
    Dim LastCol As Long
    Dim LastRow As Long
    Dim yLooper As Long
    Dim xLooper As Long
    Dim cmt As String
    Dim ScriptEngine As ScriptControl
    Set ScriptEngine = New ScriptControl




    ScriptEngine.Language = "JScript"

    ScriptEngine.AddCode "function encode(str) {return encodeURIComponent(str);}"
    ScriptEngine.AddCode "function decode(str) {return decodeURIComponent(str);}"

    With Application.ActiveSheet
        LastRow = .UsedRange.Rows.Count
        LastCol = .UsedRange.Columns.Count

    Call MsgBoxTimeout(0, "Please Wait for Next Pop-Up message. Translation of entire page is in progress. It will take approx." & (LastRow * LastCol * 3) / 60 & " minutes.", "Translation In Progress", vbInformation, 0, 8000)


        For yLooper = 1 To LastRow

            LastCol = .Cells(yLooper, Columns.Count).End(xlToLeft).Column
            For xLooper = 1 To LastCol
                .Cells(yLooper, xLooper).Replace Chr(160), " ", xlPart
                .Cells(yLooper, xLooper).Value = Trim(Application.WorksheetFunction.Clean(Cells(yLooper, xLooper).Value))
                .Cells(yLooper, xLooper).Select
                Content = ""
                If .Cells(yLooper, xLooper).Value <> "" And .Cells(yLooper, xLooper).Value <> " " And .Cells(yLooper, xLooper).Value <> Empty Then
                    Content = ScriptEngine.Run("encode", .Cells(yLooper, xLooper).Value)
                    URL = "https://translate.google.com/#auto/en/" & Content
                    Set IE = New InternetExplorer
                    IE.Visible = False
                    IE.Navigate URL
                    Do Until IE.ReadyState = 4
                        DoEvents
                    Loop
                    Application.Wait (Now + TimeValue("0:00:3"))
                    Do Until IE.ReadyState = 4
                        DoEvents
                    Loop
                    If Content <> "" And Content <> " " And IE.Document.getElementsByClassName("tlid-translation translation")(0).innerText <> "" Then
                        Content = IE.Document.getElementsByClassName("tlid-translation translation")(0).innerText
                        .Cells(yLooper, xLooper).Value = ScriptEngine.Run("decode", Content)

                    End If

                    IE.Quit
                    Set IE = Nothing
                End If

                cmt = ""
                If Not .Cells(yLooper, xLooper).Comment Is Nothing Then
                    cmt = ScriptEngine.Run("encode", .Cells(yLooper, xLooper).Comment.Text)
                    URL = "https://translate.google.com/#auto/en/" & cmt
                    Set IE = New InternetExplorer
                    IE.Visible = False
                    IE.Navigate URL
                    Do Until IE.ReadyState = 4
                        DoEvents
                    Loop
                    Application.Wait (Now + TimeValue("0:00:3"))
                    Do Until IE.ReadyState = 4
                        DoEvents
                    Loop
                    If cmt <> "" And cmt <> " " And IE.Document.getElementsByClassName("tlid-translation translation")(0).innerText Then
                        cmt = ScriptEngine.Run("decode", IE.Document.getElementsByClassName("tlid-translation translation")(0).innerText)
                        With .Cells(yLooper, xLooper)
                            .ClearComments
                            .AddComment
                            .Comment.Text Text:=cmt
                        End With
                    End If

                    IE.Quit
                    Set IE = Nothing
                End If

            Next xLooper
        Next yLooper


    End With

    Call MsgBoxTimeout(0, "Done...", "Task Completed", vbInformation, 0, 2000)

End Sub


0

Vishal
13 Июн 2019 в 13:16

Ты можешь попробовать:

' add data to input box
myHTML.getElementsbyClassName("lmt__textarea lmt__source_textarea lmt__textarea_base_style")(0).Value = "que paso"

' wait for answer
Do While IE.ReadyState <> 4 Or IE.Busy
    DoEvents
    Application.Wait Now + TimeValue("00:00:01")
Loop

' get answer
Set myHTML = IE.Document ' always reset .document after a change
theData = myHTML.getElementsByClassName("lmt__textarea lmt__target_textarea lmt__textarea_base_style")(0).innerText

(0) в конце коллекции указывает, что вам нужен первый элемент в коллекции.

Также не забывайте сбрасывать myHTML = IE.Document каждый раз при изменении окна

Я также просмотрел HTML-код в моем браузере Internet Explorer (не спрашивайте, почему я использую IE) и получил указанные выше строки для имен классов.


0

Kubie
2 Окт 2018 в 14:34

На форуме Microsoft был задан вопрос:

Необходимо в тексте Word введенное число преобразовать в текст на русском.

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

Но если вам нужно преобразовать уже введенное число, то здесь может помочь следующий макрос (ниже).

В коде макроса используется формула с ключом CardText. Но у этого ключа есть ограничение — максимальное число не может быть больше 999.999 (см. заметку

Ключ CardText и его ограничения

). Поэтому автор макроса идет на хитрость и объединяет поля.

Но в английском языке нет склонений и результат для преобразованного числа получается правильным для чисел свыше 1.000.000 — используется слово «million». В русском языке итоговый результат будет выглядеть не очень красиво. Поэтому я чуть-чуть подредактировал макрос, заменив слово «million» на «миллион(а/ов)». Тоже не совсем нормально но, по крайней мере, не так режет глаз грамматической неправильностью.

Sub BigCardText()
'преобразование целого числа в текстовый эквивалент
'источник - http://wordtips.vitalnews.com/
Dim sDigits As String
Dim sBigStuff As String
sBigStuff = ""
' Select the full number in which the insertion point is located
Selection.MoveLeft Unit:=wdWord, Count:=1, Extend:=wdMove
Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend
' Store the digits in a variable
sDigits = Trim(Selection.Text)
If Val(sDigits) > 999999 Then
    If Val(sDigits) <= 999999999 Then
        sBigStuff = CStr(Val(sDigits)  1000000)
        ' Create a field containing the big digits and
        ' the cardtext format flag
        Selection.Fields.Add Range:=Selection.Range, _
          Type:=wdFieldEmpty, Text:="= " + sBigStuff + " * CardText", _
          PreserveFormatting:=True
        ' Select the field and copy it
        Selection.MoveLeft Unit:=wdWord, Count:=1, Extend:=wdExtend
        sBigStuff = Selection.Text & " миллион(а/ов) "
        sDigits = Right(sDigits, 6)
    End If
End If
If Val(sDigits) <= 999999 Then
    ' Create a field containing the digits and the cardtext format flag
    Selection.Fields.Add Range:=Selection.Range, _
      Type:=wdFieldEmpty, Text:="= " + sDigits + " * CardText", _
      PreserveFormatting:=True
    ' Select the field and copy it
    Selection.MoveLeft Unit:=wdWord, Count:=1, Extend:=wdExtend
    sDigits = sBigStuff & Selection.Text
    ' Now put the words in the document
    Selection.TypeText Text:=sDigits
    Selection.TypeText Text:=" "
Else
    MsgBox "Число слишком большое для преобразования", vbOKOnly
End If
End Sub

Если вы не знаете, как подключить к документу и применить этот макрос, изучите следующие заметки с сайта:

Создание макроса из готового кода

Автоматическая запись макроса

Понравилась статья? Поделить с друзьями:
  • Word макрос для выделенного текста
  • Word макрос для всех документов
  • Word макрос горячая клавиша
  • Word макрос выделить текст
  • Word макрос выделение текста