For i = 1 To Len(Source$)
If DoPosle = False Then
Select Case Mid(Source$, i, 1)
Case "0" To "9"
Nach = Nach * Dig1 + Val(Mid(Source$, i, 1)) / Dig2
Vchis = Nach
If Dig1 = 1 Then Dig2 = Dig2 * 10
Case ",", "."
If Dig1 <> 10 Then Exit Function
Dig1 = 1
Dig2 = Dig2 * 10
DoPosle = True
Case Else
Bucks = Mid(Source$, i, 1)
MsgBox "Èñõîäíàÿ ñòðîêà ñîäåðæèò íå öèôðû:" & vbCrLf & Source$
Exit Function
End Select
Else
Okonch$ = Okonch$ + Mid(Source$, i, 1)
End If
Next i
Okonch$ = RTrim(Okonch$)
RTrim(" (" + Summa$ + " " + Okonch$ & "/100)" & EndWord$ & ", включая НДС 18% - " + CStr(nds) & " " & EndWord$ & " ")
Как убрать символ конца строки
собираю результат в одну строку и VB вставляет символы конца строки в некоторые места. Как их отсечь?
Код:
вот после Okonch$ он и всталяет симовл.
Полностью свою ф-цию приведи пжалуйста. А то тогадываться чтоль, что там у тебя в переменных за значения? А еще лучше - предназначение ф-ции.. имхо, бред - в одной ф-ции и столько переменных...:eek:
Прога смотрит выделение и если это число, то пишет его прописью на месте выделения.
Причем такой факт: если выделить только цифры, то все в порядке, но если при выделении будет захвачен пробел и ещё какой-то знак (может Enter), то вот эти символы и добавляются в собираемую строчку.
Код:
Sub EuroStr1()
Dim Summa$
Summa$ = ResultSumma$(Selection.Text, 1, "Евро", "Евро", "Евро", 1)
If Summa$ <> "" Then ' допустимое значение
Selection.Text = Summa$
End If
End Sub
Public Function ResultSumma$(Source$, Rod%, w1$, w2to4$, w5to10$, iCase%)
Dim i%, Summa$
Dim Nach As Long, Dig1 As Long, Dig2 As Long, DoPosle As Boolean, Okonch$
Dim nds As Double
Nach = 0
Vchis = 0
Bucks = ""
Dig1 = 10
Dig2 = 1
DoPosle = False
Okonch$ = ""
' Проверка правильности числа
' и преобразование его в пропись
'
' Source$ - цифровая запись числа в символьном виде
' Rod, w1, w2to4, w5to10 - см. SummaString
' iCase > 0 - первую букву преобразовать в прописную
' ========================
Source$ = RTrim(Source$)
If Source$ = "" Then
MsgBox "Пустая символьная строка"
Exit Function
End If
For i = 1 To Len(Source$)
If DoPosle = False Then
Select Case Mid(Source$, i, 1)
Case "0" To "9"
Nach = Nach * Dig1 + Val(Mid(Source$, i, 1)) / Dig2
Vchis = Nach
If Dig1 = 1 Then Dig2 = Dig2 * 10
Case ",", "."
If Dig1 <> 10 Then Exit Function
Dig1 = 1
Dig2 = Dig2 * 10
DoPosle = True
Case Else
Bucks = Mid(Source$, i, 1)
MsgBox "Исходная строка содержит не цифры:" & vbCrLf & Source$
Exit Function
End Select
Else
Okonch$ = Okonch$ + Mid(Source$, i, 1)
End If
Next i
If Val(Source$) > &H7FFFFFFF Then
MsgBox "Превышен предел - 2147483647"
Exit Function
End If
Call SummaString(Summa$, Nach, Rod%, w1$, w2to4$, w5to10$)
If iCase% > 0 Then ' написать с прописной буквы
Mid$(Summa$, 1) = Chr$(Asc(Summa$) - 32)
End If
EndWord$ = w5to10$
Select Case Nach Mod 10
Case 1: EndWord$ = w1$
Case 2: EndWord$ = w2to4$
Case 3: EndWord$ = w2to4$
Case 4: EndWord$ = w2to4$
End Select
nds = Round(Nach + Val(Okonch$) / 100 - (Nach + Val(Okonch$) / 100) / 1.18, 2)
Okonch$ = RTrim(Okonch$)
ResultSumma$ = Source$ + " (" + Summa$ + " " + Okonch$ + "/100)" + EndWord$ + ", в том числе НДС 18% - " + CStr(nds) + " " + EndWord$ + " "
End Function
Sub SummaString(Summa$, Source As Long, Rod%, w1$, w2to4$, w5to10$)
'
' "Сумма прописью":
' преобразование числа из цифрого вида в символьное
' ==================================================
' Исходные данные:
' Source - число от 0 до 2147483647 (2^31-1)
' Eсли нужно оперировать с числами > 2 147 483 647
' замените описание переменных Source и TempValue на "AS DOUBLE"
'
' далее нужно задать информацию о единице изменения
' Rod% = 1 - мужской, = 2 - женский, = 3 - средний
' название единицы изменения:
' w1$ - именительный падеж единственное число (= 1)
' w2to4$ - родительный падеж единственное число (= 2-4)
' w5to10$ - родительный падеж множественное число ( = 5-10)
'
' Rod% должен быть задано обязательно, название единицы может быть
' не задано = ""
' ———————————————-
' Результат: Summa$ - запись прописью
'
'================================
Dim TempValue As Long
'
If Source& = 0 Then
Summa$ = RTrim$("ноль " + w5to10$): Exit Sub
End If
'
TempValue = Source: Summa$ = ""
' единицы
Call SummaStringThree(Summa$, TempValue, Rod%, "", "", "")
If TempValue = 0 Then Exit Sub
' тысячи
Call SummaStringThree(Summa$, TempValue, 2, "тысяча", "тысячи", "тысяч")
If TempValue = 0 Then Exit Sub
' миллионы
Call SummaStringThree(Summa$, TempValue, 1, "миллион", "миллиона", "миллионов")
If TempValue = 0 Then Exit Sub
' миллиардов
Call SummaStringThree(Summa$, TempValue, 1, "миллиард", "миллиарда", "миллиардов")
If TempValue = 0 Then Exit Sub
'
' Eсли нужно оперировать с числами > 2 147 483 647
' измените тип переменных (см. выше) и добавьте эту строку для триллионов:
' CALL SummaStringThree(Summa$, TempValue#, 1, "трилллион","триллиона", "триллионов")
' IF TempValue# = 0 THEN EXIT SUB
'
' Что идет после триллионов, я плохо представляю...
'
End Sub
Sub SummaStringThree(Summa$, TempValue As Long, Rod%, w1$, w2to4$, w5to10$)
'
' Формирования строки для трехзначного числа:
' (последний трех знаков TempValue
' Eсли нужно оперировать с числами > 2 147 483 647
' замените в описании на TempValue AS DOUBLE
'====================================
Dim Rest%, Rest1%, EndWord$, s1$, s10$, s100$
'
Rest% = TempValue& Mod 1000
TempValue& = TempValue& \ 1000
If Rest% = 0 Then ' последние три знака нулевые
If Summa$ = "" Then Summa$ = w5to10$ + " "
Exit Sub
End If
'
' начинаем подсчет с Rest
EndWord$ = w5to10$
' сотни
Select Case Rest% \ 100
Case 0: s100$ = ""
Case 1: s100$ = "сто "
Case 2: s100$ = "двести "
Case 3: s100$ = "триста "
Case 4: s100$ = "четыреста "
Case 5: s100$ = "пятьсот "
Case 6: s100$ = "шестьсот "
Case 7: s100$ = "семьсот "
Case 8: s100$ = "восемьсот "
Case 9: s100$ = "девятьсот "
End Select
'
' десятки
Rest% = Rest% Mod 100: Rest1% = Rest% \ 10
s1$ = ""
Select Case Rest1%
Case 0: s10$ = ""
Case 1 ' особый случай
Select Case Rest%
Case 10: s10$ = "десять "
Case 11: s10$ = "одиннадцать "
Case 12: s10$ = "двенадцать "
Case 13: s10$ = "тринадцать "
Case 14: s10$ = "четырнадцать "
Case 15: s10$ = "пятнадцать "
Case 16: s10$ = "шестнадцать "
Case 17: s10$ = "семнадцать "
Case 18: s10$ = "восемнадцать "
Case 19: s10$ = "девятнадцать "
End Select
Case 2: s10$ = "двадцать "
Case 3: s10$ = "тридцать "
Case 4: s10$ = "сорок "
Case 5: s10$ = "пятьдесят "
Case 6: s10$ = "шестьдесят "
Case 7: s10$ = "семьдесят "
Case 8: s10$ = "восемьдесят "
Case 9: s10$ = "девяносто "
End Select
'
If Rest1% <> 1 Then ' единицы
Select Case Rest% Mod 10
Case 1
Select Case Rod%
Case 1: s1$ = "один "
Case 2: s1$ = "одна "
Case 3: s1$ = "одно "
End Select
EndWord$ = w1$
Case 2
If Rod% = 2 Then s1$ = "две " Else s1$ = "два "
EndWord$ = w2to4$
Case 3: s1$ = "три ": EndWord$ = w2to4$
Case 4: s1$ = "четыре ": EndWord$ = w2to4$
Case 5: s1$ = "пять "
Case 6: s1$ = "шесть "
Case 7: s1$ = "семь "
Case 8: s1$ = "восемь "
Case 9: s1$ = "девять "
End Select
End If
'
' сборка строки
Summa$ = RTrim$(RTrim$(s100$ + s10$ + s1$ + EndWord$) + " " + Summa$)
End Sub
Dim Summa$
Summa$ = ResultSumma$(Selection.Text, 1, "Евро", "Евро", "Евро", 1)
If Summa$ <> "" Then ' допустимое значение
Selection.Text = Summa$
End If
End Sub
Public Function ResultSumma$(Source$, Rod%, w1$, w2to4$, w5to10$, iCase%)
Dim i%, Summa$
Dim Nach As Long, Dig1 As Long, Dig2 As Long, DoPosle As Boolean, Okonch$
Dim nds As Double
Nach = 0
Vchis = 0
Bucks = ""
Dig1 = 10
Dig2 = 1
DoPosle = False
Okonch$ = ""
' Проверка правильности числа
' и преобразование его в пропись
'
' Source$ - цифровая запись числа в символьном виде
' Rod, w1, w2to4, w5to10 - см. SummaString
' iCase > 0 - первую букву преобразовать в прописную
' ========================
Source$ = RTrim(Source$)
If Source$ = "" Then
MsgBox "Пустая символьная строка"
Exit Function
End If
For i = 1 To Len(Source$)
If DoPosle = False Then
Select Case Mid(Source$, i, 1)
Case "0" To "9"
Nach = Nach * Dig1 + Val(Mid(Source$, i, 1)) / Dig2
Vchis = Nach
If Dig1 = 1 Then Dig2 = Dig2 * 10
Case ",", "."
If Dig1 <> 10 Then Exit Function
Dig1 = 1
Dig2 = Dig2 * 10
DoPosle = True
Case Else
Bucks = Mid(Source$, i, 1)
MsgBox "Исходная строка содержит не цифры:" & vbCrLf & Source$
Exit Function
End Select
Else
Okonch$ = Okonch$ + Mid(Source$, i, 1)
End If
Next i
If Val(Source$) > &H7FFFFFFF Then
MsgBox "Превышен предел - 2147483647"
Exit Function
End If
Call SummaString(Summa$, Nach, Rod%, w1$, w2to4$, w5to10$)
If iCase% > 0 Then ' написать с прописной буквы
Mid$(Summa$, 1) = Chr$(Asc(Summa$) - 32)
End If
EndWord$ = w5to10$
Select Case Nach Mod 10
Case 1: EndWord$ = w1$
Case 2: EndWord$ = w2to4$
Case 3: EndWord$ = w2to4$
Case 4: EndWord$ = w2to4$
End Select
nds = Round(Nach + Val(Okonch$) / 100 - (Nach + Val(Okonch$) / 100) / 1.18, 2)
Okonch$ = RTrim(Okonch$)
ResultSumma$ = Source$ + " (" + Summa$ + " " + Okonch$ + "/100)" + EndWord$ + ", в том числе НДС 18% - " + CStr(nds) + " " + EndWord$ + " "
End Function
Sub SummaString(Summa$, Source As Long, Rod%, w1$, w2to4$, w5to10$)
'
' "Сумма прописью":
' преобразование числа из цифрого вида в символьное
' ==================================================
' Исходные данные:
' Source - число от 0 до 2147483647 (2^31-1)
' Eсли нужно оперировать с числами > 2 147 483 647
' замените описание переменных Source и TempValue на "AS DOUBLE"
'
' далее нужно задать информацию о единице изменения
' Rod% = 1 - мужской, = 2 - женский, = 3 - средний
' название единицы изменения:
' w1$ - именительный падеж единственное число (= 1)
' w2to4$ - родительный падеж единственное число (= 2-4)
' w5to10$ - родительный падеж множественное число ( = 5-10)
'
' Rod% должен быть задано обязательно, название единицы может быть
' не задано = ""
' ———————————————-
' Результат: Summa$ - запись прописью
'
'================================
Dim TempValue As Long
'
If Source& = 0 Then
Summa$ = RTrim$("ноль " + w5to10$): Exit Sub
End If
'
TempValue = Source: Summa$ = ""
' единицы
Call SummaStringThree(Summa$, TempValue, Rod%, "", "", "")
If TempValue = 0 Then Exit Sub
' тысячи
Call SummaStringThree(Summa$, TempValue, 2, "тысяча", "тысячи", "тысяч")
If TempValue = 0 Then Exit Sub
' миллионы
Call SummaStringThree(Summa$, TempValue, 1, "миллион", "миллиона", "миллионов")
If TempValue = 0 Then Exit Sub
' миллиардов
Call SummaStringThree(Summa$, TempValue, 1, "миллиард", "миллиарда", "миллиардов")
If TempValue = 0 Then Exit Sub
'
' Eсли нужно оперировать с числами > 2 147 483 647
' измените тип переменных (см. выше) и добавьте эту строку для триллионов:
' CALL SummaStringThree(Summa$, TempValue#, 1, "трилллион","триллиона", "триллионов")
' IF TempValue# = 0 THEN EXIT SUB
'
' Что идет после триллионов, я плохо представляю...
'
End Sub
Sub SummaStringThree(Summa$, TempValue As Long, Rod%, w1$, w2to4$, w5to10$)
'
' Формирования строки для трехзначного числа:
' (последний трех знаков TempValue
' Eсли нужно оперировать с числами > 2 147 483 647
' замените в описании на TempValue AS DOUBLE
'====================================
Dim Rest%, Rest1%, EndWord$, s1$, s10$, s100$
'
Rest% = TempValue& Mod 1000
TempValue& = TempValue& \ 1000
If Rest% = 0 Then ' последние три знака нулевые
If Summa$ = "" Then Summa$ = w5to10$ + " "
Exit Sub
End If
'
' начинаем подсчет с Rest
EndWord$ = w5to10$
' сотни
Select Case Rest% \ 100
Case 0: s100$ = ""
Case 1: s100$ = "сто "
Case 2: s100$ = "двести "
Case 3: s100$ = "триста "
Case 4: s100$ = "четыреста "
Case 5: s100$ = "пятьсот "
Case 6: s100$ = "шестьсот "
Case 7: s100$ = "семьсот "
Case 8: s100$ = "восемьсот "
Case 9: s100$ = "девятьсот "
End Select
'
' десятки
Rest% = Rest% Mod 100: Rest1% = Rest% \ 10
s1$ = ""
Select Case Rest1%
Case 0: s10$ = ""
Case 1 ' особый случай
Select Case Rest%
Case 10: s10$ = "десять "
Case 11: s10$ = "одиннадцать "
Case 12: s10$ = "двенадцать "
Case 13: s10$ = "тринадцать "
Case 14: s10$ = "четырнадцать "
Case 15: s10$ = "пятнадцать "
Case 16: s10$ = "шестнадцать "
Case 17: s10$ = "семнадцать "
Case 18: s10$ = "восемнадцать "
Case 19: s10$ = "девятнадцать "
End Select
Case 2: s10$ = "двадцать "
Case 3: s10$ = "тридцать "
Case 4: s10$ = "сорок "
Case 5: s10$ = "пятьдесят "
Case 6: s10$ = "шестьдесят "
Case 7: s10$ = "семьдесят "
Case 8: s10$ = "восемьдесят "
Case 9: s10$ = "девяносто "
End Select
'
If Rest1% <> 1 Then ' единицы
Select Case Rest% Mod 10
Case 1
Select Case Rod%
Case 1: s1$ = "один "
Case 2: s1$ = "одна "
Case 3: s1$ = "одно "
End Select
EndWord$ = w1$
Case 2
If Rod% = 2 Then s1$ = "две " Else s1$ = "два "
EndWord$ = w2to4$
Case 3: s1$ = "три ": EndWord$ = w2to4$
Case 4: s1$ = "четыре ": EndWord$ = w2to4$
Case 5: s1$ = "пять "
Case 6: s1$ = "шесть "
Case 7: s1$ = "семь "
Case 8: s1$ = "восемь "
Case 9: s1$ = "девять "
End Select
End If
'
' сборка строки
Summa$ = RTrim$(RTrim$(s100$ + s10$ + s1$ + EndWord$) + " " + Summa$)
End Sub
PS. Option Explicit - не помогает? Обычно в ошибках такого рода (мелких, а отсюда - всей работы программы) именно эта директива помогает решить данную проблему
PSS. Все работает и никаких пустых строк не добавляет. Только я немогу понять - замем столько кода? Сам писал? ;)
Код:
12424,88
(Двенадцать тысяч четыреста двадцать четыре 88
/100)Евро, в том числе НДС 18% - 1895.32 Евро
(Двенадцать тысяч четыреста двадцать четыре 88
/100)Евро, в том числе НДС 18% - 1895.32 Евро
Эта Option Explicit не помогла ( вот иходное число и результат работы проги. По идее все должно быть в одну строку.
Цитата: Lenich
Код:
12424,88
(Двенадцать тысяч четыреста двадцать четыре 88
/100)Евро, в том числе НДС 18% - 1895.32 Евро
(Двенадцать тысяч четыреста двадцать четыре 88
/100)Евро, в том числе НДС 18% - 1895.32 Евро
Эта Option Explicit не помогла ( вот иходное число и результат работы проги. По идее все должно быть в одну строку.
А как ты используешь данную ф-цию?
ResultSumma Text1.Text, 1, "бла", "бла", "бла", 1
Как именно ты ее юзаешь?
В ворде выделяю 12424,88 и запускаю макрос EuroStr1() и соответсвенно получаю результат в виде (столько-то столько)
Код:
Sub EuroStr1()
Dim Summa$
Summa$ = ResultSumma$(Selection.Text, 1, "Евро", "Евро", "Евро", 1)
If Summa$ <> "" Then ' допустимое значение
Summa$ = Replace(Summa$, Chr(13), "")
Selection.Text = Summa$
End If
End Sub
Dim Summa$
Summa$ = ResultSumma$(Selection.Text, 1, "Евро", "Евро", "Евро", 1)
If Summa$ <> "" Then ' допустимое значение
Summa$ = Replace(Summa$, Chr(13), "")
Selection.Text = Summa$
End If
End Sub
Цитата: pavel55
Если выделить только цифры (без пробела за ними), то результат получается в 1 строку, если же написать цифры и выделить с лишним пробелом за этими цифрами, то результат разбивается на 3 строки, видимо туда попадает знак переноса коретки. Попробуйте так (я добавил одну строку - она выделена жирным)
Код:
Sub EuroStr1()
Dim Summa$
Summa$ = ResultSumma$(Selection.Text, 1, "Евро", "Евро", "Евро", 1)
If Summa$ <> "" Then ' допустимое значение
Summa$ = Replace(Summa$, Chr(13), "")
Selection.Text = Summa$
End If
End Sub
Dim Summa$
Summa$ = ResultSumma$(Selection.Text, 1, "Евро", "Евро", "Евро", 1)
If Summa$ <> "" Then ' допустимое значение
Summa$ = Replace(Summa$, Chr(13), "")
Selection.Text = Summa$
End If
End Sub
Мысль правильная, но символ конца строки он не один, а два: vbCrlf = Chr$(13) & Chr$(10). Так что надо бы проверять так:
Summa$=Replace(Summa$,vbCrLf," ")
либо, если там только vbCr - то приведенный в цитате метод.
Цитата: Lenich
Код:
12424,88
(Двенадцать тысяч четыреста двадцать четыре 88
/100)Евро, в том числе НДС 18% - 1895.32 Евро
(Двенадцать тысяч четыреста двадцать четыре 88
/100)Евро, в том числе НДС 18% - 1895.32 Евро
Эта Option Explicit не помогла ( вот иходное число и результат работы проги. По идее все должно быть в одну строку.
Option Explicit помогает от использования необъявленных переменных и все! Что за мистификации поразводили тут?
Цитата: Залетин Виталий
Мысль правильная, но символ конца строки он не один, а два: vbCrlf = Chr$(13) & Chr$(10). Так что надо бы проверять так:
Summa$=Replace(Summa$,vbCrLf," ")
либо, если там только vbCr - то приведенный в цитате метод.
Summa$=Replace(Summa$,vbCrLf," ")
либо, если там только vbCr - то приведенный в цитате метод.
Я тестировал, мой код решает проблему автора и выводит текст в одну строку )
Спасибо! то что надо.
Залетин Виталий,
Странно, но ваш вариант не работает.