Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 27893 Skopiuj do schowka Sprawdzanie poprawności wpisanego NIP-u
Autor Wiadomość
szunaj85 
forumowicz


Posty: 20
Wysłany: 2012-02-07, 20:30   Sprawdzanie poprawności wpisanego NIP-u

Kod:
Option Explicit

Function Czy_poprawny_NIP(ByVal sNIP As String) As Boolean
'***************************************************************
' Pobrano z http://www.bardzki.pl
' -------------------------------
' Mozesz korzystac z ponizszego kodu w dowolnych zastosowaniach
' pod warunkiem pozostawienia tego komentarza.
' Usunięcie komentarza bedzie naruszeniem praw autorskich
' i jest zagrozone sankcjami wynikajacymi z prawa autorskiego
' i praw pokrewnych.
'***************************************************************

    Dim aWagi As Variant            'zmienna tablicowa, do ktorej przypiszemy tablice wag
    Dim nSuma As Long               'zmianna, do ktorej przypiszemy sume iloczynow
    Dim lPoprawny_NIP As Boolean    'True - jesli NIP jest poprawnie zweryfikowany
    Dim i As Integer                'zmienna iteracyjna
   
    lPoprawny_NIP = False                       'zakladamy, ze NIP jest bledy
    aWagi = Array(6, 5, 7, 2, 3, 4, 5, 6, 7)    'tablica wartosci wag algorytmu Luhn'a
    sNIP = Trim(sNIP)                           'dla pewnosci usuwamy niedrukowalne znaki przed i za numerem NIP
    sNIP = Replace(sNIP, " ", "")               'usuwamy wszystkie znaki " "
    sNIP = Replace(sNIP, "-", "")               'usuwamy wszystkie znaki "-"
    nSuma = 0                                   'zerujemy zmienna sumatora

    If IsNumeric(sNIP) And Len(sNIP) = 10 Then      'jesli NIP sklada sie dokladnie z 10-ciu cyfr to ...
        For i = 1 To 9          'dla 9-ciu znakow wyliczamy iloczyny waga[i] * NIP[i]
            nSuma = nSuma + aWagi(i - 1) * CInt(Mid(sNIP, i, 1))
        Next i
        If (nSuma Mod 11) = CInt(Right(sNIP, 1)) Then lPoprawny_NIP = True 'jesli wyliczona reszta = cyfrze kontrolnej NIP jest poprawny
    End If
   
    Czy_poprawny_NIP = lPoprawny_NIP
End Function


Znalazłem taki kod. W tej chwili kod ten sprawdza nip w kolumnie A i wyświetla wynik w postaci "PRAWDA" lub "FAŁSZ" w kolumnie B. Jak go przebudować tak aby zamiast wyświetlać wynik w kolumnie B podświetlał w czasie rzeczywistym na kolor tylko tą komórkę gdzie NIP jest źle wpisany?
Dla ułatwienia dodałem załącznik.

czy_poprawny_nip.rar
Pobierz Plik ściągnięto 7 raz(y) 17.84 KB

ID posta: 147805 Skopiuj do schowka
 
 

EXCELFORUM.pl POLECA - Bezplatne triki prosto na skrzynke email

wuzeq
Excel Expert



Pomógł: 142 razy
Posty: 451
Wysłany: 2012-02-07, 23:19   

Ustaw formatowanie warunkowe na podstawie formuły
Kod:
=NIE(Czy_poprawny_NIP(A2))

i ustawić formatowanie oraz odpowiedni zakres
ID posta: 147831 Skopiuj do schowka
 
 

EXCELFORUM.pl POLECA - Bezplatne triki prosto na skrzynke email

szunaj85 
forumowicz


Posty: 20
Wysłany: 2012-02-08, 13:24   

Widzę, że tu nie powinno być problemu bo wygląda, że działa.
Jednak za błędne bierze on również puste, nie wypełnione komórki z kolumny A. Da się temu jakoś zapobiec?
ID posta: 147877 Skopiuj do schowka
 
 
wuzeq
Excel Expert



Pomógł: 142 razy
Posty: 451
Wysłany: 2012-02-08, 14:28   

Kod:
=ORAZ(A1<>"";NIE(Czy_poprawny_NIP(A1)))
ID posta: 147888 Skopiuj do schowka
 
 

EXCELFORUM.pl POLECA - Bezplatne triki prosto na skrzynke email

OShon 
Excel Expert



Zaproszone osoby: 41
Pomógł: 620 razy
Posty: 2037
Wysłany: 2012-02-08, 15:59   

No to myślę ze to jest rozwiązanie jakie interesuje pytającego:
Kod:
Public Function CzyNIPPoprawny(sNIP As String) As Integer
Dim iWagi As Variant, i As Integer, iSumaKon As Integer
Application.Volatile
On Error GoTo Err_CzyNIPPoprawny
iWagi = Array(6, 5, 7, 2, 3, 4, 5, 6, 7)

If Len(sNIP) <> 10 Then Err.Raise 1 + 512
For i = LBound(iWagi) To UBound(iWagi)
    iSumaKon = iSumaKon + (iWagi(i) * CInt(Mid(sNIP, i + 1, 1)))
Next i

iSumaKon = iSumaKon Mod 11
CzyNIPPoprawny = CBool(CInt(Mid(sNIP, 10, 1)) = iSumaKon)

Exit_CzyNIPPoprawny:
    Exit Function
   
Err_CzyNIPPoprawny:
    CzyNIPPoprawny = 0
    Err.Clear
    Resume Exit_CzyNIPPoprawny
End Function


XL_Formatowanie_warunkowe_NIP.png
Plik ściągnięto 14 raz(y) 88.94 KB

_________________
MVP Office System, moderator Outlook.pl|WSS.pl|CodeGuru.pl, praca: Business Developer, blog: VBATools
ID posta: 147900 Skopiuj do schowka
 
 
szunaj85 
forumowicz


Posty: 20
Wysłany: 2012-02-08, 17:24   

Cytat:
No to myślę ze to jest rozwiązanie jakie interesuje pytającego:

Owszem jak najbardziej zainteresowało, ale kod ma jedną wadę, mianowicie nie akceptuje NIP-ów z myślnikami, czyli w formacie xxx-xxx-xx-xx oraz xxx-xx-xx-xxx tylko w formie ciągu znaków. Poza tym tak jak już wcześniej napisałem również w tym wypadku za błędne bierze on również puste, nie wypełnione komórki.
ID posta: 147922 Skopiuj do schowka
 
 

EXCELFORUM.pl POLECA - Bezplatne triki prosto na skrzynke email

Raffix 
EXCELent Man



Pomógł: 3 razy
Posty: 115
Wysłany: 2012-02-08, 19:22   

A ja proponowałbym do wprowadzania danych użyć userforma, w userformie wstawić odpowiednie maski dla textboxów (dostępne na FAQ) plus kodzik na sprawdzenie poprawności przed wprowadzeniem do arkusza i nigdy i nie będziesz miał problemu z błędnymi nipami :-) i
_________________
Wiedza to nie nauka, wiedza to doświadczenie!
ID posta: 147938 Skopiuj do schowka
 
 
OShon 
Excel Expert



Zaproszone osoby: 41
Pomógł: 620 razy
Posty: 2037
Wysłany: 2012-02-08, 20:44   

szunaj85 napisał/a:
Owszem jak najbardziej zainteresowało, ale kod ma jedną wadę, mianowicie nie akceptuje NIP-ów z myślnikami

zupa tam "wade"...
a możesz wprowadzić do funkcji usunięcie kresek? a wyjdzie na to samo:
Kod:
sNIP = Replace(sNIP, "-", "")

A co za problem wprowadzić następną regułę do formatowani, która by nie realizowała następnej:

XL_Formatowanie_warunkowe_NIP2.png
Plik ściągnięto 11 raz(y) 53.21 KB

_________________
MVP Office System, moderator Outlook.pl|WSS.pl|CodeGuru.pl, praca: Business Developer, blog: VBATools
ID posta: 147944 Skopiuj do schowka
 
 

EXCELFORUM.pl POLECA - Bezplatne triki prosto na skrzynke email

wuzeq
Excel Expert



Pomógł: 142 razy
Posty: 451
Wysłany: 2012-02-09, 16:30   

A po co wprowadzać dwie reguły, jak można to umieścić w jednej ? Patrz post powyżej
ID posta: 148050 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.marketingNET.pl

Archiwum