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.