На главную
 

ProGa - Сумма прописью - ст.2

If BigDigCount>5 Then Exit Sub

      Интересный момент – не многие знают, что так можно сделать. В разделе описания переменных мы объявили массив Digitals как безразмерный. Теперь оператором ReDim мы переопределяем массив. Главное то, что в указании размерности мы можем использовать выражение, а с оператором Dim такое дело не пройдет.

ReDim Digitals(DigCount) As Integer

      Организовываем цикл, который последовательно переносит каждую цифру числа в массив Digitals. При этом номера цифр в последовательности обращаются, т.е. последняя цифра становится первой в массиве. Функция Mid(строка, номер 1-го символа, длинна подстроки) возвращает подстроку из исходной строки. Функция CInt преаброзует аргумент в целочисленный тип. Именно здесь может возникнуть ошибка, против которой был введен оператор On Error сначала процедуры. Если пользователь вместо числа введет хотя бы одну букву (для точности: кроме английской е, которая обозначает мантису вещественного числа), то возникнет ошибка несоответствия типа. Ее возникновение будет означать что вся процедура не может закончится правильно и ее нужно закончить принудительно.

For i = 1 To DigCount
      Digitals(i) = CInt(Mid(strNumber, DigCount - i + 1, 1))
Next i

      Инициализируем переменную Result, в которой в конце концов окажется сумма прописью:

Result = ""

      Организовываем главный управляющий цикл, который будет последовательно обрабатывать группы разрядов исходного числа:

For i = 0 To BigDigCount – 1

      Последовательно заносим разряды текущей группы в переменные Dig1 – Dig3:

      Dig1 = Digitals(i * 3 + 1)
      Dig2 = Digitals(i * 3 + 2)
      Dig3 = Digitals(i * 3 + 3)

      Кроме этого вычисляем число из двух первых разрядов и общее значение группы разрядов.

      AvDig = Dig2 * 10 + Dig1
      BigDig = Dig3 * 100 + AvDig

      Мы уже говорили что у каждой группы разрядов есть имя. Если значение всей группы 0, то имя указывать не нужно (например, "Один миллион тысяч гривен" звучит странно). Исключение из этого правила является самая первая группа разрядов, так как "гривны" нужно указывать всегда. Оператор If проверяет равна ли группа 0 и если да, то проверяет номер группы разрядов. Если группа первая, то переменная Rusult получает свое первое значение " гривен".

      If BigDig = 0 Then
            If i = 0 Then Result = " " & BigDigNames(0, 0)
      Else

      Если группа разрядов все-таки имеет значение, то необходимо узнать падеж и число существительного, в котором будет представлятся имя группы разряда. В зависимости от последней цифры или двух последних (если AvDig меньше 20) переменной Pointer присваивается соответствующее значение.

      В следующей строке к значению Result слева прибавляется имя группы по номеру группы i и по форме существительного с индексом Pointer. Если бы мы ранее не инициализировали переменную Result, то в этой строке возникла бы ошибка, так как до первого присваивания ей значения, она содержит значение Null, не являющееся строкой.

            Result = " " & BigDigNames(i, Pointer) & Result
      End If

      Теперь прописываем в Result цифры первых двух разрядов. Если это "надцатое" число то значение берется из массива From11till19. Индекс вычисляется с помощью уже знакомого оператора Mod. Если же два разряда предстовляют два разных слова, то их значения берутся отдельно из массива DigNames. понятно, что 0 прописывать не нужно (двадцать ноль гривен :)

      If AvDig > 10 And AvDig < 20 Then
            Result = " " & From11till19(AvDig Mod 10) & Result
      Else
            If Dig1 <> 0 Then Result = " " & DigNames(Dig1, 0) & Result
            If Dig2 <> 0 Then Result = " " & DigNames(Dig2, 1) & Result
      End If

      Наконец словесное представление третьего разряда прибавляется к Result по знакомому принципу.

      If Dig3 <> 0 Then Result = " " & DigNames(Dig3, 2) & Result
Next i

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

Result = Trim(Result)

      Теперь перевую букву полученной суммы необходимо сделать прописной. Оператор (не функция!) Mid ссылается на подстроку (первую букву) строки Result и присваивает ей значение преображенной функцией StrConv первую букву строки Result.

Mid(Result, 1, 1) = StrConv(Mid(Result, 1, 1), vbUpperCase)

      Последний штрих: присваиваем выделению новый текст с числом и суммой прописью в скобках.

Selection.Text = Selection.Text & " (" & Result & ")"

      Помните метку – вот и она.

EndSub:

      Строка обозначает конец процедуры (нашей программы)

End Sub

      Как установить эту процедуру на Ваш компьютер? Очень легко.

  1. Скачайте текстовый файл по ссылке внизу;
  2. Создайте свой макрос с именем NumberToString с помощью комманды меню Сервис > Макросы > Запись. потом сразу остановите запись;
  3. Вызовите из того же меню комманду Править и скопируйте вместо созданного макроса свежескаченный текст;
  4. Присвойте выполнение макроса сочетанию клавиш либо новой кнопке на панели инструментов.

       Текст программы

К началу На главную
Designed by ProGa ®
Hosted by uCoz