Jak dodać zera wiodące

przez | 2024-01-21

Załóżmy, że przechowujemy pewną wartość w zmiennej a. Chcemy utworzyć plik o odpowiedniej nazwie, ale aby łatwiej się sortowało pliki w folderze chcemy, aby nazwa była poprzedzona odpowiednią liczbą zer wiodących. Tj. zamiast 1 ma być 00001 zamiast 123 ma być 00123 itp.

Dodać zera wiodące do pliku można na wiele różnych sposobów (pokażę 3 sposoby średnie i 2 błyskotliwe). Oto prosta funkcja, która będzie wywoływała nasze testowe funkcje:

Sub Testy()
    Dim Liczba As Long
    Dim Liczba2 As String

    Liczba = 1
    'Liczba = 12
    'Liczba = 123
    'Liczba = 1234
    'Liczba = 12345
    
    Liczba2 = ZeraWiodaceIF(Liczba)
    'Liczba2 = ZeraWiodaceSelectCase(Liczba)
    'Liczba2 = ZeraWiodacePetlaFor(Liczba)
    'Liczba2 = ZeraWiodaceRight(Liczba)
    'Liczba2 = ZeraWiodaceFormat(Liczba)
    
    MsgBox "Liczba z zerami wiodącymi: " & Liczba2, vbInformation
End Sub

Najprostsza rzecz jaka mi przychodzi do głowy, to sprawdzenie za pomocą instrukcji IF w jaki przedział wpada dana liczba i zwrócenie jej poprzedzonej odpowiednią liczbą zer z przodu:

Function ZeraWiodaceIF(Liczba As Long) As String
    Dim Liczba2 As String
    If Liczba < 10 Then Liczba2 = "0000" + CStr(Liczba)
    If Liczba >= 10 And Liczba < 100 Then Liczba2 = "000" + CStr(Liczba)
    If Liczba >= 100 And Liczba < 1000 Then Liczba2 = "00" + CStr(Liczba)
    If Liczba >= 1000 And Liczba < 10000 Then Liczba2 = "0" + CStr(Liczba)
    If Liczba >= 10000 Then Liczba2 = CStr(Liczba)
    
    ZeraWiodaceIF = Liczba2
End Function

Kod jest bardzo prosty, można coś takiego na szybko napisać, ale ma pewną wadę: im więcej cyfr może mieć nasza liczba, tym więcej trzeba dawać kolejnych IFów.

Zamiast „litanii” instrukcji IF możemy zastosować instrukcję Select Case.

Function ZeraWiodaceSelectCase(Liczba As Long) As String
    Dim Liczba2 As String
    
    Select Case Liczba
        Case 0 To 9
            Liczba2 = "0000" + CStr(Liczba)
            
        Case 10 To 99
            Liczba2 = "000" + CStr(Liczba)
            
        Case 100 To 999
            Liczba2 = "00" + CStr(Liczba)
            
        Case 1000 To 9999
            Liczba2 = "0" + CStr(Liczba)
            
        Case Else
            Liczba2 = CStr(Liczba)
    End Select
    
    ZeraWiodaceSelectCase = Liczba2
End Function

Kod jest czytelniejszy niż w przypadku litanii IFów, ale dalej rozwlekły.

Kolejny przykład to użycie pętli for. Tutaj sprawdzamy ile znaków zajmuje nasza liczba po przekonwertowaniu na tekst i za pomocą pętli For dodajemy na początku naszej zmiennej tekstowej kolejne zera w każdym przebiegu pętli.

Function ZeraWiodacePetlaFor(Liczba As Long) As String
    Dim Liczba2 As String
    Dim IleCyfr As Long
    Dim IleDodacZer As Long
    Dim a As Long

    Liczba2 = CStr(Liczba) 'Zamień liczbę na tekst
    
    'Sprawdź ile liczb ma nasza cyfra
    IleCyfr = Len(Liczba2)
    IleDodacZer = 5 - IleCyfr
    
    'Dodaj z przodu odpowiednią liczbę zer
    For a = 1 To IleDodacZer
        Liczba2 = "0" + Liczba2
    Next a
    
    ZeraWiodacePetlaFor = Liczba2
End Function

Zaleta kodu jest łatwość w konserwacji – jeśli chcemy aby nasza liczba miała dokładnie 8 znaków a nie 5 wystarczy w linijce IleDodacZer = 5 – IleCyfr zmienić 5 na 8.

Powyższe przykłady były dość toporne. Kiedyś natrafiłem na ciekawszą koncepcję. Po przekonwertowaniu liczby na tekst wystarczy z przodu dodać 4 zera (najmniejsza możliwa liczba ma zawsze długość 1 znaku) a następnie za pomocą funkcji tekstowej Right wyciągnąć 5 ostatnich znaków z naszego ciągu (przykładowo jak do liczby 123 dokleimy cztery zera to mamy tekst 0000123 a za pomocą funkcji tekstowej Right wyciągamy wartość 0000123).

Function ZeraWiodaceRight(Liczba As Long) As String
    Dim Liczba2 As String
    
    'Do liczby dodaj z przodu 4 zera (najmniejsza możliwa liczba ma 1 cyfrę)
    Liczba2 = "0000" + CStr(Liczba)
    
    'Wyciągnij 5 ostatnich cyfr z naszej liczby
    Liczba2 = Right$(Liczba2, 5)
    
    ZeraWiodaceRight = Liczba2
End Function

Jednak ostatnio wymyśliłem dużo prostszą koncepcję. Otóż mamy funkcję format, która formatuje liczbę w zadanym przez nas formacie (w formułach Excela mamy podobną funkcję o nazwie TEKST).

Function ZeraWiodaceFormat(Liczba As Long) As String
    ZeraWiodaceFormat = Format(Liczba, "00000")
End Function

Uwaga: powyższe funkcje nie mają „zabezpieczenia” na wypadek, gdyby liczba podana przez użytkownika była np. 6-cyfrowa. Prawie wszystkie wyżej wymienione funkcje zwrócą liczbę 6-cyfrową (bez dodawania zer wiodących) ale funkcja ZeraWiodaceRight zwróci 5 ostatnich cyfr z naszej 6-cyfrowej liczby.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.