ник: belvesta
Помогите пожалуйста с написанием модуля "Суммы прописью"
Если число нужно брать из Запроса, поле Itog.
Укажите пожалуйста на ошибки в написании модуля, так как при открытии он запрашивает число и потом его же - число, а не текст, вставляет в отчет.
Причем запрашивает так - "str"
Вот модуль:
Option Compare Database ' только для Access
'
' Функции для вычисления суммы прописью
' по числовому значению от 0 до 999999999999
'
' Вспомогательные переменные
Dim Тысячи, Миллионы As Boolean
Dim Миллиарды, ВторойДесяток As Boolean
' Массив составных частей
Dim Часть(32) As String
' Логические константы
Const Истина As Boolean = True
Const Ложь As Boolean = False
Function CapitalizeFirst(Str)
' Переводит первую букву в поле на верхний регистр;
' оставляет остальные символы не измененными.
Dim strTemp As String
strTemp = Trim(Str)
CapitalizeFirst = UCase(Left(strTemp, 1)) & Mid(strTemp, 2)
End Function
' Функция возвращает сумму прописью
Function СуммаПрописью(Itog)
On Error Resume Next
' Вызов функции для получения числа прописью
СуммаПрописью = ЧислоПрописью(Itog)
' Строку с заглавной буквы
СуммаПрописью = UCase(Mid(СуммаПрописью, 1, 1)) + Mid(СуммаПрописью, 2)
' Вычислить длину исходного числа
Длина = Len(Itog)
' Если число только из одной цифры, добавить
' до двух (для единообразия алгоритма)
If Длина = 1 Then
Itog = "0" + Itog
Длина = Длина + 1
End If
' Добавление нужного окончания строки
'
' Для чисел, окончивающихся на 10, 11, 12, 13,
' 14, 15, 16, 17, 18, 19 добавляем "рублей"
If Mid(Itog, Длина - 1, 1) = 1 Then
СуммаПрописью = СуммаПрописью + " рублей"
' Для всех остальных случаев
Else
Select Case CLng(Mid(Itog, Длина))
' Для чисел, оканчивающихся на 1, добавляем "рубль"
Case 1
СуммаПрописью = СуммаПрописью + " рубль"
' Для чисел, оканчивающихся на 2, 3, 4 добавляем "рубля"
Case 2, 3, 4
СуммаПрописью = СуммаПрописью + " рубля"
' Для чисел, оканчивающихся на 5, 6, 7, 8, 9, 0 добавляем "рублей"
Case Else
СуммаПрописью = СуммаПрописью + " рублей"
End Select
End If
' Окончательно формируем результат
СуммаПрописью = СуммаПрописью + " "
End Function
'
' функция возвращает число прописью
'
Function ЧислоПрописью(Itog)
On Error GoTo Met1
' Присвоение значений массиву частей
Часть(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) = ""
Часть(29) = "десят": Часть(30) = "ста"
Часть(31) = "миллиард": Часть(32) = "ноль"
' Временные переменные вначале сбрасываются
Тысячи = Ложь: Миллионы = Ложь
Миллиарды = Ложь: ВторойДесяток = Ложь
' Определяем длину исходного числа
Длина = Len(Itog)
' Цикл по всем цифрам числа, начиная с крайней
' левой до крвйней правой
For Позиция = Длина To 1 Step -1
' Добавляются очередные слова, описывающие
' текущую цифру
ЧислоПрописью = ЧислоПрописью + ЦифраСтрокой(Mid(Itog, Длина - Позиция + 1, 1), Позиция)
Next Позиция
' Алгоритм возвращает пустую строку при
' нулевом аргументе. Исправим это
If ЧислоПрописью = "" Then
ЧислоПрописью = Часть(32)
End If
Met1:
End Function
'
' Составление слов из частей по очередной
' цифре числа и по предыстории работы
'
' Функция доступна только в текущем модуле
'
Private Function ЦифраСтрокой(Цифра, Место) As String
' Если сотни или десятки миллиардов, то
' запомнить об этом для будущего
If (Цифра <> 0) And ((Место = 11) Or (Место = 12)) Then
Миллиарды = Истина
End If
' Если сотни или десятки миллионов, то
' запомнить об этом для будущего
If (Цифра <> 0) And ((Место = 8) Or (Место = 9)) Then
Миллионы = Истина
End If
' Если сотни или десятки тысяч, то
' запомнить об этом для будущего
If (Цифра <> 0) And ((Место = 5) Or (Место = 6)) Then
Тысячи = Истина
End If
' Если предыдущая цифра была единица
' в поле десятков, то выбираем
If ВторойДесяток Then
Select Case Цифра
' пишем "десять "
Case 0
ЦифраСтрокой = Часть(29) + Часть(12) + Часть(27)
' пишем "двенадцать "
Case 2
ЦифраСтрокой = Часть(18) + Часть(13) + Часть(27)
' в остальных случаях пишем название цифры
' плюс "надцать "
Case Else
ЦифраСтрокой = Часть(Цифра) + Часть(13) + Часть(27)
End Select
' Добавляем название разрядов
Select Case Место
Case 4
' добавляем "тысяч "
ЦифраСтрокой = ЦифраСтрокой + Часть(22) + Часть(27)
' добавляем "миллионов "
Case 7
ЦифраСтрокой = ЦифраСтрокой + Часть(25) + Часть(26) + Часть(27)
' добавляем "миллиардов "
Case 10
ЦифраСтрокой = ЦифраСтрокой + Часть(31) + Часть(26) + Часть(27)
End Select
' Сбрасывем значения, так как переходим к
' предыдущим разрядам
ВторойДесяток = Ложь: Миллионы = Ложь
Миллиарды = Ложь: Тысячи = Ложь
' Во всех остальных случаях, то есть
' не для описания чисел второго десятка
Else
' Определяем названия десятков
If (Место = 2) Or (Место = 5) Or (Место = 8) Or (Место = 11) Then
Select Case Цифра
' Запоминаем про второй десяток для
' подстановки при следующем входе
Case 1
ВторойДесяток = Истина
' пишем "двадцать" или "тридцать"
Case 2, 3
ЦифраСтрокой = Часть(Цифра) + Часть(14) + Часть(27)
' пишем "сорок"
Case 4
ЦифраСтрокой = Часть(15) + Часть(27)
' пишем "девяносто"
Case 9
ЦифраСтрокой = Часть(16) + Часть(17) + Часть(27)
' в остальных случаях пишем название цифры
' плюс "десят "
Case 5, 6, 7, 8
ЦифраСтрокой = Часть(Цифра) + Часть(12) + Часть(29) + Часть(27)
End Select
End If
' Определяем названия сотен
If (Место = 3) Or (Место = 6) Or (Место = 9) Or (Место = 12) Then
Select Case Цифра
' пишем "сто "
Case 1
ЦифраСтрокой = Часть(17) + Часть(27)
' пишем "двести "
Case 2
ЦифраСтрокой = Часть(18) + Часть(19) + Часть(27)
' пишем "триста "
Case 3
ЦифраСтрокой = Часть(3) + Часть(30) + Часть(27)
' пишем "четыреста "
Case 4
ЦифраСтрокой = Часть(4) + Часть(11) + Часть(30) + Часть(27)
' в остальных случаях пишем название цифры
' плюс "сот "
Case 5, 6, 7, 8, 9
ЦифраСтрокой = Часть(Цифра) + Часть(12) + Часть(20) + Часть(27)
End Select
End If
' Определяем названия единиц
If (Место = 1) Or (Место = 4) Or (Место = 7) Or (Место = 10) Then
Select Case Цифра
' пишем "один "
Case 1
ЦифраСтрокой = Часть(1) + Часть(10) + Часть(27)
' пишем "два " или "три "
Case 2, 3
ЦифраСтрокой = Часть(Цифра) + Часть(27)
' пишем "четыре "
Case 4
ЦифраСтрокой = Часть(4) + Часть(11) + Часть(27)
' в остальных случаях пишем название цифры
Case 5, 6, 7, 8, 9
ЦифраСтрокой = Часть(Цифра) + Часть(12) + Часть(27)
End Select
' Определяем названия тысяч
If (Место = 4) Then
Select Case Цифра
' пишем "тысяч " только в том случае, если
' хотя бы в одном разряде тысяч есть не нулевое
' значение
Case 0
If Тысячи Then
ЦифраСтрокой = Часть(22) + Часть(27)
End If
' пишем "одна тысяча "
Case 1
ЦифраСтрокой = Часть(21) + Часть(27) + Часть(22) + Часть(23) + Часть(27)
' пишем "две тысячи "
Case 2
ЦифраСтрокой = Часть(18) + Часть(27) + Часть(22) + Часть(24) + Часть(27)
' добавляем "тысячи "
Case 3, 4
ЦифраСтрокой = ЦифраСтрокой + Часть(22) + Часть(24) + Часть(27)
' в остальных случаях добавляем "тысяч "
Case 5, 6, 7, 8, 9
ЦифраСтрокой = ЦифраСтрокой + Часть(22) + Часть(27)
End Select
' Сбрасываем значения тысяч, так как
' переходим к предыдущим разрядам
Тысячи = Ложь
End If
' Определяем названия миллионов
If Место = 7 Then
Select Case Цифра
' пишем "миллионов " только в том случае, если
' хотя бы в одном разряде миллионов есть не нулевое
' значение
Case 0
If Миллионы Then
ЦифраСтрокой = Часть(25) + Часть(26) + Часть(27)
End If
' добавляем "миллион "
Case 1
ЦифраСтрокой = ЦифраСтрокой + Часть(25) + Часть(27)
' добавляем "миллиона "
Case 2, 3, 4
ЦифраСтрокой = ЦифраСтрокой + Часть(25) + Часть(23) + Часть(27)
' добавляем "миллионов "
Case 5, 6, 7, 8, 9
ЦифраСтрокой = ЦифраСтрокой + Часть(25) + Часть(26) + Часть(27)
End Select
' Сбрасываем значения миллионов, так как
' переходим к предыдущим разрядам
Миллионы = Ложь
End If
' Определяем названия миллиардов
If Место = 10 Then
Select Case Цифра
' пишем "миллиардов " только в том случае, если
' хотя бы в одном разряде миллиардов есть не нулевое
' значение
Case 0
If Миллиарды Then
ЦифраСтрокой = Часть(31) + Часть(26) + Часть(27)
End If
' добавляем "миллиард "
Case 1
ЦифраСтрокой = ЦифраСтрокой + Часть(31) + Часть(27)
' добавляем "миллиарда "
Case 2, 3, 4
ЦифраСтрокой = ЦифраСтрокой + Часть(31) + Часть(23) + Часть(27)
' добавляем "миллиардов "
Case 5, 6, 7, 8, 9
ЦифраСтрокой = ЦифраСтрокой + Часть(31) + Часть(26) + Часть(27)
End Select
' Сбрасываем значения миллиардов, так как
' переходим к предыдущим разрядам
Миллиарды = Ложь
End If
End If
End If
End Function