' ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ' (C) Александр, http://mtdmacro.ru, mtdmacro@mail.ru ' ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Option Explicit Private N(1 To 14) As Byte Private A, строка As String Private A1_муж, A1_жен, A2, a3, a0 Function Пропись(Сумма, Optional Показывать_ноль_копеек As Boolean) Dim Миллиарды, Миллионы, Тысячи, Рубли, Копейки Dim Позиция_разделителя As Long, Коп As String, i As Long A1_муж = Array("", "один ", "два ", "тpи ", "четыpе ", "пять ", "шесть ", "семь ", "восемь ", "девять ") A1_жен = Array("", "одна ", "две ", "тpи ", "четыpе ", "пять ", "шесть ", "семь ", "восемь ", "девять ") a0 = Array("десять ", "одиннадцать ", "двенадцать ", "тринадцать ", "четырнадцать ", "пятнадцать ", "шестнадцать ", "семнадцать ", "восемнадцать ", "девятнадцать ") A2 = Array("", "десять ", "двадцать ", "тpидцать ", "сорок ", "пятьдесят ", "шестьдесят ", "семьдесят ", "восемьдесят ", "девяносто ") a3 = Array("", "сто ", "двести ", "тpиста ", "четыреста ", "пятьсот ", "шестьсот ", "семьсот ", "восемьсот ", "девятьсот ") Миллиарды = Array("миллиард", "миллиарда", "миллиардов") Миллионы = Array("миллион", "миллиона", "миллионов") Тысячи = Array("тысяча", "тысячи", "тысяч") Рубли = Array("белорусский рубль", "белорусских рубля", "белорусских рублей") Копейки = Array("копейка", "копейки", "копеек") A = "" Позиция_разделителя = InStr(1, Сумма, "=", 1) + InStr(1, Сумма, "-", 1) + InStr(1, Сумма, ".", 1) + InStr(1, Сумма, ",", 1) If Позиция_разделителя = 0 Then Коп = "00" Позиция_разделителя = Len(Сумма) + 1 Else Коп = Left(Mid(Сумма, Позиция_разделителя + 1, 2) & "00", 2) End If строка = Right("000000000000" & Mid(Сумма, 1, Позиция_разделителя - 1), 12) If Val(строка) 999999999999.99 Then Пропись = "Cумма выходит за границы допустимого диапазона (0-999999999999.99)." Exit Function End If For i = 1 To 12 N(i) = Val(Mid(строка, i, 1)) Next i For i = 13 To 14 N(i) = Val(Mid(Коп, i - 12, 1)) Next i If Разбор(0) Then A = A & Миллиарды(Склонение(0)) + " " End If If Разбор(3) Then A = A & Миллионы(Склонение(3)) + " " End If If Разбор(6) Then A = A & Тысячи(Склонение(6)) + " " End If Call Разбор(9) If A "" Then A = A & Рубли(Склонение(9)) & " " A = UCase(Mid(Trim(A), 1, 1)) & Mid(Trim(A), 2) If Not Показывать_ноль_копеек And Коп = "00" Then Else _ A = A & " " & Коп & " " & Копейки(Склонение(11)) Пропись = A End Function Function Разбор(Сдвиг) As Boolean If Val(Mid(строка, 1 + Сдвиг, 3)) 0 Then A = A & a3(N(1 + Сдвиг)) If N(2 + Сдвиг) = 1 Then A = A & a0(N(3 + Сдвиг)) Else A = A & A2(N(2 + Сдвиг)) & IIf(Сдвиг = 6, A1_жен(N(3 + Сдвиг)), A1_муж(N(3 + Сдвиг))) End If Разбор = True Else Разбор = False End If End Function Public Function Склонение(Сдвиг) If N(2 + Сдвиг) = 1 Then Склонение = 2 Else Select Case N(3 + Сдвиг) Case 1 Склонение = 0 Case 2 To 4 Склонение = 1 Case Else Склонение = 2 End Select End If End Function