MCH написал: По трем запускам "MSumPropUkrSelect" у меня немного опередила "СуммаПрописью"
Значит скорость отрабатывания зависит еще и от железа (а может еще и от версии офиса). Раз такая песня, что разница в скорости отрабатывании кода на уровне погрешности, то ваш вариант намного красивее. Привожу ваш код полностью на Select (без фичи со Static). А в прикрепленном файле 2 варианта со Static и без.
Код
Option Explicit
Function MSumPropUkr$(chislo#) 'Автор MCH (Михаил Ч.), май 2012
Dim rub$, kop$, ed, des, sot, nadc, razr, i&, m$
If chislo >= 1E+15 Or chislo < 0 Then Exit Function
sot = Array("", "сто ", "двісті ", "триста ", "чотириста ", "п'ятсот ", "шістсот ", "сімсот ", "вісімсот ", "дев'ятсот ")
des = Array("", "", "двадцять ", "тридцять ", "сорок ", "п'ятдесят ", "шістдесят ", "сімдесят ", "вісімдесят ", "дев'яносто ")
nadc = Array("десять ", "одинадцять ", "дванадцять ", "тринадцять ", "чотирнадцять ", "п'ятнадцять ", "шістнадцять ", "сімнадцять ", "вісімнадцять ", "дев'ятнадцять ")
ed = Array("", "один ", "два ", "три ", "чотири ", "п'ять ", "шість ", "сім ", "вісім ", "дев'ять ", "", "одна ", "дві ")
razr = Array("трильйон ", "трильйона ", "трильйонів ", "мільярд ", "мільярда ", "мільярдів ", "мільйон ", "мільйона ", "мільйонів ", "тисяча ", "тисячі ", "тисяч ", "гривня ", "гривні ", "гривень ")
rub = Left(Format(chislo, "000000000000000.00"), 15)
kop = Right(Format(chislo, "0.00"), 2)
If CDbl(rub) = 0 Then
m = "нуль " & razr(UBound(razr))
Else
For i = 1 To Len(rub) - 6 Step 3
If Mid(rub, i, 3) <> "000" Then
m = m & sot(CInt(Mid(rub, i, 1)))
Select Case Mid(rub, i + 1, 1)
Case "1"
m = m & nadc(CInt(Mid(rub, i + 2, 1))) & razr(i + 1)
Case Else
m = m & des(CInt(Mid(rub, i + 1, 1))) & ed(CInt(Mid(rub, i + 2, 1)))
Select Case Mid(rub, i + 2, 1)
Case "1"
m = m & razr(i - 1)
Case "2", "3", "4"
m = m & razr(i)
Case Else
m = m & razr(i + 1)
End Select
End Select
End If
Next i
For i = Len(rub) - 5 To Len(rub) Step 3
If Mid(rub, i, 3) <> "000" Then
m = m & sot(CInt(Mid(rub, i, 1)))
Select Case Mid(rub, i + 1, 1)
Case "1"
m = m & nadc(CInt(Mid(rub, i + 2, 1))) & razr(i + 1)
Case Else
m = m & des(CInt(Mid(rub, i + 1, 1)))
Select Case Mid(rub, i + 2, 1)
Case "1"
m = m & ed(11) & razr(i - 1)
Case "2"
m = m & ed(12) & razr(i)
Case "3", "4"
m = m & ed(CInt(Mid(rub, i + 2, 1))) & razr(i)
Case Else
m = m & ed(CInt(Mid(rub, i + 2, 1))) & razr(i + 1)
End Select
End Select
End If
Next i
End If
m = m & kop & " копі"
Select Case Left(kop, 1)
Case "1"
m = m & "йок"
Case Else
Select Case Mid(kop, 2)
Case "1"
m = m & "йка"
Case "2", "3", "4"
m = m & "йки"
Case Else
m = m & "йок"
End Select
End Select
MSumPropUkr = UCase(Left(m, 1)) & Mid(m, 2)
End Function
Спасибо Михаил. Просмотрел вашу функцию [в файле в Module2]. Перевел её на If (работает быстрее) [в файле в Module3]. А потом чуток допилил до Select (работает ещё быстрее) [в файле в Module4]. Но я не смог добиться того, чтобы MSumPropUkr работал быстрее СуммаПрописью. Привожу результат теста на моем компьютере:
Скорость работы проверял предложенным вами способом. Код в файле "Сравнение.xmls" P.s. про БМВ наврал - да он не предлагал способов сравнения скорости обработки кода.
sokol92 написал: MSumPropUkr получает первый приз.
Я не уследил о каком примере вы говорите. Поделитесь, пожалуйста, кодом. Чтобы не изобретать велосипед из костылей. А то я могу. И не говорите что вы меня не знаете
К сожалению уперся в невозможность инициализировать массив значениями при подгрузке модуля. Поэтому накостылял как мог. P.s. функционал добавлен из-за просьбы в личку (вывод рублей и гривен в полном и коротком варианте). Удаление из кода литералов, содержащих русские буквы в планах. Но вы меня знаете - я могу опять на пол года пропасть.
Огромнейшее спасибо! Я не гуру, поэтому и не знаю как точнее определить разницу скорости. Да и сравнивать скорости отрабатывания в екселе вообще не представляю как. Насколько я помню то принцип был - составить число из столбца A и записать время за которое была проведена операция. Потом посчитать среднее. Косяк который я подметил - это 0 времени в некоторых случаях (наверное просто ескель так округлил значение). Поэтому и попросил перепроверить того кто больше в этом шарит. P.s. отключал все шевеления екселя, потому что время затрачиваемое на заполнение ячейки данными было в разы больше чем время затрачиваемое на выполнение функции. Что в очередной раз показывает, что интерес быстродействия - чисто спортивный.
БМВ, да-да. А я уже и забыл про этот косяк. В идеале я хотел вообще через Const сделать. Но не смог. И примеров не нашел. Подскажите, как исправить, или где найти пример, в котором задается константный массив.
То-есть если написать функцию с буквами кириллицы и сохранит как надстройку, то при загрузке надстройки на компе с другой кодировкой проблем не будет? Или как? Вопрос в том как не морочить себе голову. А пусть этим занимается компьютер.
Ігор Гончаренко, ваш код - швейцарский нож (конечно не для всех языков, а для украинско- и русскоподобных). И главная фича кода - добавление этих языков за пол минуты. Может я недостаточно явно это описал. Стоит также отметить, что эта функция обычно используется 1-3 раза на весь лист (в основном для составления счетов на оплату, по крайней мере так в моей конторе). Поэтому мултитул (пусть даже более медленный) будет предпочтительней - разница в наносекунды не заметна, а вот недостаток функционала серьезно напрягает (например не хватает языка). Мой код ради спортивного интереса - проверить как сделать то-же с меньшими затратами ресурсов ПК. А в итоге, если можно будет всунуть те же фичи за меньшие "деньги" - то такой вариант будет предпочтительней.
А я и не горячусю. Я делюсь и жду обоснованной критики. Спасибо за ваш пример. Я правильно понял, что в вашем примере решен вопрос когда у иностранцев иероглифы вместо букв?
Простите, что пропал. Скачал все примерчики, расковырял и даже сверял кто быстрее работает. Но итогами своих наблюдений так и не поделился. И честно говоря уже подзабыл какой вариант быстрее работал (поковырял файлик Сравнение СуммПрописью и вспомнил). Ігор Гончаренко привел (ПрописПримеры.xlsm) самый медленный код, но самый крутой для быстрой подмены языка. На основе всего увиденного разработал свой вариант. Он оказался самым быстрым (где-то в 100 раз быстрее кода Игоря и в 30 раз быстрее самого быстрого, найденного мной аналога). В то же время мой код не так уж сложен в доработке. Но он заточен только под 1 язык. Переточить под другой язык, похожий на русский и украинский - дело полу часа (я вообще за 5 минут это сделаю). Делюсь своими наработками в файле СуммаПрописьюОтИН Файл Сравнение СуммПрописью - показывает как я сравнивал скорость работы алгоритмов. Но объяснять что там я не буду - сами разбирайтесь, кому интересно. Буду рад если кто-то проведет свой тест скорости отрабатывания моего алгоритма в сравнении с другими. А то в 30-100 раз быстрее остальных - я и сам себе не верю. При том там нет чего-то сверх сложного.
Спасибо вам, что поделились своими трудами. На досуге просмотрю что да как у вас устроено в логике ваших решений. И постараюсь сделать ссылки на облачные хранилища со всеми собранными в этой теме материалами, чтоб не терялись труды (мало ли).
Ігор Гончаренко написал: у меня есть функция Пропис (публиковалась тут)
Извините, но ссылок нет (может модераторы свой сайт охраняют, а может вы её забыли вставить). Добавьте пожалуйста ссылку, или прикрепите к комментарию свое творение (или и то и другое). А то описанная вами функция довольно крутая. И думаю многим еще пригодится.
В интернете нашел надстройку "sumprop.xla", но в ней есть оИшибка: "2002002002" получается "Две миллиарда две миллиона две тысячи две гривны 00 копеек" Диапазон от 0 до 999999999999 Функции: СуммаПрописью, СуммаПрописьюЕвро, СуммаПрописьюДоллары, СуммаПрописьюГривны Исправил ошибку "sumpropRU.xla" (в "sumprop.xla" неверно применялся женский род и разряд тысяч был через костыль) Перевел на украинский "sumpropUK.xla" (ну и поменял логику из-за разницы между "п’ятдесят" и "пятьдесят" - загвоздка в мягком знаке)
А так-же нашел на этом форуме решение для одного извращенца без макросов "sumpropUK_notVBA.xls" (сам не проверял, но в теме вроде не ругались на автора)
Нужно преобразовать число денег в текст. "124,45" в "сто двадцять чотири гривні 45 копійок". Будет круто собрать здесь решения на других языках (кроме русского и украинского). Читал, что на английском есть, но в своей работе не применял и не проверял. -- Это не вопрос. Просто постфактум делюсь своим решением. Мог бы в уже существующие темы написать, но они архивные.
Да вы скажете это уже было. Если так, то помогите найти.
Мне нужно как если бы я в столбец записал разные строки, а потом сразу после последней строчки начинаю вводить текст и эксель подсказывает как завершить строку. Только такое автозавершение должно происходить на одном листе, а столбец с примерами строк на другом листе.