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