Домашняя страница Undo Do Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/выделить цифры для передачи функции как аргумент - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
выделить цифры для передачи функции как аргумент
карандаш Дата: Среда, 15.04.2015, 11:00 | Сообщение № 1
Группа: Проверенные
Ранг: Обитатель
Сообщений: 329
Репутация: 8 ±
Замечаний: 0% ±

2010
Есть замечательная функция http://www.excelworld.ru/board/vba/udf/sum_in_words/8-1-0-52
Переводит число в слова
Хотелось бы её приспособить для употребления простыми пользователями.
А именно. Вот есть текст с указанием суммы (числа) цифрами с возможными "вкраплениями" разделителей и запятой.
Пользователь ставит указатель в произвольное место числа. Необходимо выделить вокруг указателя все цифры (даже разделённые знаками пробел, ', неразрывный пробел, запятая); преобразовать строку в число и передать выделенное в функцию. Функция возвращает строку. Эту строку вставить после выделенного числа.
Наример:

в сумме 32 043,34 руб.

в сумме 32 043,34 (тридцать две тысячи сорок три) руб.

Суть проблемы - в выделении цифр, которые могут перемежаться знаками отделения, мешающими выделить число двойным кликом и затем получением "чистого" числа
К сообщению приложен файл: NumToStr.docx (67.8 Kb)
 
Ответить
СообщениеЕсть замечательная функция http://www.excelworld.ru/board/vba/udf/sum_in_words/8-1-0-52
Переводит число в слова
Хотелось бы её приспособить для употребления простыми пользователями.
А именно. Вот есть текст с указанием суммы (числа) цифрами с возможными "вкраплениями" разделителей и запятой.
Пользователь ставит указатель в произвольное место числа. Необходимо выделить вокруг указателя все цифры (даже разделённые знаками пробел, ', неразрывный пробел, запятая); преобразовать строку в число и передать выделенное в функцию. Функция возвращает строку. Эту строку вставить после выделенного числа.
Наример:

в сумме 32 043,34 руб.

в сумме 32 043,34 (тридцать две тысячи сорок три) руб.

Суть проблемы - в выделении цифр, которые могут перемежаться знаками отделения, мешающими выделить число двойным кликом и затем получением "чистого" числа

Автор - карандаш
Дата добавления - 15.04.2015 в 11:00
nilem Дата: Среда, 15.04.2015, 14:28 | Сообщение № 2
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
карандаш, привет
попробуйте вот так
при открытии файла должен добавиться пунктик контекстного меню "Сумма прописью"
выделяем, например, "2’320’043,34 ", щелкаем ПКМ - выбираем Сумма прописью.
при закрытии файла пунктик должен удаляться
"Замечательную функцию" взял как есть

[p.s.]заброшу Excel :)[/p.s.]
К сообщению приложен файл: 7433754.docm (83.5 Kb)


Яндекс.Деньги 4100159601573

Сообщение отредактировал nilem - Среда, 15.04.2015, 14:30
 
Ответить
Сообщениекарандаш, привет
попробуйте вот так
при открытии файла должен добавиться пунктик контекстного меню "Сумма прописью"
выделяем, например, "2’320’043,34 ", щелкаем ПКМ - выбираем Сумма прописью.
при закрытии файла пунктик должен удаляться
"Замечательную функцию" взял как есть

[p.s.]заброшу Excel :)[/p.s.]

Автор - nilem
Дата добавления - 15.04.2015 в 14:28
RAN Дата: Среда, 15.04.2015, 14:40 | Сообщение № 3
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеДалеко лежит.

Автор - RAN
Дата добавления - 15.04.2015 в 14:40
карандаш Дата: Среда, 15.04.2015, 14:56 | Сообщение № 4
Группа: Проверенные
Ранг: Обитатель
Сообщений: 329
Репутация: 8 ±
Замечаний: 0% ±

2010
спасибо
интересно как инструмент добавления функции во всплывающий список по ПКМ


Сообщение отредактировал карандаш - Среда, 15.04.2015, 18:30
 
Ответить
Сообщениеспасибо
интересно как инструмент добавления функции во всплывающий список по ПКМ

Автор - карандаш
Дата добавления - 15.04.2015 в 14:56
карандаш Дата: Среда, 15.04.2015, 18:30 | Сообщение № 5
Группа: Проверенные
Ранг: Обитатель
Сообщений: 329
Репутация: 8 ±
Замечаний: 0% ±

2010
RAN, спасибо, изучаю
 
Ответить
СообщениеRAN, спасибо, изучаю

Автор - карандаш
Дата добавления - 15.04.2015 в 18:30
карандаш Дата: Четверг, 16.04.2015, 01:39 | Сообщение № 6
Группа: Проверенные
Ранг: Обитатель
Сообщений: 329
Репутация: 8 ±
Замечаний: 0% ±

2010
изучил что смог
получилось два куска
в одном обработка и анализ - в другом известная функция
хотелось получить универсальный макрос - чтобы если нет упоминания о рублях (FlagRub=False), то тогда просто целое число писалось бы в скобках словами без добавления "руб.")
для этого надо функцию разбить на две части - постоянную (для целых числе) и добавочную (елси надо добавить "руб" и копейки)
Копейки получилось оторвать, а с рублями заминка вышла
вот код
[vba]
Код
Function СУМ_ПРОП$(ByVal ЧИСЛО#)   ' http://www.excelworld.ru/forum/3-9902-1 Author MCH (Михаил Ч.), май 2012
     Dim rub$, kop$, ed, des, sot, nadc, RAZR, i&, m$
     If ЧИСЛО >= 1E+15 Or ЧИСЛО < 0 Then Exit Function
     sot = Array("", "сто ", "двести ", "триста ", "четыреста ", "пятьсот ", "шестьсот ", "семьсот ", "восемьсот ", "девятьсот ")
     des = Array("", "", "двадцать ", "тридцать ", "сорок ", "пятьдесят ", "шестьдесят ", "семьдесят ", "восемьдесят ", "девяносто ")
     nadc = Array("десять ", "одиннадцать ", "двенадцать ", "тринадцать ", "четырнадцать ", "пятнадцать ", "шестнадцать ", "семнадцать ", "восемнадцать ", "девятнадцать ")
     ed = Array("", "один ", "два ", "три ", "четыре ", "пять ", "шесть ", "семь ", "восемь ", "девять ", "", "одна ", "две ")
     RAZR = Array("триллион ", "триллиона ", "триллионов ", "миллиард ", "миллиарда ", "миллиардов ", "миллион ", "миллиона ", "миллионов ", "тысяча ", "тысячи ", "тысяч ", "", "", "")
     rub = Left(Format(ЧИСЛО, "000000000000000.00"), 15)
     kop = Right(Format(ЧИСЛО, "0.00"), 2)
     If CDbl(rub) = 0 Then m = "ноль "
     For i = 1 To Len(rub) Step 3
         If Mid(rub, i, 3) <> "000" Or i = Len(rub) - 2 Then
             m = m & sot(CInt(Mid(rub, i, 1))) & IIf(Mid(rub, i + 1, 1) = "1", nadc(CInt(Mid(rub, i + 2, 1))), _
                     des(CInt(Mid(rub, i + 1, 1))) & ed(CInt(Mid(rub, i + 2, 1)) + IIf(i = Len(rub) - 5 And CInt(Mid(rub, i + 2, 1)) < 3, 10, 0))) & _
                     IIf(Mid(rub, i + 1, 1) = "1" Or (Mid(rub, i + 2, 1) + 9) Mod 10 >= 4, RAZR(i + 1), IIf(Mid(rub, i + 2, 1) = "1", RAZR(i - 1), RAZR(i)))
         End If
     Next i
     СУМ_ПРОП = "(" & UCase(Left(m, 1)) & Mid(m, 2) & " рубл" & IIf(rub \ 10 = 1 Or ((rub + 9) Mod 10) >= 4, "ей ", IIf(rub Mod 10 = 1, "ь ", "я ")) & _
                "" 'kop & " копе" & IIf(kop \ 10 = 1 Or ((kop + 9) Mod 10) >= 4, "ек)", IIf(kop Mod 10 = 1, "йка)", "йки)"))
End Function

Sub Макрос1()

Dim i, rr, n, nt, nz As Integer, ch, sFigs, sNum As String, FlagRub As Boolean
'
With Selection
' выделяем цифры и допустимые знаки разделения
     .End = .Start
     .MoveStartWhile "0123456789, " & Chr(160) & Chr(39) & Chr(96) & Chr(145) & Chr(146), wdBackward
     .MoveEndWhile "0123456789, " & Chr(160) & Chr(39) & Chr(96) & Chr(145) & Chr(146), wdForward
' проверяем выделенное на валидность
     If .End = .Start Then Exit Sub
     sFigs = Replace(Replace(Replace(Replace(Replace(Replace(.Text, " ", ""), Chr(160), ""), Chr(39), ""), Chr(96), ""), Chr(145), ""), Chr(146), "")
     n = Len(sFigs)
     If n = 0 Then Exit Sub
     nz = Len(sFigs) - Len(Replace(sFigs, ",", ""))
     'nt = Len(sFigs) - Len(Replace(sFigs, ".", ""))
     If nz > 1 Then i = MsgBox("Лишние запятые (больше одной)", 64): Exit Sub
     'If nt > 1 Then i = MsgBox("Лишние точки (больше одной)", 64): Exit Sub
     'If nz + nt > 1 Then i = MsgBox("Оставьте в качестве разделителя целой и дробной части либо точку, либо запятую", 64): Exit Sub
     'If n - nz - nt < 1 Then Exit Sub
' убираем текст с цифрами
     .Text = ""
' ищем слово "Руб*"
     .MoveEndWhile "рублейяь. ", wdForward:   FlagRub = False
     sNum = Replace(Replace(Replace(Replace(Replace(.Text, "л", ""), "е", ""), "й", ""), ".", ""), " ", "")
     If sNum = "руб" Then FlagRub = True
' убираем текст с "руб*", чтобы потом вставить "правильный" текст
     .Text = ""
     rr = Int(sFigs) ' преобразование из строки в целое число
     n = sFigs ' преобразование из строки в число
     .Text = " " & Replace(Trim(Format(n, "### ### ### ### ##0")), " ", Chr(160)): .Start = .End
      
     If FlagRub Then .Text = " руб. ": .Start = .End
      
     Dim NNN
     With CreateObject("VBScript.RegExp"): .Global = True: .Pattern = "\D": NNN = sFigs: End With
     .Text = СУМ_ПРОП(NNN): .Start = .End
     If Not FlagRub Then .Text = ")": Exit Sub
     kop = Right(Format(n, "0.00"), 2): .Start = .End
     .Text = kop & " копе" & IIf(kop \ 10 = 1 Or ((kop + 9) Mod 10) >= 4, "ек)", IIf(kop Mod 10 = 1, "йка)", "йки)"))
End With

End Sub
[/vba]
 
Ответить
Сообщениеизучил что смог
получилось два куска
в одном обработка и анализ - в другом известная функция
хотелось получить универсальный макрос - чтобы если нет упоминания о рублях (FlagRub=False), то тогда просто целое число писалось бы в скобках словами без добавления "руб.")
для этого надо функцию разбить на две части - постоянную (для целых числе) и добавочную (елси надо добавить "руб" и копейки)
Копейки получилось оторвать, а с рублями заминка вышла
вот код
[vba]
Код
Function СУМ_ПРОП$(ByVal ЧИСЛО#)   ' http://www.excelworld.ru/forum/3-9902-1 Author MCH (Михаил Ч.), май 2012
     Dim rub$, kop$, ed, des, sot, nadc, RAZR, i&, m$
     If ЧИСЛО >= 1E+15 Or ЧИСЛО < 0 Then Exit Function
     sot = Array("", "сто ", "двести ", "триста ", "четыреста ", "пятьсот ", "шестьсот ", "семьсот ", "восемьсот ", "девятьсот ")
     des = Array("", "", "двадцать ", "тридцать ", "сорок ", "пятьдесят ", "шестьдесят ", "семьдесят ", "восемьдесят ", "девяносто ")
     nadc = Array("десять ", "одиннадцать ", "двенадцать ", "тринадцать ", "четырнадцать ", "пятнадцать ", "шестнадцать ", "семнадцать ", "восемнадцать ", "девятнадцать ")
     ed = Array("", "один ", "два ", "три ", "четыре ", "пять ", "шесть ", "семь ", "восемь ", "девять ", "", "одна ", "две ")
     RAZR = Array("триллион ", "триллиона ", "триллионов ", "миллиард ", "миллиарда ", "миллиардов ", "миллион ", "миллиона ", "миллионов ", "тысяча ", "тысячи ", "тысяч ", "", "", "")
     rub = Left(Format(ЧИСЛО, "000000000000000.00"), 15)
     kop = Right(Format(ЧИСЛО, "0.00"), 2)
     If CDbl(rub) = 0 Then m = "ноль "
     For i = 1 To Len(rub) Step 3
         If Mid(rub, i, 3) <> "000" Or i = Len(rub) - 2 Then
             m = m & sot(CInt(Mid(rub, i, 1))) & IIf(Mid(rub, i + 1, 1) = "1", nadc(CInt(Mid(rub, i + 2, 1))), _
                     des(CInt(Mid(rub, i + 1, 1))) & ed(CInt(Mid(rub, i + 2, 1)) + IIf(i = Len(rub) - 5 And CInt(Mid(rub, i + 2, 1)) < 3, 10, 0))) & _
                     IIf(Mid(rub, i + 1, 1) = "1" Or (Mid(rub, i + 2, 1) + 9) Mod 10 >= 4, RAZR(i + 1), IIf(Mid(rub, i + 2, 1) = "1", RAZR(i - 1), RAZR(i)))
         End If
     Next i
     СУМ_ПРОП = "(" & UCase(Left(m, 1)) & Mid(m, 2) & " рубл" & IIf(rub \ 10 = 1 Or ((rub + 9) Mod 10) >= 4, "ей ", IIf(rub Mod 10 = 1, "ь ", "я ")) & _
                "" 'kop & " копе" & IIf(kop \ 10 = 1 Or ((kop + 9) Mod 10) >= 4, "ек)", IIf(kop Mod 10 = 1, "йка)", "йки)"))
End Function

Sub Макрос1()

Dim i, rr, n, nt, nz As Integer, ch, sFigs, sNum As String, FlagRub As Boolean
'
With Selection
' выделяем цифры и допустимые знаки разделения
     .End = .Start
     .MoveStartWhile "0123456789, " & Chr(160) & Chr(39) & Chr(96) & Chr(145) & Chr(146), wdBackward
     .MoveEndWhile "0123456789, " & Chr(160) & Chr(39) & Chr(96) & Chr(145) & Chr(146), wdForward
' проверяем выделенное на валидность
     If .End = .Start Then Exit Sub
     sFigs = Replace(Replace(Replace(Replace(Replace(Replace(.Text, " ", ""), Chr(160), ""), Chr(39), ""), Chr(96), ""), Chr(145), ""), Chr(146), "")
     n = Len(sFigs)
     If n = 0 Then Exit Sub
     nz = Len(sFigs) - Len(Replace(sFigs, ",", ""))
     'nt = Len(sFigs) - Len(Replace(sFigs, ".", ""))
     If nz > 1 Then i = MsgBox("Лишние запятые (больше одной)", 64): Exit Sub
     'If nt > 1 Then i = MsgBox("Лишние точки (больше одной)", 64): Exit Sub
     'If nz + nt > 1 Then i = MsgBox("Оставьте в качестве разделителя целой и дробной части либо точку, либо запятую", 64): Exit Sub
     'If n - nz - nt < 1 Then Exit Sub
' убираем текст с цифрами
     .Text = ""
' ищем слово "Руб*"
     .MoveEndWhile "рублейяь. ", wdForward:   FlagRub = False
     sNum = Replace(Replace(Replace(Replace(Replace(.Text, "л", ""), "е", ""), "й", ""), ".", ""), " ", "")
     If sNum = "руб" Then FlagRub = True
' убираем текст с "руб*", чтобы потом вставить "правильный" текст
     .Text = ""
     rr = Int(sFigs) ' преобразование из строки в целое число
     n = sFigs ' преобразование из строки в число
     .Text = " " & Replace(Trim(Format(n, "### ### ### ### ##0")), " ", Chr(160)): .Start = .End
      
     If FlagRub Then .Text = " руб. ": .Start = .End
      
     Dim NNN
     With CreateObject("VBScript.RegExp"): .Global = True: .Pattern = "\D": NNN = sFigs: End With
     .Text = СУМ_ПРОП(NNN): .Start = .End
     If Not FlagRub Then .Text = ")": Exit Sub
     kop = Right(Format(n, "0.00"), 2): .Start = .End
     .Text = kop & " копе" & IIf(kop \ 10 = 1 Or ((kop + 9) Mod 10) >= 4, "ек)", IIf(kop Mod 10 = 1, "йка)", "йки)"))
End With

End Sub
[/vba]

Автор - карандаш
Дата добавления - 16.04.2015 в 01:39
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!