2012-03-30 13 views
5

pisałem jakiś funkcjonalny VBA:Zapisz zasięg do zmiennej

Sheets("Src").Range("A2:A9").Copy Destination:=Sheets("Dest").Range("A2") 

chcę wyodrębnić zakres źródłowy do zmiennej elastyczności.

SrcRange = Sheets("Src").Range("A2:A9") 
SrcRange.Copy Destination:=Sheets("Dest").Range("A2") 

Jednak to nie działa. Co SrcRange powinno być przycięte jako? Czy pierwsza linia jest poprawna?
starałem przyciemniania SrcRange jak zasięg i to dało mi
Runtime error 91: Object Variable or With block variable not set

nie jestem bardzo obeznany z językiem i dokumentacja opuścił mnie chce (nie mogłem znaleźć rodzaj powrotu do arkuszy (index) inwokacja, this był najbliżej znaleziony). Po naciśnięciu Record Macro, wykonaniu niektórych akcji i zatrzymaniu, treść Macro pozostaje pusta.

Czy ktoś mógłby rzucić nieco światła na sposób użycia SrcRange jako zmiennej?

Odpowiedz

9

W swoją odpowiedź, skutecznie to zrobić:

Dim SrcRange As Range ' you should always declare things explicitly 
Set SrcRange = Sheets("Src").Range("A2:A9") 
SrcRange.Copy Destination:=Sheets("Dest").Range("A2") 

Nie jesteś naprawdę „wydobywania” zakres zmiennej, jesteś ustawienie odniesienie do zakresu.

W wielu sytuacjach może to być bardziej efektywne, a także bardziej elastyczny:

Dim Src As Variant 
Src= Sheets("Src").Range("A2:A9").Value 'Read range to array 
'Here you can add code to manipulate your Src array 
'... 
Sheets("Dest").Range("A2").Value = Src 'Write array back to another range 
+0

Lubię odczytywać zmienną/tablicę Variant, aby uzyskać większą elastyczność. Dzięki za wskazówkę! –

7

... A odpowiedź brzmi:

Set SrcRange = Sheets("Src").Range("A2:A9") 
SrcRange.Copy Destination:=Sheets("Dest").Range("A2") 

Set robi różnicę. Wtedy działa jak urok.

8

Właśnie w celu wyjaśnienia, istnieje duża różnica między tymi dwoma działaniami, jak sugeruje Jean-François Corbett.

Jedno działanie jest skopiowanie/wczytać aktualne dane z Range("A2:A9") do tablicy Variant o nazwie vArray (Zmieniono aby uniknąć mylenia Variant tablicy i kartach zarówno nazywa SRC):

vArray = Sheets("Src").Range("A2:A9").Value

podczas gdy druga po prostu ustawia zmienną zakresu (SrcRange) z adresem zakresu Sheets("Src").Range("A2:A9"):

Set SrcRange = Sheets("Src").Range("A2:A9")

W tym przypadku dane nie są kopiowane i pozostają tam, gdzie są, ale teraz można uzyskać do nich dostęp w bardzo podobny sposób, jak tablica. Często jest to całkowicie wystarczające, ale jeśli musisz wielokrotnie uzyskiwać dostęp, testować lub obliczać za pomocą tych danych, załadowanie go do tablicy najpierw będzie DUŻO szybsze.

Załóżmy na przykład, że chcesz sprawdzić "bazę danych" (duży arkusz) na liście znanych przedmieść i kodów pocztowych. Oba zestawy danych znajdują się w oddzielnych arkuszach, ale jeśli chcesz, aby działały szybko, załaduj przedmieścia i kody pocztowe do tablicy (żyje w pamięci), a następnie przeprowadź przez każdą linię głównej bazy danych, testując dane tablicowe. Będzie to znacznie szybsze niż w przypadku dostępu do obu arkuszy.