Jan 25 2010

Wtorki z VBA cz.14 – Zapisywanie zakresów

Posted by Marcin

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:

Zakres danych do zapisu

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.

Powiązane artykuły:

Filed under : Kurs VBA, Wszystkie | 1 Comment »

One Response to “Wtorki z VBA cz.14 – Zapisywanie zakresów”

  1. [...] 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: [...]

Leave a Reply