Podczas pisania makr gdy robię coś na szybko i potrzebuję pobrać jakąś informację od użytkownika to używam instrukcji InputBox. Oto prosty przykład:
Sub TestInputBoxa()
Dim Odp As String
Dim LiczbaDni As Long
Odp = InputBox("Z ilu ostatnich dni mam załadować dane", _
"Zestawienie sprzedaży", "7")
If Odp = "" Then
MsgBox "Anulowano", vbExclamation
Exit Sub
End If
If Not IsNumeric(Odp) Then
MsgBox "Należało wprowadzić liczbę a nie tekst!!", vbExclamation
Exit Sub
End If
LiczbaDni = Val(Odp)
MsgBox "Poniżej wpisz kod generujący raport z " & Odp & " ostatnich dni", vbInformation
End Sub
Niestety, ale owe okienko nie wygląda zbyt okazale
Tutaj mała uwaga: funkcja InputBox zwraca wartość typu String. Jeśli zwróci pusty ciąg znaków, to znaczy, że użytkownik kliknął w przycisk Anuluj (Cancel).
W tym okienku chciałem pobrać od użytkownika liczbę. Niestety, ale złośliwy użytkownik może wpisać jakiś tekst, dlatego warto jest przeprowadzić walidację danych wprowadzonych przez użytkownika (stąd ta instrukcja If Not IsNumeric(Odp) Then)
W Excelu (nie ma tego w Wordzie, ani np. w Accessie) mogę wywołać metodę InputBox z obiektu Application. Ten inny InputBox ma trzy zalety: po pierwsze okienko jest nieco ładniejsze, po drugie przyciski mają polskie nazwy (OK i Anuluj a nie OK i Cancel) oraz mogę ustalić jakiego typu dane (parametr Type) użytkownik ma wprowadzać. Oto prosty kod:
Sub TestInputBoxa2()
Dim Odp As Variant
Odp = Application.InputBox(Prompt:="Z ilu ostatnich dni mam załadować dane", _
Title:="Zestawienie sprzedaży", Default:="7", Type:=1)
If Odp = False Then
MsgBox "Anulowano", vbExclamation
Exit Sub
End If
Odp = Int(Odp) 'Zamień na liczbę całkowitą
MsgBox "Poniżej wpisz kod generujący raport z " & Odp & " ostatnich dni", vbInformation
End Sub
A tak wygląda owe okienko:
Tutaj jest mała różnica. Otóż ta metoda zwraca wartość typu Variant. Jeśli użytkownik kliknie w przycisk Anuluj to zmienna zwróci wartość False. Jeśli parametr Type przyjmuje wartość 1 to metoda zwraca wartość Typu Double, jeśli Type przyjmuje wartość 2 to metoda zwraca wartość typu String. Jeśli zamiast liczby wpiszę tekst to pojawi się standardowy komunikat błędu (nie muszę walidować wprowadzonych danych)
Parametr Type może przyjmować następujące wartości:
Wartość parametru Type | Opis |
0 | Formuła |
1 | Liczba |
2 | Tekst (string) |
4 | Wartość logiczna (True lub False) |
8 | Odwołanie do komórki (obiekt typu Range) |
16 | Wartość błędu #N/A |
64 | Tablica wartości |
W drugim przykładzie w wywołaniu inputboxa są jakieś dziwne znaki równości z dwukropkiem. Co to za dziwny zapis? Takie dziwactwo było w języku Pascal, ale w VBA pewnie zapis ten oznacza. o innego.
@LS – To pytanie to jest ciekawy temat na kolejny wpis 🙂