Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2015, 17:31   #1
Jaroslav
Форумчанин
 
Регистрация: 08.06.2009
Сообщений: 179
По умолчанию сума прописью

У меня есть готовая функция, которая пишет сумму прописью (сайт "http://moonexcel.com.ua"). Пишется она так:
=SUMINWORDS(текст;валюта;сотые). Например, =SUMINWORDS(2565,28;"грн.";"коп.")
Но она почему не отображается в функциях, определенных пользователем. Подскажите, пожалуйста, в чем может быть проблема

Код:
Function SUMINWORDS(n As Double, curr As Variant, kop As Variant) As String  
 'moonexcel.com.ua   
 Dim Nums1, Nums2, Nums3, Nums4 As Variant  
   
 Nums0 = Array("", "одна ", "дві ", "три ", "чотири ", "п'ять ", "шість ", "сім ", "вісім ", "дев'ять ")  
 Nums1 = Array("", "один ", "два ", "три ", "чотири ", "п'ять ", "шість ", "сім ", "вісім ", "дев'ять ")  
 Nums2 = Array("", "десять ", "двадцять ", "тридцять ", "сорок ", "п'ятдесят ", "шістдесят ", "сімдесят ", _  
                        "вісімдесят ", "дев'яносто ")  
 Nums3 = Array("", "сто ", "двісті ", "триста ", "чотириста ", "п'ятсот ", "шістсот ", "сімсот ", _  
                        "вісімсот ", "дев'ятсот ")  
 Nums4 = Array("", "одна ", "дві ", "три ", "чотири ", "п'ять ", "шість ", "сім ", "вісім ", "дев'ять ")  
 Nums5 = Array("десять ", "одинадцять ", "дванадцять ", "тринадцять ", "чотирнадцять ", _  
                        "п'ятнадцять ", "шістнадцять ", "сімнадцять ", "вісімнадцять ", "дев'ятнадцять ")  
    
 If n < 1 Then  
   SUMINWORDS = "Нуль " & curr & " " & Round((n - Fix(n)) * 100) & " " & kop  
     
If curr = "" Then  
   SUMINWORDS = "Нуль"  
End If  
        
   Exit Function  
 End If  
 'розділяємо число на розряди, використовуючи допоміжну функцію Class  
 ed = Class(n, 1)  
 dec = Class(n, 2)  
 sot = Class(n, 3)  
 tys = Class(n, 4)  
 dectys = Class(n, 5)  
 sottys = Class(n, 6)  
 mil = Class(n, 7)  
 decmil = Class(n, 8)  
 sotmil = Class(n, 9)  
 bil = Class(n, 10)  
     
'перевіряємо мільярди  
   
 Select Case bil  
   
Case 1  
     bil_txt = Nums1(bil) & "мільярд "  
Case 2 To 4  
     bil_txt = Nums1(bil) & "мільярди "  
Case 5 To 9  
     bil_txt = Nums1(bil) & "мільярдів "  
            
 End Select  
     
'перевіряємо мільйони  
   
 Select Case sotmil  
   Case 1 To 9  
     sotmil_txt = Nums3(sotmil)  
 End Select  
    
 Select Case decmil  
   Case 1  
     mil_txt = Nums5(mil) & "мільйонів "  
     GoTo www  
   Case 2 To 9  
     decmil_txt = Nums2(decmil)  
 End Select  
   
 Select Case mil  
 Case 0  
     If decmil > 0 Then mil_txt = Nums4(mil) & "мільйонів "  
   Case 1  
     mil_txt = Nums1(mil) & "мільйон "  
   Case 2, 3, 4  
     mil_txt = Nums1(mil) & "мільйона "  
   Case 5 To 9  
     mil_txt = Nums1(mil) & "мільйонів "  
 End Select  
   
 If decmil = 0 And mil = 0 And sotmil <> 0 Then sotmil_txt = sotmil_txt & "мільйонів "  
   
www:  
 sottys_txt = Nums3(sottys)  
 'перевіряємо тисячі  
 Select Case dectys  
   Case 1  
     tys_txt = Nums5(tys) & "тисяч "  
     GoTo eee  
   Case 2 To 9  
     dectys_txt = Nums2(dectys)  
 End Select  
   
 Select Case tys  
   Case 0  
     If dectys > 0 Then tys_txt = Nums4(tys) & "тисяч "  
   Case 1  
     tys_txt = Nums4(tys) & "тисячa "  
   Case 2, 3, 4  
     tys_txt = Nums4(tys) & "тисячі "  
   Case 5 To 9  
     tys_txt = Nums4(tys) & "тисяч "  
 End Select  
   
 If dectys = 0 And tys = 0 And sottys <> 0 Then sottys_txt = sottys_txt & " тисяч "  
   
eee:  
 sot_txt = Nums3(sot)  
 'перевіряємо десятки  
 Select Case dec  
   Case 1  
     ed_txt = Nums5(ed)  
     GoTo rrr  
   Case 2 To 9  
     dec_txt = Nums2(dec)  
 End Select  
    
 ed_txt = Nums0(ed)  
  
rrr:  
'формуємо підсумковий рядок  
   
 SUMINWORDS = bil_txt & sotmil_txt & decmil_txt & mil_txt & sottys_txt & dectys_txt _  
 & tys_txt & sot_txt & dec_txt & ed_txt & curr & " " & Round((n - Fix(n)) * 100) & " " & kop  
  
If curr = "" Then  
   SUMINWORDS = bil_txt & sotmil_txt & decmil_txt & mil_txt & sottys_txt & dectys_txt _  
 & tys_txt & sot_txt & dec_txt & ed_txt  
 End If  
   
 SUMINWORDS = UCase(Mid(SUMINWORDS, 1, 1)) + Mid(SUMINWORDS, 2)  
   
End Function  
    
'допоміжна функція для виділення з числа розрядів  
Private Function Class(M, I)  
  Class = Int(Int(M - (10 ^ I) * Int(M / (10 ^ I))) / 10 ^ (I - 1))  
End Function
Jaroslav вне форума Ответить с цитированием
Старый 05.03.2015, 17:42   #2
Jaroslav
Форумчанин
 
Регистрация: 08.06.2009
Сообщений: 179
По умолчанию

Она попала в меню Управление макросами. Как ее перетащить в меню "Определенные пользователем"? У меня ексель 2003
Jaroslav вне форума Ответить с цитированием
Старый 07.03.2015, 10:52   #3
aequit
 
Регистрация: 25.02.2015
Сообщений: 5
По умолчанию Ещё вариант

Может это подойдёт?


Код:
'=========================================================
' Author: nerv            | E-mail: nerv-net@yandex.ru
' Last Update: 06/08/2011 | Яндекс.Деньги: 41001156540584
'=========================================================
Private x1, x2, x3, x4

Public Function io$(ByRef objCell As Object, Optional L As Boolean = False)
Dim s$, r$
x1 = Array("", "один ", "два ", "три ", "чотири ", "п'ять ", "шість ", "сім ", "вісім ", "дев'ять ", "", "одна ", "дві "): ReDim Preserve x1(0 To 12)
x2 = Array("десять ", "одиннадцять ", "дванадцать ", "тринадцять ", "чотырнадцять ", "п'ятнадцять ", "шеітнадцять ", "сімнадцять ", "вісімнадцять ", "дев'ятнадцять "): ReDim Preserve x2(10 To 19)
x3 = Array("двадцять ", "тридцять ", "сорок ", "п'ятдесят ", "шістдесят ", "сімдесят ", "вісімідеят ", "дев'яносто "): ReDim Preserve x3(2 To 9)
x4 = Array("", "сто ", "двісті ", "триста ", "чотириста ", "п'ятсот ", "шістсот ", "сімсот ", "вісімсот ", "дев'ятсот "): ReDim Preserve x4(0 To 9)
If IsNumeric(objCell) Then
    s = Format(objCell, "#0.00"): r = Right(s, 2): s = Left(s, InStr(1, s, ",") - 1)
    If Len(s) <= 13 Then
        io = IIf(s = "0", "нуль ", ""): s = String(13 - Len(s), "0") & s
        io = io & IIf(Not L, Rank(Right(s, 3), 1, False) & " " & r & " " & Rank(r, 0, False), "")
    Else: io = "Слишком большое число": Exit Function: End If
    io = x1(Mid(s, 1, 1)) & Rank(Mid(s, 1, 1), 5) & x4(Mid(s, 2, 1)) & Rank2(Mid(s, 3, 2)) & Rank(Mid(s, 2, 3), 4) & _
    x4(Mid(s, 5, 1)) & Rank2(Mid(s, 6, 2)) & Rank(Mid(s, 5, 3), 3) & x4(Mid(s, 8, 1)) & Rank2(Mid(s, 9, 2), False) & _
    Rank(Mid(s, 8, 3), 2) & x4(Mid(s, 11, 1)) & Rank2(Mid(s, 12, 2), L) & io
Else: io = "Недопустимые аргументы функции": End If
End Function

Private Function Rank$(ByVal s$, ByVal i As Byte, Optional ByVal z As Boolean = True)
Dim x: x = Array("копі", "грив", "тисяч", "мільйон", "мільярд", "трильйон")
If s Or Not z Then
    s = IIf(Right(s, 2) < 21, Right(s, 2), Mid(s, Len(s), 1))
    Select Case Val(s)
        Case 1: Rank = x(i) & Choose(i + 1, "йка", "ня", "а ", " ", " ", " ")
        Case 2 To 4: Rank = x(i) & Choose(i + 1, "йки", "нi", "і ", "и ", "и ", "и ")
        Case Else: Rank = x(i) & Choose(i + 1, "йок", "ень", " ", "ів ", "ів ", "ів ")
    End Select
End If
End Function

Private Function Rank2$(ByVal s As Byte, Optional ByVal x As Boolean = True)
Dim i As Byte: If Not x Then If Right(s, 1) < 3 Then i = 10
If s > 19 Then Rank2 = x3(Mid(s, 1, 1)) & x1(Mid(s, 2, 1) + i) Else _
If s > 9 Then Rank2 = x2(Mid(s, 1, 2)) Else Rank2 = x1(Mid(s, 1, 1) + i)
End Function
aequit вне форума Ответить с цитированием
Старый 10.03.2015, 14:10   #4
Jaroslav
Форумчанин
 
Регистрация: 08.06.2009
Сообщений: 179
По умолчанию

Спасибо, aequit. Эта функция также подходит
Jaroslav вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сума чисел Kozak_Aleksei Помощь студентам 3 08.02.2012 22:42
Сума бесконечного ряда tadalox Паскаль, Turbo Pascal, PascalABC.NET 1 30.01.2012 02:30
сума столбиков динамического масива mansp Общие вопросы C/C++ 4 07.11.2010 20:12
От чего программа сходит сума? duhduhduh Общие вопросы Delphi 1 18.01.2010 01:25
Сума ряда С++ Smile.id Помощь студентам 3 14.10.2009 12:37