Private Sub UkryjSkoroszytMakrOsobistych() On Error Resume Next

Transkrypt

Private Sub UkryjSkoroszytMakrOsobistych() On Error Resume Next
Private Sub UkryjSkoroszytMakrOsobistych()
On Error Resume Next
'sprawdzamy, czy jest to Office 2010 lub 2007
If Application.Version = "14.0" Or Application.Version = "12.0" Then
Windows("PERSONAL.XLSB").Visible = True
Else
'Office 2003 lub starsze wersje
Windows("PERSONAL.XLS").Visible = True
End If
ThisWorkbook.Save
End Sub
Private Sub Workbook_Open()
UkryjSkoroszytMakrOsobistych
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
UkryjSkoroszytMakrOsobistych
End Sub
‘---------------- Klasa CKwotaSlownie
' deklaracja zmiennych prywatnych klasy
Private myT As Range ' tu będzie przechowywany obszar pomocniczych danych
Private mTp As String ' ta zmienna będzie zawierać kwotę słownie
Private mMilion As Boolean ' zmienna wskaźnikowa
Private mTysiac As Boolean ' zmienna wskaźnikowa
' deklaracja typu użytkownika
Private Type slownie
x As Double
xd As Integer
tp As String
End Type
Public Function KwotaSlownie(ByVal xp As Double) As String
' utworzenie obiektu typu RANGE (obszaru), wskazuje on na obszar pomocniczych danych
Set myT = Workbooks("Personal.xlsb").Worksheets("Slownie").Range("A1:j10")
' przypisanie do nazwy metody wyniku zwróconego przez prywatną funkcję Ustal
KwotaSlownie = Ustal(xp)
End Function
Private Function PartOfSlownie(ByVal xp As Double, ByVal d As Integer, _
ByVal i As Integer) As slownie
' prywatna, pomocnicza funcja odpowiedzialna za ustalenie słownego
' odpowiednika kwoty na wskazanej pozycji dziesiętnej
' deklaracja prywatnych zmiennych tej funkcji
Dim xd As Integer
Dim CzyKilkanascie As Boolean
CzyKilkanascie = False
' obliczenia
If d = 7 Or d = 4 Or d = 1 Then CzyKilkanascie = True
xd = Int(xp / (10 ^ d))
' użycie struktury wiążącej (WITH ... END WITH)
With PartOfSlownie
If CzyKilkanascie And xd = 1 Then
xd = Int(xp * 10 / (10 ^ d))
.x = xp - xd * (10 ^ d) / 10
.xd = xd
.tp = myT.Cells(xd - 10 + 1, i + 1)
1
If d = 7 Then
mMilion = True
ElseIf d = 4 Then
mTysiac = True
End If
Else
.x = xp - xd * (10 ^ d)
.xd = xd
.tp = myT.Cells(xd + 1, i)
If d = 6 Then
mMilion = True
ElseIf d = 3 Then
mTysiac = True
End If
End If
' budujemy tekst "słownie"
mTp = mTp & .tp
If d = 6 And mTp <> "" Then
If mMilion And xd > 0 Then
mTp = mTp & " " & myT.Cells(xd + 1, 9)
Else
mTp = mTp & " milionów"
End If
End If
If d = 3 And mTp <> "" Then
If mTysiac And xd > 0 Then
mTp = mTp & " " & myT(xd + 1, 6) '" tysięcy"
Else
mTp = mTp & " tysięcy"
End If
End If
If mTp <> "" Then mTp = mTp & " "
End With ' koniec struktury wiążącej
End Function
Private Function Ustal(ByVal xp As Double) As String
' funkcja zaczyna swoją pracę od sprawdzenia, czy kwota jest z założonego przedziału
If xp > 0 And xp < 1000000000 Then
' tak, zaczynamy obliczenia
Dim y As slownie
mMilion = False ' wartość True ma identyfikować kwotę rzędu pojedynczego miliona
mTysiac = False ' wartość True ma identyfikować fragment kwoty odpowiadajacy pojedynczem tysiącom
mTp = ""
'Dim P() As Integer = {4, 2, 1, 4, 2, 1, 4, 2, 1}
y.x = xp
'
For i = 8 To 0 Step -1
If y.x < 1 Then Exit For
y = PartOfSlownie(y.x, i, myT.Cells(i + 2, 10))
Next i
If mTp = "" Then
mTp = "zero"
Else
mTp = Left(mTp, Len(mTp) - 1)
End If
' funkcja iif bada, czy chodzi o kilkanascie złotych
mTp = mTp & " " & myT.Cells(IIf(y.xd > 10, 1, y.xd + 1), 7)
If y.x > 0 Then
y.x = Round(y.x * 100, 0)
mTp = mTp & " i "
For i = 1 To 0 Step -1
If y.x = 0 Then
y.xd = 0
2
Exit For
End If
y = PartOfSlownie(y.x, i, myT.Cells(i + 2, 10))
Next
If y.xd = 0 Then
mTp = mTp & " groszy"
Else
mTp = mTp & myT.Cells(y.xd + 1, 8)
End If
Else
mTp = mTp & " i zero groszy"
End If
Ustal = LTrim(mTp)
Else
' nie, zwracamy stosowny komunikat
Ustal = "Podana kwota jest mniejsza od 0 lub większa od 1 000 000 000"
End If
End Function
‘-------------------- klasa CNrb
Option Base 0
Private mNrb As String
Private mT() As String
Private mKomunikat As String
Private mWynik As Boolean
'
Public Function NRB(ByVal tp As String) As String
Dim i As Integer, t As String, xp As Long
'66928300064480200000004472
tp = Replace(tp, " ", "")
If Not Len(tp) = 26 Then
mWynik = False
mKomunikat = "Niepoprawny numer r-ku bankowego"
Else
Dim tt As String
tt = "1,10,3,30,9,90,27,76,81,34,49,5,50,15,53,45,62,38,89,17,73,51,25,56,75,71,31,19,93,57"
mT = Split(tt, ",")
tp = tp & "2521"
t = Right(tp, Len(tp) - 2) & Mid(tp, 1, 2)
'Debug.Print t
xp = 0
For i = 1 To 30
xp = xp + Val(mT(i - 1)) * Val(Mid(t, Len(t) - i + 1, 1))
Next i
If xp Mod 97 = 1 Then
mWynik = True
mKomunikat = "OK!"
Else
mWynik = False
mKomunikat = "Niepoprawny numer r-ku bankowego"
End If
End If
NRB = mKomunikat
End Function
‘------- Klasa CPesel -------------Private mTp As String
Private mWynik As Boolean
Private mKomunikat As String
Public Function KontrolaPesel(ByVal tp As String) As String
3
Dim t As String
t = "1379137913"
mKomunikat = "Poprawny!"
If Len(tp) <> 11 Then
mKomunikat = "Pesel musi zawierać 11 znaków!"
Else
'Dim w() As Integer = {1, 3, 7, 9, 1, 3, 7, 9, 1, 3} ' tw="1379137913"
Dim i As Integer, x As Integer, y As Integer, z As Integer
For i = 1 To 10
x = x + Val(Mid(t, i, 1)) * Val(Mid(tp, i, 1))
Next i
y = x Mod 10
z = 10 - y
If z = 10 Then z = 0
If Val(Mid(tp, 11, 1)) = z Then
mWynik = True
Else
mKomunikat = "Wprowadzonu ciąg znaków nie jest numerem Pesel!"
mWynik = False
End If
End If
KontrolaPesel = mKomunikat
End Function
‘ modul FunkcjeJG ---Public Function KwotaJG(ByVal xd As Double) As String
' deklarujemy i tworzymy instację (obiekt) klasy CKwotaSlownie
Dim w As New CKwotaSlownie
' do nazwy funkcji przypisujemy publiczną metodę KwotaSlownie przekazując do niej
' jako argument zmienną xd
KwotaJG = w.KwotaSlownie(xd)
End Function
'
Public Function SprawdzPesel(ByVal t As String) As String
Dim w As New CPesel
SprawdzPesel = w.KontrolaPesel(t)
End Function
'
Public Function SprawdzNRB(ByVal t As String) As String
Dim w As New CNrb
SprawdzNRB = w.NRB(t)
End Function
4

Podobne dokumenty