Статьи из блога
Макрос преобразования числа в текст
На форуме Microsoft был задан вопрос:
Необходимо в тексте Word введенное число преобразовать в текст на русском.
Для того, чтобы преобразовать некое число в текстовый формат, вы можете воспользоваться специальными программами, о которых я писал в заметке
Но если вам нужно преобразовать уже введенное число, то здесь может помочь следующий макрос (ниже).
Но в английском языке нет склонений и результат для преобразованного числа получается правильным для чисел свыше 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
Если вы не знаете, как подключить к документу и применить этот макрос, изучите следующие заметки с сайта:
Метки: ключи поля | макросы | поля | число прописью
Просмотров: 47509
Подписаться на комментарии по RSS
Версия для печати
Еще записи по вопросам использования Microsoft Word:
- 10 вопросов и ответов по редактору Word (1 часть)
- 3 способа очистки списка недавно открытых документов
- Word 2007: добавляем свою вкладку и свои команды
- Word 2007: полотно, рисунки, линии
- Word 2007: смена формата сохранения файла
- Word 97 - решение проблемы с отображением символов на линейке
- Абзац с цветным фоном
- Автоматизация текстового набора в Word
- Автоматическая запись макроса
- Автоматическая нумерация билетов
- Автоматическая расстановка переносов
- Автоматическое обновление полей при открытии документа
- Автоматическое сохранение документа при его закрытии
- Автотекст с последовательной нумерацией
- Белый текст на синем фоне в Word 2007
- Быстрая смена ориентации страниц документа
- Быстрое перемещение между открытыми документами Word
- Быстрое создание нового документа на основе шаблона
- Быстрый ввод текста с помощью команды =rand()
- Ввод повторяющихся фрагментов текста в Word 2007
- Ввод часто повторяющихся фрагментов текста
- Вертикальное выравнивание текста
- Возможно ли запретить копирование текста из документа Word?
- Вопрос о работе с графиками (диаграммами) в Word
- Вопросы и ответы о гиперссылках в редакторе Word
Комментариев: 15
Посмотрим макрос дома, придумаем, чтобы было полностью грамматически правильно
Александр, приветствую.
Придумать можно и есть решения для этого (перед публикацией заметки я анализировал страницы, найденные в сети по этой теме). Но решения слишком громоздкие и используют функции. Я просто не люблю больших макросов.
Но в любом случае буду благодарен, если скините в комментарий подходящий код.
Ну вот, Антон, я попытался. Вроде бы работает. По крайней мере я не сумел подобрать «плохое» число. Пришлось писать функцию, но без нее получилось бы еще хуже, менее читабельно. А так, я надеюсь, все понятно.
Александр, спасибо - работает. Там была опечатка в коде - не хватало знака "больше" в строке
Поправил.
Немаловажный момент - чтобы результат преобразования гарантированно был на русском языке, необходимо заранее убедиться, что выделяемое число воспринимается Word'ом как русский текст:
Сервис - Язык - Выбрать язык - Пометить выделенный текст как: "Русский"
Если результат преобразования должен быть всегда по-русски, то эту процедуру лучше ввести в сам макрос
Самой полезной оказалась макрос-прога Untaco (http://orlovs.pp.ru/soft.php).
1. Удобно (установил и забыл в видел панели в Word).
2. Работоспосбно
3. Имеется расчет НДС
4. Кое-что ещё настраивается.
Рекомендую!
а как сделать так: пишем число 100, через код полей в скобках должно появиться это число прописью. Затем када будем менять число, пропись тоже должна изменяться...воть
но все это надо сделать не применяя VBA
Пишем число. Помещаем его в закладку, скажем с именем MyNumber. После этого вставляем поле с таким содержимым:
{= MyNumber \*CardText}
Теперь при изменении содержимого закладки будет и изменяться содержимое поля
Делала все как вы написали, но не оплучилось(
Вместо числа 100 код полей выдает ноль.
Что же делать?
Число точно находится в закладке?
добавив проверку "на число" и подкорректировав вышеизложенную функцию получилось:
Есть макрос по преобразованию сумм в текст, с дополнительными данными (рубли, доллары, евро). Есть проблема, ноль не пишет.
Word(1, 1) = "од": Word(2, 1) = "десять": Word(3, 1) = "сто"
Word(1, 2) = "дв": Word(2, 2) = "двадцать": Word(3, 2) = "двести"
Word(1, 3) = "три": Word(2, 3) = "òðèäöàòü": Word(3, 3) = "òðèñòà"
Word(1, 4) = "÷åòûðå": Word(2, 4) = "ñîðîê": Word(3, 4) = "÷åòûðåñòà"
Word(1, 5) = "ïÿòü": Word(2, 5) = "ïÿòüäåñÿò": Word(3, 5) = "ïÿòüñîò"
Word(1, 6) = "øåñòü": Word(2, 6) = "øåñòüäåñÿò": Word(3, 6) = "øåñòüñîò"
Word(1, 7) = "ñåìü": Word(2, 7) = "ñåìüäåñÿò": Word(3, 7) = "ñåìüñîò"
Word(1, 8) = "âîñåìü": Word(2, 8) = "âîñåìüäåñÿò": Word(3, 8) = "âîñåìüñîò"
Word(1, 9) = "äåâÿòü": Word(2, 9) = "äåâÿíîñòî": Word(3, 9) = "äåâÿòüñîò"
в результате не пишет "ноль рублей (долларов)00 копеек (центов)", а по нормам заполнения это необходимо.
В итоге добавил:
Word(1, 0) = "ноль"
на цифру 0,00 пишет "ноль рублей (долларов)00 копеек (центов)", а на цыфру 1780 пишет "одна тысяча восемьдесят ноль рублей (долларов)00 копеек (центов)"
ХЭЛП
Василий, проблема - это ведь неразрешимое(пока) противоречие. В поисках "0" вы прибегли к логической хитрости, поставив под сомнение и "правду и лож" (1, 0 = "ноль"). У вас возникла проблема несоответствия. Это, что-то вроде замка и ключа: ситуация - это замок, а ваше состояние - ключ от этого замка. А у вас получилось "Есть одно, а пишется совсем другое".
А не подскажите как автоматизировать Word так, чтобы он сам при обновлении полей, выводил число, помеченное в тексте закладкой - прописью. В принципе CardText меня устраивало, пока числа большие не пошли.
Всё замечательно.
А можно ли в Worde сделать так же как в Exel, т.е. есть форма с ячейками например Расходный кассовый ордер в одной ячейке вбиваем цифрами в другой ячейке сразу преобразовывается в текст?