Sprawdzenie, czy użytkownik ustawił komórkę aktywną w zakresie danych

Często występującym problemem jest próba uruchomienia kodu wymagającego zakresu danych, w czasie gdy użytkownik:

  • nie ustawił się w zakresie danych (stoi w pustej komórce poza zakresem)
  • nie uaktywnił właściwego typu arkusza (np stoi w arkuszu typu wykres)
  • nie uaktywnił właściwego typu okna (np stoi na oknie wykresu osadzonego w arkuszu)

Tu z pomocą mogą przyjść nam 3 sprawdzające to funkcje logiczne:

Option Explicit
Public Const WERSJA = "Wykresy VBA v.0.1 (Akademia-VBA.pl)"
 
Private Function NienormalnyArkusz() As Boolean
    If ActiveSheet.Type <> xlWorksheet Then
        MsgBox "Ustaw się w arkuszu danych!", vbExclamation, WERSJA
        NienormalnyArkusz = True
    End If
End Function
 
Private Function NienormalneOkno() As Boolean
    If ActiveWindow.Type <> xlWorkbook Then
        MsgBox "Ustaw się w oknie danych!", vbExclamation, WERSJA
        NienormalneOkno = True
    End If
End Function
 
Private Function BrakZakresu() As Boolean
    If Len(ActiveCell) = 0 Then
        MsgBox "Ustaw się w niepustej komórce zakresu danych!", vbExclamation, WERSJA
        BrakZakresu = True
    End If
End Function

Takie funkcje bardzo upraszczają kod procedury głównej, w naszym przypadku uruchamiającej formularz generujący wykresy. Powinny być raczej prywatne, ponieważ nie są zbyt przydatne jako funkcje arkuszowe

Sub UruchomFormularz()
    If NienormalnyArkusz Then Exit Sub
    If NienormalneOkno Then Exit Sub
    If BrakZakresu Then Exit Sub
    fmWykresy.Show
End Sub

  1. Hej

    Czy abstrahując od zróżnicowania komunikatów nie załatwiłoby czasem dwóch pierwszych przypadków:
    [cc lang=”vb”]
    If TypeName(Selection)<>„Range” …
    [/cc]
    PS. I chyba warto zaznaczyć, że w Twoich funkcjach istotna jest kolejność ich wywołania w procedurze UruchomFormularz.

    Pzdr
    TFZ

  2. No oczywiście, że jeszcze nigdy w życiu nie użyłem tej jakże interesującej funkcji 🙂
    Kolejność wywołania też oczywiście ma znaczenie
    Dzięki za uwagi 🙂

Dodaj komentarz

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