Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.65/34: Рейтинг темы: голосов - 34, средняя оценка - 4.65
0 / 0 / 0
Регистрация: 04.02.2018
Сообщений: 20
1
Word

Сумма чисел прописью

29.06.2019, 15:43. Показов 6133. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Макрос прописывает число вида 55 прописью (пятьдесят пять руб. 00 копеек), как изменить код что бы копейки были тоже буквами?
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
Public Function funSupr(xsu As Variant, Optional mb As Byte) As String
On Error GoTo ersupr
If Not IsNumeric(xsu) Then
funSupr = ""
Exit Function
End If
If xsu >= 10000000000000# Then
funSupr = "слишком большое число"
Exit Function
End If
Dim ssu As String, nsu, edi, des, sot, ind As Byte, i As Integer
If Fix(xsu) = 0 Then
funSupr = "ноль рублей "
Else
ssu = Mid$(str$(Fix(xsu)), 2) ' строка рублей без знака
nsu = (Len(ssu) + 2) \ 3 ' количество троек цифр
ssu = Right$("00", nsu * 3 - Len(ssu)) + ssu ' добавляем нулями
For i = nsu To 1 Step -1
sot = Val(Mid$(ssu, (nsu - i) * 3 + 1, 1)) ' сотни
des = Val(Mid$(ssu, (nsu - i) * 3 + 2, 1)) ' десятки
edi = Val(Mid$(ssu, (nsu - i) * 3 + 3, 1)) ' единицы
If sot + des + edi > 0 Or i = 1 Then
If sot > 0 Then
funSupr = funSupr + Choose(sot, "сто", "двести", "триста", _
"четыреста", "пятьсот", "шестьсот", "семьсот", "восемьсот", _
"девятьсот") + " "
End If
If des = 1 Then
funSupr = funSupr + Choose(edi + 1, "десять", "одиннадцать", _
"двенадцать", "тринадцать", "четырнадцать", "пятнадцать", "шестнадцать", _
"семнадцать", "восемнадцать", "девятнадцать") + " "
ind = 3
Else
If des <> 0 Then
funSupr = funSupr + Choose(des - 1, "двадцать", _
"тридцать", "сорок", "пятьдесят", "шестьдесят", "семьдесят", "восемьдесят", _
"девяносто") + " "
End If
If edi <> 0 Then ' вычисляем индекс для тысяч (одна,две)
If i = 2 And (edi = 1 Or edi = 2) Then
ind = 9
Else
ind = 0
End If
funSupr = funSupr + Choose(edi + ind, "один", "два", _
"три", "четыре", "пять", "шесть", "семь", "восемь", "девять", "одна", _
"две") + " "
End If
Select Case edi
Case 1
ind = 1
Case 2, 3, 4
ind = 2
Case Else
ind = 3
End Select
End If
funSupr = funSupr + Choose((i - 1) * 3 + ind, "рубль", "рубля", "рублей", _
"тысяча", "тысячи", "тысяч", "миллион", "миллиона", "миллионов", _
"миллиард", "миллиарда", "миллиардов", "триллион", "триллиона", _
"триллионов") + " "
End If
Next i
End If
ssu = Right$(Format$(xsu, "0.00"), 2)
des = Val(Left$(ssu, 1))
edi = Val(Right$(ssu, 1))
If des = 1 Then
ind = 3
Else
Select Case edi
Case 1
ind = 1
Case 2, 3, 4
ind = 2
Case Else
ind = 3
End Select
End If
funSupr = funSupr + ssu + Choose(ind, " копейка", " копейки", " копеек")
If mb = 0 Then
funSupr = UCase$(Left$(funSupr, 1)) + Mid$(funSupr, 2)
End If
Exit Function
ersupr:
funSupr = "ошибка"
End Function
 
 
Sub ЧислоПрописью2()
Dim Summa$
Summa$ = funSupr(Selection.Text, 1)
If Summa$ <> "" Then ' допустимое значение
Selection.Text = Selection.Text + " (" + Summa$ + ") "
End If
End Sub
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.06.2019, 15:43
Ответы с готовыми решениями:

Дата прописью и сумма прописью
Господа, помогите!! Перерыл весь инет, скачал кучу прог и кодов но не разобрался ни в чем..(( Мне...

Сумма прописью
Дано натуральное число n. n&lt;=1000 Записать это число русскими словами...

Сумма прописью для счета
Здравствуйте, это второй мой вопрос на эту тему)) В общем есть некий файл, там формируется счет и...

Сумма прописью RUR USD и EUR
Помогите плиз.... нужно в excele 2003 переводить числа прописью в разных валютах и просто числа

21
Часто онлайн
903 / 609 / 272
Регистрация: 09.01.2017
Сообщений: 2,012
29.06.2019, 23:49 2
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Function РубПропись(Сумма As Double, Optional Без_копеек As Boolean = False, _
 Optional КопПрописью As Boolean = False, Optional начинитьПрописной As Boolean = True) As String
'Функция для написания суммы прописью
 Dim ed, des, sot, ten, razr, dec
 Dim i As Integer, str As String, s As String
 Dim intPart As String, frPart As String
 Dim mlnEnd, tscEnd, razrEnd, rub, cop
 dec = Array("", "одна ", "две ", "три ", "четыре ", "пять ", "шесть ", "семь ", "восемь ", "девять ")
 ed = Array("", "один ", "два ", "три ", "четыре ", "пять ", "шесть ", "семь ", "восемь ", "девять ")
 ten = Array("десять ", "одиннадцать ", "двенадцать ", "тринадцать ", "четырнадцать ", "пятнадцать ", "шестнадцать ", "семнадцать ", "восемнадцать ", "девятнадцать ")
 des = Array("", "", "двадцать ", "тридцать ", "сорок ", "пятьдесят ", "шестьдесят ", "семьдесят ", "восемьдесят ", "девяносто ")
 sot = Array("", "сто ", "двести ", "триста ", "четыреста ", "пятьсот ", "шестьсот ", "семьсот ", "восемьсот ", "девятьсот ")
 razr = Array("", "тысяч", "миллион", "миллиард")
 mlnEnd = Array("ов ", " ", "а ", "а ", "а ", "ов ", "ов ", "ов ", "ов ", "ов ")
 tscEnd = Array(" ", "а ", "и ", "и ", "и ", " ", " ", " ", " ", " ")
 razrEnd = Array(mlnEnd, mlnEnd, tscEnd, "")
 rub = Array("рублей", "рубль", "рубля", "рубля", "рубля", "рублей", "рублей", "рублей", "рублей", "рублей")
 cop = Array("копеек", "копейка", "копейки", "копейки", "копейки", "копеек", "копеек", "копеек", "копеек", "копеек")
 If Сумма >= 1000000000000# Or Сумма < 0 Then РубПропись = CVErr(xlErrValue): Exit Function
 '&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
 If Round(Сумма, 2) >= 1 Then
 intPart = Left$(Format(Сумма, "000000000000.00"), 12)
 For i = 0 To 3
 s = Mid$(intPart, i * 3 + 1, 3)
 If s <> "000" Then
 str = str & sot(CInt(Left$(s, 1)))
 If Mid$(s, 2, 1) = "1" Then
 str = str & ten(CInt(Right$(s, 1)))
 Else
 str = str & des(CInt(Mid$(s, 2, 1))) & IIf(i = 2, dec(CInt(Right$(s, 1))), ed(CInt(Right$(s, 1))))
 End If
 On Error Resume Next
 str = str & IIf(Mid$(s, 2, 1) = "1", razr(3 - i) & razrEnd(i)(0), _
 razr(3 - i) & razrEnd(i)(CInt(Right$(s, 1))))
 On Error GoTo 0
 End If
 Next i
 str = str & IIf(Mid$(s, 2, 1) = "1", rub(0), rub(CInt(Right$(s, 1))))
 End If
 РубПропись = str
 ''''''''''''''''''
 If Без_копеек = False Then
 frPart = Right$(Format(Сумма, "0.00"), 2)
 If frPart = "00" Then
 frPart = ""
 Else
 If КопПрописью Then
 frPart = IIf(Left$(frPart, 1) = "1", ten(CInt(Right$(frPart, 1))) & cop(0), _
 des(CInt(Left$(frPart, 1))) & dec(CInt(Right$(frPart, 1))) & cop(CInt(Right$(frPart, 1))))
 Else
 frPart = IIf(Left$(frPart, 1) = "1", frPart & " " & cop(0), frPart & " " & cop(CInt(Right$(frPart, 1))))
 End If
 End If
 РубПропись = str & " " & frPart
 End If
 ''''''''''''''''''
' РубПропись = str & frPart
 If начинитьПрописной Then Mid$(РубПропись, 1, 1) = UCase(Mid$(РубПропись, 1, 1))
' If начинитьПрописной Then РубПропись = UCase(Left(РубПропись, 1)) & Mid(РубПропись, 2)
End Function
Без копеек (1), с копейками (0)
Копейки прописью (1), числом (0)
Начинать прописью (0), заглавной (1)

=РубПропись(12548,23;0;1)
Двенадцать тысяч пятьсот сорок восемь рублей двадцать три копейки
2
0 / 0 / 0
Регистрация: 04.02.2018
Сообщений: 20
30.06.2019, 08:07  [ТС] 3
Спасибо, за ответ, но по какой то причине не получается, все равно копейки прописывает (оо копеек.)
0
Часто онлайн
903 / 609 / 272
Регистрация: 09.01.2017
Сообщений: 2,012
30.06.2019, 08:58 4
Два последних аргумента поставьте 0 и 1.
Или Вам нужно, чтобы именно НОЛЬ копеек прописывало?
0
0 / 0 / 0
Регистрация: 04.02.2018
Сообщений: 20
30.06.2019, 08:59  [ТС] 5
Да верно, нужно что бы ноль копеек прописывало
0
Часто онлайн
903 / 609 / 272
Регистрация: 09.01.2017
Сообщений: 2,012
30.06.2019, 09:08 6
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Function РубПропись(Сумма As Double, Optional Без_копеек As Boolean = False, _
 Optional КопПрописью As Boolean = False, Optional начинитьПрописной As Boolean = True) As String
'Функция для написания суммы прописью
 Dim ed, des, sot, ten, razr, dec
 Dim i As Integer, str As String, s As String
 Dim intPart As String, frPart As String
 Dim mlnEnd, tscEnd, razrEnd, rub, cop
 dec = Array("ноль ", "одна ", "две ", "три ", "четыре ", "пять ", "шесть ", "семь ", "восемь ", "девять ")
 ed = Array("", "один ", "два ", "три ", "четыре ", "пять ", "шесть ", "семь ", "восемь ", "девять ")
 ten = Array("десять ", "одиннадцать ", "двенадцать ", "тринадцать ", "четырнадцать ", "пятнадцать ", "шестнадцать ", "семнадцать ", "восемнадцать ", "девятнадцать ")
 des = Array("", "", "двадцать ", "тридцать ", "сорок ", "пятьдесят ", "шестьдесят ", "семьдесят ", "восемьдесят ", "девяносто ")
 sot = Array("", "сто ", "двести ", "триста ", "четыреста ", "пятьсот ", "шестьсот ", "семьсот ", "восемьсот ", "девятьсот ")
 razr = Array("", "тысяч", "миллион", "миллиард")
 mlnEnd = Array("ов ", " ", "а ", "а ", "а ", "ов ", "ов ", "ов ", "ов ", "ов ")
 tscEnd = Array(" ", "а ", "и ", "и ", "и ", " ", " ", " ", " ", " ")
 razrEnd = Array(mlnEnd, mlnEnd, tscEnd, "")
 rub = Array("рублей", "рубль", "рубля", "рубля", "рубля", "рублей", "рублей", "рублей", "рублей", "рублей")
 cop = Array("копеек", "копейка", "копейки", "копейки", "копейки", "копеек", "копеек", "копеек", "копеек", "копеек")
 If Сумма >= 1000000000000# Or Сумма < 0 Then РубПропись = CVErr(xlErrValue): Exit Function
 '&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
 If Round(Сумма, 2) >= 1 Then
 intPart = Left$(Format(Сумма, "000000000000.00"), 12)
 For i = 0 To 3
 s = Mid$(intPart, i * 3 + 1, 3)
 If s <> "000" Then
 str = str & sot(CInt(Left$(s, 1)))
 If Mid$(s, 2, 1) = "1" Then
 str = str & ten(CInt(Right$(s, 1)))
 Else
 str = str & des(CInt(Mid$(s, 2, 1))) & IIf(i = 2, dec(CInt(Right$(s, 1))), ed(CInt(Right$(s, 1))))
 End If
 On Error Resume Next
 str = str & IIf(Mid$(s, 2, 1) = "1", razr(3 - i) & razrEnd(i)(0), _
 razr(3 - i) & razrEnd(i)(CInt(Right$(s, 1))))
 On Error GoTo 0
 End If
 Next i
 str = str & IIf(Mid$(s, 2, 1) = "1", rub(0), rub(CInt(Right$(s, 1))))
 End If
 РубПропись = str
 ''''''''''''''''''
 If Без_копеек = False Then
 frPart = Right$(Format(Сумма, "0.00"), 2)
 If frPart = "ноль " Then
 frPart = "ноль "
 Else
 If КопПрописью Then
 frPart = IIf(Left$(frPart, 1) = "1", ten(CInt(Right$(frPart, 1))) & cop(0), _
 des(CInt(Left$(frPart, 1))) & dec(CInt(Right$(frPart, 1))) & cop(CInt(Right$(frPart, 1))))
 Else
 frPart = IIf(Left$(frPart, 1) = "1", frPart & " " & cop(0), frPart & " " & cop(CInt(Right$(frPart, 1))))
 End If
 End If
 РубПропись = str & " " & frPart
 End If
 ''''''''''''''''''
' РубПропись = str & frPart
 If начинитьПрописной Then Mid$(РубПропись, 1, 1) = UCase(Mid$(РубПропись, 1, 1))
' If начинитьПрописной Then РубПропись = UCase(Left(РубПропись, 1)) & Mid(РубПропись, 2)
End Function
Добавлено через 11 секунд
Тогда так.
0
0 / 0 / 0
Регистрация: 04.02.2018
Сообщений: 20
30.06.2019, 09:14  [ТС] 7
Спасибо вам огромное!!! Еще вопрос по поводу вашего кода я в VB его просто вставляю в новый модуль прожимаю F5 он не срабатывает возможно я должен еще что то прописать что бы он сработал? Просто дело в том что у меня в коде есть доп позиция
Visual Basic
1
2
3
4
5
6
7
Sub ЧислоПрописью2()
Dim Summa$
Summa$ = funSupr(Selection.Text, 1)
If Summa$ <> "" Then ' допустимое значение
Selection.Text = Selection.Text + " (" + Summa$ + ") "
End If
End Sub
Думаю Благодаря ей он и срабатывает, Еще раз Спасибо за помощь!
0
Часто онлайн
903 / 609 / 272
Регистрация: 09.01.2017
Сообщений: 2,012
30.06.2019, 09:25 8
Это функция с несколькими аргументами и да, в коде нет макроса вызывающего функцию.
0
0 / 0 / 0
Регистрация: 04.02.2018
Сообщений: 20
30.06.2019, 09:32  [ТС] 9
А как тогда вызвать эту функцию ?
0
Часто онлайн
903 / 609 / 272
Регистрация: 09.01.2017
Сообщений: 2,012
30.06.2019, 09:34 10
Как обычную формулу
=РубПрописью(......)
0
0 / 0 / 0
Регистрация: 04.02.2018
Сообщений: 20
30.06.2019, 09:38  [ТС] 11
Сложновато мне понять, с предыдущей функцией я создал макрос вывел его на панель быстрого доступа и выделял число оно прописывалось как быть теперь?
0
Часто онлайн
903 / 609 / 272
Регистрация: 09.01.2017
Сообщений: 2,012
30.06.2019, 09:47 12
Вечером постараюсь Вам помочь, сейчас с телефона пишу.
0
0 / 0 / 0
Регистрация: 04.02.2018
Сообщений: 20
30.06.2019, 10:01  [ТС] 13
Хорошо, Спасибо Большое
0
Часто онлайн
903 / 609 / 272
Регистрация: 09.01.2017
Сообщений: 2,012
30.06.2019, 21:08 14
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
Function РубПропись(Сумма As Double) As String
'Функция для написания суммы прописью
 Dim ed, des, sot, ten, razr, dec
 Dim i As Integer, str As String, s As String, str1 As String
 Dim intPart As String, frPart As String, prop As String
 Dim mlnEnd, tscEnd, razrEnd, rub, cop
 dec = Array("ноль ", "одна ", "две ", "три ", "четыре ", "пять ", "шесть ", "семь ", "восемь ", "девять ")
 ed = Array("", "один ", "два ", "три ", "четыре ", "пять ", "шесть ", "семь ", "восемь ", "девять ")
 ten = Array("десять ", "одиннадцать ", "двенадцать ", "тринадцать ", "четырнадцать ", "пятнадцать ", "шестнадцать ", "семнадцать ", "восемнадцать ", "девятнадцать ")
 des = Array("", "", "двадцать ", "тридцать ", "сорок ", "пятьдесят ", "шестьдесят ", "семьдесят ", "восемьдесят ", "девяносто ")
 sot = Array("", "сто ", "двести ", "триста ", "четыреста ", "пятьсот ", "шестьсот ", "семьсот ", "восемьсот ", "девятьсот ")
 razr = Array("", "тысяч", "миллион", "миллиард")
 mlnEnd = Array("ов ", " ", "а ", "а ", "а ", "ов ", "ов ", "ов ", "ов ", "ов ")
 tscEnd = Array(" ", "а ", "и ", "и ", "и ", " ", " ", " ", " ", " ")
 razrEnd = Array(mlnEnd, mlnEnd, tscEnd, "")
 rub = Array("рублей", "рубль", "рубля", "рубля", "рубля", "рублей", "рублей", "рублей", "рублей", "рублей")
 cop = Array("копеек", "копейка", "копейки", "копейки", "копейки", "копеек", "копеек", "копеек", "копеек", "копеек")
 If Сумма >= 1000000000000# Or Сумма < 0 Then РубПропись = CVErr(xlErrValue): Exit Function
 '&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
    If Round(Сумма, 2) >= 1 Then
        intPart = Left$(Format(Сумма, "000000000000.00"), 12)
        For i = 0 To 3
            s = Mid$(intPart, i * 3 + 1, 3)
                If s <> "000" Then
                    str = str & sot(CInt(Left$(s, 1)))
                        If Mid$(s, 2, 1) = "1" Then
                            str = str & ten(CInt(Right$(s, 1)))
                        Else
                            str = str & des(CInt(Mid$(s, 2, 1))) & IIf(i = 2, dec(CInt(Right$(s, 1))), ed(CInt(Right$(s, 1))))
                        End If
         On Error Resume Next
            str = str & IIf(Mid$(s, 2, 1) = "1", razr(3 - i) & razrEnd(i)(0), _
            razr(3 - i) & razrEnd(i)(CInt(Right$(s, 1))))
         On Error GoTo 0
                End If
 Next i
 frPart = Right$(Format(Сумма, "0.00"), 1)
  
 str = str & IIf(Mid$(s, 2, 1) = "1", rub(0), rub(CInt(Right$(s, 1))))
 str1 = IIf(Left$(frPart, 1) = "1", ten(CInt(Right$(frPart, 1))) & cop(0), _
 des(CInt(Left$(frPart, 1))) & dec(CInt(Right$(frPart, 1))) & cop(CInt(Right$(frPart, 1))))
 prop = str & " " & str1
 
 РубПропись = prop
 End If
 
End Function
 
 
 
Sub РубПропись2()
Dim Summa$
Summa$ = РубПропись(Selection.Text)
If Summa$ <> "" Then ' допустимое значение
Selection = Summa$
End If
End Sub
Добавлено через 11 минут
Строку 37 замените на эту:
Visual Basic
1
frPart = Right$(Format(Сумма, "0.00"), 2)
Добавлено через 1 час 46 минут
ЛевНикол, Для удобства можете добавить горячую клавишу
Разработчик\макросы\РубПропись2\Параметры\Ctrl+ и добавьте удобную Вам букву.
0
11513 / 3799 / 681
Регистрация: 13.02.2009
Сообщений: 11,217
30.06.2019, 23:38 15
Сумма чисел прописью
Вот незадача-то! Думал тема поможет!!!
Но нет!
У меня надо два варианта! Найти разность чисел прописью и произведение чисел прописью!!!
А жаль!
Так хотелось....так хотелось читать и помогать адекватным вопросам

Добавлено через 1 минуту
Просто не понятно чем сумма прописью отличается в вашем понятии от разности прописью?!

Добавлено через 5 минут
тогда уж надо писать функция которая бы выдавала результат в виде: двести двадцать три рубля умножить на 2 (рубля?) равно четыреста сорок шесть рублей (возможно в квадрате)
0
Часто онлайн
903 / 609 / 272
Регистрация: 09.01.2017
Сообщений: 2,012
30.06.2019, 23:44 16
Alex77755, В сметном и бухгалтерском деле, а может и в других областях, есть такая строка "сумма, итого", которая результатирует все потуги оных (как правило все суммируется) и видимо пошла такая парадигма "Сумма прописью"
0
11513 / 3799 / 681
Регистрация: 13.02.2009
Сообщений: 11,217
01.07.2019, 01:09 17
КостяФедореев,
Да всё это понято. не понятно как могут работать на ответственных должностях люди, которые не могут сформулировать мысль и вопрос? Сейчас нужна сумма прописью. завтра произведение прописью
Дали функцию
В ответ:
А как тогда вызвать эту функцию ?
Может чел не на своём месте?
0
oh my god
1454 / 793 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
01.07.2019, 13:28 18
Лучший ответ Сообщение было отмечено fever brain как решение

Решение

А вот и моих пять копеек к этой теме

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

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
Option Explicit
 
Sub Proverka()
    MsgBox SumPropRU([c3])
End Sub
 
Function SumPropRU(ByVal Sum#) As String
    'Сумма прописью RU до триллионов, с копейками и рублями
 
    'Ниже валютные константы как для 1-го рубля, для двух рублей и для пяти рублей (окончания соответственно через минусы)
    Const Rub125 = "рубл-ь-я-ей", Cop125 = "копе-йка-йки-ек", p = " "
    Const r1 = "ноль од-ин-на дв-а-е три четыре пять шесть семь восемь девять десять одинадцать двенадцать тринадцать четырнадцать пятнадцать шеснадцать семнадцать весемнадцать девятнадцать"
    Const r2 = "двадцать тридцать сорок пятьдесят шестьдесят семьдесят восемьдесят девяносто"
    Const r3 = "сто двести триста четыреста пятьсот шестьсот семьсот восемьсот девятьсот"
    Const r4 = "тысяч-а-и- миллион--а-ов миллиард--а-ов триллион--а-ов"
    Dim a$(1), a1$(), a2$(), a3$(), a4$(), w1$(), w4$()
    Dim n#, s$, i&, j&, jj&, t&, ii&, valut$()
    
    
    a1 = Split(r1): a2 = Split(r2): a3 = Split(r3): a4 = Split(r4)
    Sum = Round(Sum, 2) 'Округлить до первых двух знаков после запятой
    valut = Split(CStr(Sum), ",") 'Разделить значения в две ячейки до и после запятой
    If UBound(valut) > 0 Then valut(1) = Left$(valut(1) & 0, 2) 'Добавить ноль после запятой и отсеч 2 первых знака
 
    For ii = 0 To UBound(valut) 'Цикл создания записи рублей и копеек
        n = valut(ii)
        For i = 0 To UBound(a4) + 1 'Цикл создания записи сумм
            j = Right$(CStr(n), 3): n = Fix(n / 1000): s = "": jj = j Mod 100: j = j \ 100
            If j > 0 Then s = s & a3(j - 1) & p
            Select Case jj
            Case 0: w1 = Split(a1(jj Mod 10), "-")
            Case Is < 20: w1 = Split(a1(jj), "-"): s = s & w1(0) & p
            Case Else: w1 = Split(a1(jj Mod 10), "-"): s = s & a2(jj \ 10 - 2) & IIf(jj Mod 10 <> 0, p & w1(0), "") & p
            End Select
            If i > 0 Then w4 = Split(a4(i - 1), "-") Else w4 = Split(Choose(ii + 1, Rub125, Cop125), "-")
            
            
            Select Case jj Mod 10
            Case 1
                If jj > 10 And jj < 20 Then GoTo MnCh
                If UBound(w1) > 0 Then s = RTrim(s) & w1(Abs(i = 1 Or ii = 1) + 1) & p
                s = s & w4(0) & w4(1) & p 'Запись слева направо
            Case 2, 3, 4
                If jj > 10 And jj < 20 Then GoTo MnCh
                If UBound(w1) > 0 Then s = RTrim(s) & w1(Abs(i = 1 Or ii = 1) + 1) & p
                s = s & w4(0) & w4(2) & p
            Case Else
MnCh:
                s = s & w4(0) & w4(3) & p
            End Select
            a(ii) = RTrim$(s) & ", " & a(ii)
            If n = 0 Then Exit For
        Next
        a(ii) = IIf(Left$(a(ii), 4) = Left$(Rub125, 4), w1(0) & p, "") & a(ii)
    Next
    SumPropRU = Join(a, "")  'Объеденить две записи справа налево
    SumPropRU = Left$(SumPropRU, InStrRev(SumPropRU, ",") - 1)
    SumPropRU = UCase(Left$(SumPropRU, 1)) & Mid$(SumPropRU, 2)
End Function
Миниатюры
Сумма чисел прописью   Сумма чисел прописью  
Вложения
Тип файла: xls SumPropRU.xls (46.0 Кб, 14 просмотров)
0
oh my god
1454 / 793 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
01.07.2019, 16:58 19
Обращу внимание что функционал офиса игнорирует последние цифры, если их количество будет больше 12
аргумент функции SumPropRU принимает самый объемный числовой тип, и тоже не более 15 цифер без запятой.
С запятой не более 13 цифер точности для рублей... + 2 цифер для копеек
тоесть 9999999999999.99 девять триллионов
0
oh my god
1454 / 793 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
02.07.2019, 05:30 20
И кстати я отменил лучший ответ поста #6 от КостяФедореев,
ну и другие варианты не блещут
При вводе например 11.01 выдает одинадцать копеек, а при вводе 1.09 вообще 99 копеек
представляю как будут *попадать* кассиры

Проверял так:
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
Sub РубПропись2()
Dim Summa$
Summa$ = РубПропись(2.09)
If Summa$ <> "" Then ' допустимое значение
MsgBox Summa$
End If
End Sub
Миниатюры
Сумма чисел прописью   Сумма чисел прописью   Сумма чисел прописью  

0
02.07.2019, 05:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.07.2019, 05:30
Помогаю со студенческими работами здесь

Сумма прописью для меняющейся ячейки
Всем доброго времени суток! В приложенном файле представлен вариант суммы прописью, если...

Сумма прописью: переписать код под VBA
Вот нашла код многоуважаемого Бурундука, для аксеса: Static one(0 To 19, 1 To 2) As String,...

Записать число 123 - "сто двадцать три" (сумма прописью)
Вот задача: Дано целое число в диапазоне 100–999. Вывести строку-описание данного числа,...

Макрос "сумма прописью"
Добрый вечер! Просьба, помочь в редактировании макроса &quot;сумма прописью&quot;. Нужно чтобы текст вида...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru