Strona 1 z 1

[SOLVED] kwota słownie

: śr wrz 09, 2020 10:55 pm
autor: Madzia
Od wielu lat używałam makra autorstwa Pana Jacka Szymona do zamiany na słowa kwot pieniężnych wyrażonych liczbowo. Ostatnio zainstalowałam KDE NEON w wersji 20.04 i zainstalowałam nową wersję LibreOffice. Pojawił się problem z tym makrem. Po pierwsze przy uruchomieniu twierdzi, że zmienna slownie została już zdefiniowana. Ta zmienna nie jest chyba w ogóle używana i chyba chodzi o to że jest funkcja o tej samej nazwie (nie znam BASICA). Usunęłam więc zmienną słownie.
Dalej pojawił się jednak problem z instrukcją znak = Mid(tx0,dlugosc-2,1). Komunikat: Akcja jest nieobsługiwana. Nieprawidłowe wywołanie procedury. Coś próbował przeczytać ale się poddałam. Gdyby ktoś pomógł mi z tym makrem, byłabym wdzięczna.

Kod: Zaznacz cały

'========= ========= ========= ========= ========= ========= =========
'Autor: Jacek Szymona
'email: ***@um.lublin.pl
'data utworzenia: 17.08.2006 r.
'licencja GPL http://gnu.org.pl/text/licencja-gnu.html
'Zestaw funkcji i procedur do przekształcania liczby zapisanej cyframi
' na wyrażenie słowne w programie "Write"
'uwaga: ta wersja przekształca liczby zapisane w postaci: 12345,67
' część całkowita nie może mieć więcej niż 15 cyfr
'użycie: po wpisaniu liczby i po ustawieniu kursora na liczbie
' należy wywołać makroinstrukcję
'wynik zapisywany jest w nawiasie po zapisie cyfrowym

Public we, wy, forma As String

Sub Slownie
Dim Dokument As Object, Cyframi As Object
Dim Kursor As Object, Kursor1 As Object
Dim tx0, txd, txc, tx1, cyd2, cyd1 As String
Dim dlugosc As Integer
Dim slownie, slownie1, slowniezl, slowniegr, znak, mianogr, mianozl As
String
Dim jednostki(), nastki(), dziesiatki(), setki()
Dim i, j, k As Integer
Dokument = ThisComponent
Kursor = Dokument.currentcontroller.getViewCursor()
Cyframi = Kursor.Text
Kursor1 = Cyframi.createTextCursorByRange(Kursor.getstart())
Kursor1.gotoStartOfWord(false)
Kursor1.gotoEndOfWord(true)

'przypisanie pobranego łańcucha do zmiennej tx0
tx0 = Kursor1.String
Kursor1.goRight(0,false)
dlugosc = Len(tx0)
znak = Mid(tx0,dlugosc-2,1)
If dlugosc < 3 or znak <> "," Then
MsgBox ("Liczba musi być w formacie: 1234,56",0,"Błąd")
Stop
End If

'GoTo grosze_slownie
'GoTo grosze_cyfrowo 'miano = groszy
GoTo grosze_cyfrowo1 'miano = /100

'część dziesiętna
grosze_slownie:
we = Right(tx0,2)
Call miano
If forma = "0" Then
wy = ""
mianogr = ""
ElseIf forma = "1" Then
mianogr = "grosz"
ElseIf forma = "2" Then
mianogr = "grosze"
Else
mianogr = "groszy"
EndIf
slowniegr = wy & mianogr
GoTo zlote_slownie

grosze_cyfrowo:
we = Right(tx0,2)
cyd1 = Mid(we,1,1)
cyd2 = Mid(we,2,1)
If cyd1 = "0" and cyd2 = "0" Then
wy = "0 "
mianogr = "groszy"
ElseIf cyd1 = "0" and cyd2 = "1" Then
wy = "1 "
mianogr = "grosz"
ElseIf cyd1 = "0" and (cyd2 = "2" or cyd2 = "3" or cyd2 = "4") Then
wy = cyd2 & " "
mianogr = "grosze"
ElseIf cyd1 = "0" Then
wy = cyd2 & " "
mianogr = "groszy"
ElseIf cyd1 = "1" Then
wy = cyd1 & cyd2 & " "
mianogr = "groszy"
ElseIf cyd2 = "2" or cyd2 = "3" or cyd2 = "4" Then
wy = cyd1 & cyd2 & " "
mianogr = "grosze"
Else
wy = cyd1 & cyd2 & " "
mianogr = "groszy"
EndIf
slowniegr = wy & mianogr
GoTo zlote_slownie

grosze_cyfrowo1:
we = Right(tx0,2)
cyd1 = Mid(we,1,1)
cyd2 = Mid(we,2,1)
If cyd1 = "0" and cyd2 = "0" Then
wy = "0"
ElseIf cyd1 = "0" and cyd2 = "1" Then
wy = "1"
ElseIf cyd1 = "0" and (cyd2 = "2" or cyd2 = "3" or cyd2 = "4") Then
wy = cyd2 & ""
ElseIf cyd1 = "0" Then
wy = cyd2 & ""
ElseIf cyd1 = "1" Then
wy = cyd1 & cyd2 & ""
ElseIf cyd2 = "2" or cyd2 = "3" or cyd2 = "4" Then
wy = cyd1 & cyd2 & ""
Else
wy = cyd1 & cyd2 & ""
EndIf
slowniegr = wy & "/100"
GoTo zlote_slownie

'część całkowita
zlote_slownie:
dlugosc = dlugosc - 3
txc = Left(tx0,dlugosc)
If dlugosc > 12 Then GoTo biliony
If dlugosc > 9 Then GoTo miliardy
If dlugosc > 6 Then GoTo miliony
If dlugosc > 3 Then GoTo tysiace
GoTo setki

biliony:
we = Left(txc,dlugosc-12)
txc = Right(txc,12)
dlugosc = 12
Call miano
If forma = "0" Then
mianozl = ""
ElseIf forma = "1" Then
mianozl = "bilion "
ElseIf forma = "2" Then
mianozl = "biliony "
Else
mianozl = "bilionów "
EndIf
slowniezl = wy & mianozl

miliardy:
we = Left(txc,dlugosc-9)
txc = Right(txc,9)
dlugosc = 9
Call miano
If forma = "0" Then
mianozl = ""
ElseIf forma = "1" Then
mianozl = "miliard "
ElseIf forma = "2" Then
mianozl = "miliardy "
Else
mianozl = "miliardów "
EndIf
slowniezl = slowniezl & wy & mianozl

miliony:
we = Left(txc,dlugosc-6)
txc = Right(txc,6)
dlugosc = 6
Call miano
If forma = "0" Then
mianozl = ""
ElseIf forma = "1" Then
mianozl = "milion "
ElseIf forma = "2" Then
mianozl = "miliony "
Else
mianozl = "milionów "
EndIf
slowniezl = slowniezl & wy & mianozl

tysiace:
we = Left(txc,dlugosc-3)
txc = Right(txc,3)
dlugosc = 3
Call miano
If forma = "0" Then
mianozl = ""
ElseIf forma = "1" Then
mianozl = "tysiąc "
ElseIf forma = "2" Then
mianozl = "tysiące "
Else
mianozl = "tysięcy "
EndIf
slowniezl = slowniezl & wy & mianozl

setki:
we = txc
Call miano
If forma = "0" Then
mianozl = "złotych"
ElseIf forma = "1" Then
mianozl = "złoty"
ElseIf forma = "2" Then
mianozl = "złote"
Else
mianozl = "złotych"
EndIf
slowniezl = slowniezl & wy & mianozl
slownie = slowniezl & " i " & slowniegr
Kursor1.String = " zł (" & slownie & ")"

End Sub


Sub miano
'Sub slow
'we = InputBox ("Wprowadź liczbę:")
Dim dl As Integer
Dim cy3, cy2, cy1 As String
Dim jednostki(), nastki(), dziesiatki(), setki()
jednostki() = jednostki1()
nastki() = nastki1()
dziesiatki() = dziesiatki1()
setki() = setki1()
dl = Len(we)
cy1 = ""
cy2 = ""
cy3 = ""
wy = ""
forma = ""

'jedna cyfra
If dl = 1 Then
cy1 = we
wy = jednostki(cy1)
If cy1 = "0" Then
forma = "0"
ElseIf cy1 = "1" Then
forma = "1"
ElseIf cy1 = "2" or cy1 = "3" or cy1 = "4" Then
forma = "2"
Else
forma = "5"
End If

'dwie cyfry
ElseIf dl = 2 Then
cy1 = Mid(we,2,1)
cy2 = Mid(we,1,1)
If cy2 = "0" Then
wy = jednostki(cy1)
If cy1 = "0" Then
forma = "0"
ElseIf cy1 = "1" Then
forma = "1"
ElseIf cy1 = "2" or cy1 = "3" or cy1 = "4" Then
forma = "2"
Else
forma = "5"
End If
ElseIf cy2 = "1" Then
wy = nastki(cy1)
forma = "5"
ElseIf cy1 = "2" or cy1 = "3" or cy1 = "4" Then
wy = dziesiatki(cy2) & jednostki(cy1)
forma = "2"
Else
wy = dziesiatki(cy2) & jednostki(cy1)
forma = "5"
End If

'trzy cyfry
Else
cy1 = Mid(we,3,1)
cy2 = Mid(we,2,1)
cy3 = Mid(we,1,1)
If cy3 = "0" and cy2 = "0" and cy1 = "0" Then
wy = ""
forma = "0"
ElseIf cy3 = "0" and cy2 = "0" Then
wy = jednostki(cy1)
If cy1 = "1" Then
forma = "1"
ElseIf cy1 = "2" or cy1 = "3" or cy1 = "4" Then
forma = "2"
Else
forma = "5"
End If
ElseIf cy3 = "0" and cy2 = "1" Then
wy = nastki(cy1)
forma = "5"
ElseIf cy3 = "0" Then
wy = dziesiatki(cy2) & jednostki(cy1)
If cy1 = "2" or cy1 = "3" or cy1 = "4" Then
forma = "2"
Else
forma = "5"
End If
ElseIf cy2 = "1" Then
wy = setki(cy3) & nastki(cy1)
forma = "5"
ElseIf cy1 = "2" or cy1 = "3" or cy1 = "4" Then
wy = setki(cy3) & dziesiatki(cy2) & jednostki(cy1)
forma = "2"
Else
wy = setki(cy3) & dziesiatki(cy2) & jednostki(cy1)
forma = "5"
End If
End If
End Sub

Function jednostki1()
jednostki1() = Array("", "jeden ", "dwa ", "trzy ", "cztery ", "pięć ", _
"sześć ", "siedem ", "osiem ", "dziewięć ")
End Function

Function nastki1()
nastki1() = Array("dziesięć ", "jedenaście ", "dwanaście ", _
"trzynaście ", "czternaście ", "piętnaście ", "szesnaście ", _
"siedemnaście ", "osiemnaście ", "dziewiętnaście ")
End Function

Function dziesiatki1()
dziesiatki1() = Array("", "", "dwadzieścia ", "trzydzieści ", _
"czterdzieści ", "pięćdziesiąt ", "sześćdziesiąt ", _
"siedemdziesiąt ", "osiemdziesiąt ", "dziewięćdziesiąt ")
End Function

Function setki1()
setki1() = Array("", "sto ", "dwieście ", "trzysta ", "czterysta ", _
"pięćset ", "sześćset ", "siedemset ", "osiemset ", "dziewięćset ")
End Function
'========= ========= ========= ========= ========= ========= =========

Re: kwota słownie

: czw wrz 10, 2020 2:47 pm
autor: Madzia
Wróciłam do LibreOffice 5.4.7.2 i wszystko działa jak należy. W zasadzie to nawet wolę starszą wersję - szybciej się uruchamia Writer.

Re: kwota słownie

: czw wrz 10, 2020 9:18 pm
autor: Jan_J
Czyli problem został zlokalizowany, dotyczy konkretnej wersji albo konkretnej konfiguracji.
Spróbowałem uruchomić funkcję Slownie() pod Writerem z LibreOffice 6.2.8.2 z instalacji 32-bitowej rpm pobranej z libreoffice.org.

Pomijając nieistotne sprawy (podział na wiersze w poście nie do końca odpowiada wymaganiom składniowym instrukcji Basica: As // String nie może być przełamane), kod pracuje poprawnie.

Downgrade do wcześniejszej wersji nie jest poważnym rozwiązaniem. Jeżeli ktokolwiek by próbował dojść przyczyny, warto żeby wiedział, jaka wersja Writera i z jakiej / skąd pobranej instalacji sprawiła problem.

[SOVLED] Re: kwota słownie

: pt wrz 11, 2020 2:10 pm
autor: Madzia
https://pl.libreoffice.org/ - wersja 7.0.0 w paczkach deb. Nie wiem czy problem nie tkwił w kodowaniu znaków w pliku txt z którego kopiowałam makro. Pewnie sprawdzę to jeszcze raz chociaż z wcześniejszej wersji jestem bardziej zadowolona bo nie ma opóźnienia przy otwieraniu dokumentu. Dziękuję za sprawdzenie. Samo makro może nie jest dziełem sztuki za to bardzo się przydaje.

Re: [SOLVED] kwota słownie

: pt wrz 11, 2020 3:29 pm
autor: Jan_J
Wersja 7.0 jest wydana głównie po to, by usuwać z niej błędy siłami społeczności. Więc może coś nie działać trojako: przez błąd w tekście źródłowym modułu (kodowanie: utf-8), przez zamierzone zmiany w specyfikacji (mało prawdopodobne) albo przez błąd w obsłudze, np. w automatycznej migracji z poprzednich wersji.
Warto sprawdzić w 6.4. Dla mnie na razie 6.2 jest najwyższą dostępną wersją, bo wciąż pracuję w systemach 32-bitowych, a samemu kompilować Libre mi się po prostu nie chce.