Dec 21 2009

Wtorki z VBA cz. 10 – Pobieranie zakresu od użytkownika

Posted by Marcin

W poprzedniej części kursu VBA opisałem jak pobrać dane od użytkownika i wprowadzić je do komórki arkusza. Jednak tamten sposób - choć wystarczający do większości zastosowań - to nie kres możliwości Excela i VBA: dziś dowiemy się w jaki sposób umożliwić użytkownikowi zaznaczanie zakresu, wpisywanie tylko liczb, tylko tekstu i wiele innych.

Bardziej zaawansowane narzędzie to metoda InputBox Excela. Podkreślam metody Excela, a nie funkcji VBA o tej samej nazwie, którą opisałem w ostatnim poście. Są one różne i wykorzystujemy je w różnych sytuacjach.

Metoda InputBox Excela wywoływana jest następująco:

 
Application.InputBox(Prompt, Title, Default, Left, Top,
HelpFile, HelpContextID, Type)
 

gdzie:

  • Prompt - to komunikat, który będzie wyświetlany w oknie dialogowym.
  • Title (opcjonalnie) - to tytuł okna dialogowego.
  • Default (opcjonalnie) - to wartość, która pojawi się domyślnie przy pojawieniu się okna.
  • Left, Top (opcjonalnie) - współrzędne (w pikselach) lewego, górnego rogu naszego okna.
  • HelpFile, HelpContextID (opcjonalnie) - nazwa pliku pomocy i ID sekcji w tym pliku, który zawiera pomoc dla okna.
  • Type (opcjonalnie) - określa typ danych, które mają być wprowadzone do okna dialogowego. Jeśli pominiemy ten argument, to domyślnie w oknie dialogowym będzie można wprawdzać tekst.

Typ danych zwracany przez tę metodę jest oczywiście zdeterminowany tym co wpisze użytkownik (i co mu pozwolimy wpisać określając to argumentem Type), dlatego zalecam zawsze podawać argument Type. A poniżej podaję Wam listę możliwości dla tego argumentu:

  • 0 - formuła. Podana jest jako tekst, np.: "=SUMA(A1:A10)".
  • 1 - wartość numeryczna
  • 2 - wartość tekstowa
  • 4 - wartość logiczna (True lub False)
  • 8 - zakres
  • 16 - wartość błędu, jak np.: #N/A
  • 64 - tablica danych

Jeśli chcemy dać użytkownikowi możliwość wpisywania kilku różnych typów wartości możemy podać ich sumę, np.: 1=2 umożliwi wpisywanie zarówno liczby jak i tekst.

Czas na przykład użycia. Poniższa procedure zapyta użytkownika o zakres, a następnie tekst w zaznaczonym zakresie zostanie pogrubiony, podkreślony oraz pochylony.

 
Sub WyroznijTekst()
 
Dim Zakres As Range
 
    On Error Resume Next
    Set Zakres = Application.InputBox("Zaznacz zakres",
"Przykład", , , , , ,8)
    On Error GoTo 0
    If Zakres Is Nothing Then
        MsgBox "Wciśnięto ANULUJ"
    Else
        With Zakres.Font
            .Bold = True
            .Italic = True
            .Underline = True
        End With
    End If
End Sub
 

A teraz omówienie:
On Error Resume Next jest instrukcją powodującą ignorowanie błędu, który wystąpiłby, gdyby użytkownik kliknął przycisk Anuluj. Konsekwentnie, On Error GoTo 0 przywraca normalną obsługę błędów.

Ponieważ zdefiniowaliśmy typ pobieranych danych jako Zakres (argument Type ustawiony na 8) to do zmiennej zadeklarowanej jako Range musimy przypisać wartość za pomocą instrukcji Set. Jeśli pominęlibyśmy instrukcję Set do zmiennej przypisalibyśmy wartość zaznaczonych komórek, zamiast zakresu.

Samo wywołanie metody InputBox powoduje wywołanie okna dialogowego jak na poniższym rysunku:

Pobranie zakresu

Wystarczy teraz zaznaczyć dowolny zakres komórek (lub kilka zakresów) i kliknięcie przycisku OK spowoduje wykonanie pozostałych instrukcji (With...End With). Rezultat jest na kolejnym rysunku:

Wynik działania

Jeśli naciśniecie Anuluj do zmiennej Zakres nie zostanie przypisana żadna wartość - wtedy nasze makro wyświetli stosowny komunikat.

Jak widzicie użycie metody InputBox nie jest skomplikowane a daje nam duże możliwości. Jedyne o czym musimy pamiętać, to zabezpieczać się przed błędami i przerwaniem działania makra, poprzez obsługę błędów (instrukcje On Error...).

Powiązane artykuły:

Leave a Reply