Początkujący programiści VBA dość często stosują metody brute force przy przetwarzaniu komórek (czyli przetwarzają za pomocą pętli wszystkie komórki po kolei), co powoduje niepotrzebne wydłużenie czasu pracy makra. W kilku poprzednich postach przedstawiałem już techniki umożliwiające uniknięcie tego najprostszego, oczywistego ale nie najwydajnieszego sposobu projektowania programów. Dziś nadszedł czas na kolejną porcję dobrych praktyk: zapisywanie zakresów.
Przy okazji przedstawię Wam pracę z tablicami.
Wczytanie danych do tablicy
Na potrzeby naszego przykładu załóżmy, że mamy dane w arkuszu jak na rysunku:

Zadanie polega na przeniesieniu tego zakresu w inne miejsce. Na przykład do arkusza Arkusz2.
Oczywiście najprostszą metodą1 jest wykorzystanie tablicy: określimy wymiary tablicy (takie jak nasz zakres z danymi), wczytamy dane do tablicy i... przepiszemy je z tablicy do miejsca docelowego.
Zaczynamy od deklaracji tablicy i przepisania danych do tablicy.
Option Explicit Sub Przepisywanka() Dim Tablica() As Variant Dim KolumnyZakresu As Long Dim WierszeZakresu As Long Dim ZakresDocelowy As Range Dim Indeks1 As Long Dim Indeks2 As Long 'Pobranie wymiarów danych KolumnyZakresu = ActiveSheet.UsedRange. Columns.Count WierszeZakresu = ActiveSheet.UsedRange.Rows. Count 'Zmiana wymiarów tablicy ReDim Tablica(1 To WierszeZakresu, 1 To KolumnyZakresu) 'Wczytanie danych do tablicy For Indeks1 = 1 To WierszeZakresu For Indeks2 = 1 To KolumnyZakresu Tablica(Indeks1, Indeks2) = Cells(Indeks1, Indeks2).Value Next Indeks2 Next Indeks1 End Sub
Myślę, że komentarze tłumaczą poszczególne instrukcje makra w sposób wystarczający. Jedyny komentarz należy się w odniesieniu do instrukcji ReDim - instrukcja ta umożliwia nam zmianę wymiarów zadeklarowanej tablicy. W naszym przykładzie przycinamy ją do wymiarów zakresu z naszymi danymi.
Skoro mamy już dane w tablicy, musimy się zastanowić jak je przepisać z powrotem do arkusza (oczywiście w inne miejsce). Pierwszym pomysłem najczęściej jest ponowne użycie dwóch zagnieżdżonych pętli do przepisania komórki po komórce. Ale takie rozwiązanie nie jest najbardziej optymalne. W VBA możemy to zrobić nie tylko szybciej, ale i... prościej! Tak, tak, również prościej. Wystarczy dołożyć jedną zmienną identyfikującą nasz zakres docelowy (zadeklarowaliśmy ją wcześniej jako: Dim ZakresDocelowy as Range):
'Przepisanie tablicy do arkusza 2 Sheets("Arkusz2").Activate Set ZakresDocelowy = Range(Cells(1, 1), Cells(WierszeZakresu, KolumnyZakresu)) ZakresDocelowy.Value = Tablica
Zwracam uwagę na instrukcję ZakresDocelowy.Value = Tablica - za pomocą jednego przypisania cała tabela z danymi ląduje błyskawicznie w zdefiniowanym wcześniej miejscu.
Oczywiście zysk na czasie będzie tym większy (w porównaniu do przepisywaniu danych komórka po komórce), im więcej danych będziemy przenosić.
1 Przedstawiony tutaj sposób wczytywania danych do tablicy nie jest najwydajniejszy - dla chcących zrobić to szybciej i efektywniej polecam post Wczytywanie zakresów do tablic. Sposób, który tutaj przedstawiłem służy prezentacji tablic jako takich.

[...] przeczytaniu postu gdzie prezentowałem szybki zapis danych z tablicy do arkusza (Zapisywanie zakresów) wielu z Was zapewne zastanawiało się, czy tę technikę można zastosować w odwrotnym kierunku: [...]