Scripting.FileSystemObject

Scripting.FileSystemObject to obiekt VBA służący do zarządzania plikami i  folderami. Wprawdzie w kodzie VBA są dostępne proste i przyjemne funkcje Dir, MkDir itp., ale przy odwołaniach do folderów sieciowych niestety zawodzą. Wówczas pozostaje wykorzystanie właśnie obiektu FileSystemObject, popularnie nazywanym FSO.

Dostępne są tu następujące właściwości i metody:

  • GetDrive – informacje o napędzie (dysku)
  • GetFolder – informacje o folderze
  • GetFile– informacje o pliku
  • CreateFolder – tworzenie folderu
  • CreateFile – tworzenie pliku
  • DeleteFolder – usuwanie folderu
  • DeleteFile – usuwanie pliku
  • CopyFolder – kopiowanie folderu
  • CopyFile – kopiowanie pliku
  • MoveFolder – przenoszenie folderu
  • MoveFile – przenoszenie pliku

Kurs Excel programowanie w VBA

Nazwy arkuszy

Każdy arkusz w Excelu ma swoją własną, unikalną nazwę, odróżniającą go od innych arkuszy.

Nazwę arkusza można w prosty i łatwy sposób zmienić, klikając w nią dwukrotnie lewym przyciskiem myszy  i po zaznaczeniu, wpisując nową.

Arkusze Excela mają także swoją, również unikalną, nazwę kodową.  Nazwa kodowa arkusza widoczna jest tylko z poziomu edytora VBA.
Na wszelki wypadek przypominam – szybkie wejście do edytora przez naciśnięcie przycisków Alt+F11.

W oknie projektu widoczne są wszystkie arkusze skoroszytu.

Widoczne są w nim nazwy wszystkich arkuszy, wpisane jako nazwa kodowa, a w nawiasie nazwa arkusza widoczna z poziomu Excela.
Czyli np.arkusz o nazwie kodowej Arkusz1 ma nazwę własną Mój arkusz 1.
Nazwy kodowe są nadawane automatycznie i uzależnione są od wersji językowej Excela, w której skoroszyt został utworzony. Dla wersji polskiej są to Arkusz1, Arkusz2… itd., w wersji angielskiej Sheet1, Sheet2… itd.

Nazwę kodową można zmienić w edytorze, w oknie właściwości arkusza – można je uaktywnić przez naciśnięcie przycisku F4.

W polu nazwy (Name) można wpisać własną nazwę kodową arkusza.

Nazwa kodowa arkusza nie może zawierać spacji i znaków specjalnych. Osobiście zdecydowanie odradzam też stosowanie polskich znaków diakrytycznych (czyli wszystkich liter z ogonkami: ą, ś, ć itp.

Czy i po stosowane są nazwy kodowe arkuszy? Ja z nich korzystam bardzo często. Przede wszystkim zabezpieczam się w ten sposób przed nieprzewidzianą zmianą nazwy arkuszy przez użytkowników. Zapis w kodzie:
Worksheets(“czerwiec”)
jest równoważny zapisowi:
Arkusz2
Jeśli jednak użytkownik zmieni nazwę z czerwca na  lipiec, to wprawdzie wszystkie formuły zapisane w komórkach automatycznie się zaktualizują, ale w kodzie VBA nie. Oznacza to, że pierwsze odwołanie nie zadziała i wystąpi błąd kodu. Skorzystanie w kodzie z nazwy kodowej arkusza zabezpiecza przed taką sytuacją.


 

 

 

Właściwości obiektu Range

Najpopularniejsze właściwości obiektu Range w kodzie VBA to:

  • adres zakresu
    • Address -zwraca adres zakresu lub nazwę obiektu Range
  • liczba obiektów
    • Count – liczba obiektów w Range. Dla zakresu komórek zwracana jest ich liczba
  • przesunięcie
    • Offset -przesunięcie o określoną liczbę wierszy i kolumn od obiektu Range
  • położenie
    • Top – zwraca położenie od góry górnego wierzchołka obiektu Range
    • Left – zwraca położenie od lewej strony wierzchołka obiektu Range
  • wartość
    • Value – wartość zakresu (np.komórki). Jest to właściwość domyślna obiektu Range

Tak, jak w przypadku metod obiektu Range chcąc wywołać daną właściwość, po nawiasie zamykającym oznaczenie obiektu wstawiamy kropkę i wybieramy z listy rozwijalnej daną właściwość.


 

Kurs Excel programowanie w VBA

Opcje modułu VBA

Na początku każdego modułu w edytorze VBA zawsze pierwsze linijki kodu związane są z jego opcjami. Standardowo pierwsza linia to:

    • Option Compare
      opcja porównania ciągów

        • Option Compare Binary
          cyfrowe porównanie znaków tekstowych, gdzie:
          np. “A” < “a” , “12” > “112”
        • Option Compare Text
          tekstowe porównanie znaków tekstowych, gdzie:
          np. “A” = “a”
        • Option Compare Database
          (opcja domyślna)

          porównanie znaków tekstowych uzależnione od strony kodowej i ustawień regionalnych komputera. Najczęściej jest to zgodne z właściwościami Option Compare Text, czyli
          np. “A” = “a”
    • Option Explicit
      opcja wymuszająca deklarację zmiennych w funkcjach i procedurach zapisanych w module czyli każda ze zmiennych musi być zapisana w bloku np.
      Dim Zmienna1 as Integer
      Dim Zmienna2 as Date
      Domyślnie nie jest wpisana do modułu, ale warto dopisać tę linijką. W ten sposób jeżeli gdzieś w kodzie pojawi się literówka – od razy wyskoczy to przy kompilacji kodu, gdyż niezadeklarowana zmienna nie zostanie zaakceptowana.
      Opcję tę można włączyć na stałe jako domyślne ustawienie modułu, zaznaczając checkbox w edytorze VBA Tool–> Options…
    • Option Private Module
      ukrywanie funkcji i procedur zapisanych w module.
      Po wpisaniu tej linijki na początku modułu zapisane w nim publiczne funkcje/procedury są widziane w innych modułach kodu, ale nie są dostępne z poziomu Excela, nie można ich uruchomić jako Makro na karcie Developer. Funkcje publiczne nie są widoczne w funkcjach zdefiniowanych przez użytkownika i nie można ich użyć w komórkach arkusza.

 

Kurs Programowanie VBA w Excelu dla zaawansowanych

Typy danych w VBA

Początek kodu każdej funkcji to deklaracja zmiennych. Najczęściej stosowane typy danych to:

Boolean Typ logiczny.
Przyjmuje dwie wartości:
True – prawda
False – fałsz
Integer typ całkowity.
Obejmuje liczby całkowite z zakresu -32 768 do 32 767
Long Typ całkowity długi.
Obejmuje liczby całkowite z zakresu -2 147 483 648 do
2 147 483 647
Currency Typ wautowy.
Obejmuje liczby rzeczywiste z 15 cyfr przed i 4 po przecinku
Single Typ rzeczywisty pojedynczej precyzji.
Obejmuje liczby rzeczywiste z zakresu:
od -3.402823 E38 do -1.401298E-45
oraz od 1.401298E-45 do 3.402823E38
Double Typ rzeczywisty podwójnej precyzji.
Obejmuje liczby rzeczywiste z zakresu:
od -1.79769313486231E308 do -4.94065645841247E-324
oraz od 4.94065645841247E-324 do 1.79769313486232E308
Date Typ daty.
Obejmuje daty od 1 stycznia 1900r. do 31 grudnia 9999r.
String Typ łańcuchowy często nazywany także tekstowym.
Obejmuje znaki z klawiatury – może ich być od zera do 2 bilionów
Variant Typ ogólny.
Zadeklarowanie zmiennej jako typ Variant jest w zasadzie jednoznaczne z brakiem deklaracji typu. Dostęp do danych jest jednak dłuższy i spowalnia program.

 

Metody obiektu Range

Najczęściej stosowane metody obiektu Range (czyli komórki lub zakresu komórek) to:

    • czyszczenie zakresu
      • Clear
        całkowite usunięcie treści, formatowania, obramowania wyrównania i komentarzy
      • ClearComments
        usuwanie komentarzy
      • ClearContents
        usuwanie treści i formuł
      • ClearFormats
        czyszczenie formatowania
    • kopiowanie, wycinanie, usuwanie
      • Copy
        cały zakres zostaje skopiowany do schowka
      • Cut
        komórki zakresu zostają wycięte i przekopiowanie do schowka
      • Delete
        usuwanie zakresu komórek
    • zaznaczanie
        • Select
          zaznaczanie zakresu
    • scalanie, rozcalanie
        • Merge
          scalenie komórek w zakresie
        • UnMerge
          rozcalenie komórek w zakresie

Jak to wygląda w praktyce? Najprościej daną metodę wybrać z rozwijalnej listy właściwości i metod uaktywnianej po wstawieniu kropki za oznaczeniem zakresu:

Oznaczenia metod to:

 

Oznaczenia właściwości to:

 

Przykładowy fragment kodu zaznaczającego zakres wygląda tak:

Public Sub CzyscZakres()
Dim Zakres As Range
SET ZakresA=Range(“A1:A10”)
Zakres.Clear
End Sub

lub np.tak:

Public Sub ZaznaczZakres()
Range(“A1:A10”).Select
End Sub

 


UsedRange

UsedRange to jedna z właściwości arkusza. Zwraca obiekt Range obejmujący zakres używanych komórek. Zakres ten jest wyznaczany jako prostokąt, którego lewym górnym rogiem jest “niepusta” komórka. Istotne jest tu to, że komórką “niepustą” dla zakresu używanego może być komórka, w której nie ma żadnej wartości, ale jest np.sformatowana inaczej niż pozostałe komórki arkusza.
W kodzie VBA wywołanie UsedRange np. aktywnego arkusza wygląda tak:

Public Sub ZakresUzytkowy()
Dim ZakresA As Range
SET ZakresA=ActiveSheet.UsedRange
End Sub

Dla właściwości UsedRange można też wywołać adres:
UsedRange.Address

A gdzie jest właściwość UsedRange najczęściej używana? M.in. do sprawdzania i czyszczenia różnych śmieci, które czasem pojawiają się w arkuszu i niepotrzebnie obciążają pamięć i rozmiar pliku.


 

Kurs Programowanie VBA w Excelu dla zaawansowanych

 

Obiekt Range

Range to obiekt w kodzie VBA oznaczający komórkę lub zakres komórek arkusza.
Dla pojedynczej komórki zapis wygląda np. Range(“A1”)
Dla ciągłego zakresu komórek – np. Range(“A1:C10”) lub Range(“A1″,”C10”) – gdzie A1 to adres komórki w lewym górnym rogu, natomiast C1 to komórka wyznaczająca prawy dolny róg.

Można też przypisać całe kolumny lub wiersze, odwołując się do oznaczenia kolumny lub numeru wiersza.
Np. Range(“1:1”) – odpowiada zakresowi wiersza pierwszego
Range(“A:C”) – zakres kolumn A do C.
W kodzie można odwoływać się także do nazw zdefiniowanych w Menedżerze nazw. Jeżeli mamy taki zakres o nazwie np.MojeKomorki, to można się odwołać do niego poprzez Range(“MojeKomorki”).

Chcąc zadeklarować zakres jako zmienną w kodzie VBA korzystamy z:

Dim ZakresA As Range
Dim ZakresB As Range

Przypisanie wartości (czyli zakresu komórek) do zmiennej typu Range musi być, jak w przypadku wszystkich obiektów VBA, poprzedzone słowem kluczowym Set.

Set ZakresA=Range(“1:1”)
Set ZakresB = Range(“A:A”)

W odniesieniu zakresu Range często wykorzystuje się funkcje:

    • Intersect(Arg1 as Range, Arg1 as Range,… as Range
      funkcja zwracająca zakres będący częścią wspólną zakresów wprowadzonych jako argumenty
    • Union(Arg1 as Range, Arg1 as Range,… as Range
      funkcja zwracająca zakres będący sumą zakresów wprowadzonych jako argumenty

Obie funkcje przydają się szczególnie w kodzie związanym ze zdarzeniami arkusza.

 


 

 

Kurs Excel - makra i VBA dla początkujących

 

Komórki scalone w VBA

Scalanie komórek kodem VBA jest możliwe przy użyciu metody Merge obiektu Range.

Np. dla komórek z zakresu A1:A10

Range(“A1:A10”).Merge

Zdjęcie scalenia to metoda UnMerge

Range(“A1:A10”).UnMerge

To, co istotne w metodach stosowanych w odniesieniu do komórek scalonych (m.in. ClearContents) nie można się odwołać do pojedynczej komórki scalonego zakresu  – trzeba jako Range wpisać cały zakres.

 


 

Kurs Excel - makra i VBA dla początkujących

 

Ukrycie kodu VBA

Jak zabezpieczyć kod VBA w pliku Excela?  Jest taka możliwość w edytorze VBA. Wystarczy kliknąć prawym przyciskiem myszy projekt VBA i z menu podręcznego wybrać właściwości projektu VBA:

Otworzy się w ten sposób formularz, w którym przechodzimy do zakładki Protection.

Checkbox Lock Project for viewing jest domyślnie odhaczony. Po jego zaznaczeniu wpisujemy i potwierdzamy hasło odbezpieczające kod. Potem wystarczy tylko zapisać skoroszyt i już. Po kolejnym otwarciu pliku dostęp do kodu VBA będzie już zablokowany. Chcąc wejść do kodu konieczne będzie wykonanie operacji odwrotnej tzn. wejście do edytora i kliknięcie prawym przyciskiem myszy. Pojawi się formularz z pytaniem o hasło. Po wpisaniu – kod będzie dostępny.
Zabezpieczenie kodu będzie aktywne tak długo, dopóki nie zostanie odhaczony checkox zabezpieczający kod.

Przy okazji, nieco rozszerzając temat zabezpieczenia kodu, warto też wspomnieć o możliwości częściowego kodu z poziomu arkusza. Przy bardziej złożonych projektach, wykorzystujących większą ilość procedur zapisanych w modułach ogólnych, wszystkie o charakterze publicznym są widoczne w oknie makr czy funkcji użytkownika.

Najczęściej większość z nich nie jest tu potrzebna, stanowią tylko podprocedury wywoływane kodem z innych procedur. W takich przypadkach warto ustawić opcję prywatności dla całych modułów.  Wystarczy na górze modułu wpisać Option Private Module.

Wszystkie zapisane w tym module procedury będą niewidoczne w oknie makr/funkcji użytkownika, a jednocześnie będą dostępne z poziomu wszystkich innych modułów skoroszytu.

 


 

Kurs Excel - makra i VBA dla początkujących