poniedziałek, 17 sierpnia 2015

Paste i PasteSpecial... częsty błąd

Niniejszy wpis jest ostrzeżeniem i przypomnieniem dot. operacji wklejania. Zauważyłem ostatnio zarówno w swoich relacjach zawodowych jak i w internecie kilka wpisów sugerujących wątpliwości związane z metodami Paste i PasteSpecial.

Na początek krótki przegląd dostępnych rozwiązań:
1. obiekt Range posiada wyłącznie metodę PasteSpecial
2. obiekt Worksheet posiada metody Paste i PasteSpecial
3. I jako ciekawostkę dodam, że szereg innych obiektów może również posiadać metodę Paste, np. Chart.Paste

A teraz prosty przykład z prawidłowymi zapisami operacji wklejania. Naszym celem jest skopiować zakres komórek A1:A10 z aktywnego arkusza do tego samego arkusza w kolejnych kolumnach B:E. Proszę zwrócić uwagę na dodatkowe komentarze w przykładowym kodzie.

01Sub Test_Paste_PasteSpecial()
02 
03    'kopiowanie zakresu...
04    Range("A1:A10").Copy
05    '...i wklejanie z wykorzystaniem obiektu Range
06    Range("B1").PasteSpecial
07     
08    'kopiowanie zakresu z jednoczesnym wklejeniem
09    'wariant najbardziej zalecany dla obiektu Range
10    Range("A1:A10").Copy Range("C1")
11     
12     
13    'kopiowanie zakresu...
14    Range("A1:A10").Copy
15    '...i wklejanie z wykorzystaniem arkusza
16    'A) metoda Paste z parametrem Destination
17    ActiveSheet.Paste Range("D1")
18     
19    'B) metoda PasteSpecial- wymaga uprzedniego zaznaczenia komórki
20    Range("E1").Select
21    ActiveSheet.PasteSpecial
22 
23End Sub

Sytuacja bardzo podobnie będzie wyglądać w przypadku kopiowania kształtu (figury, wykresu i innych obiektów warstwy rysunkowej). Tu schemat postępowania I dostępne metody będą podobne co obrazuje poniższy przykład:

01Sub Kopiowanie_Ksztaltu()
02     
03    'definicja kształtu
04    Dim SHP As Shape
05    Set SHP = ActiveSheet.Shapes(1)
06     
07    'kopiowanie
08    SHP.Copy
09     
10    '1) wklejanie
11    Range("A20").PasteSpecial
12    '2) wklejanie
13    ActiveSheet.Paste Range("C20")
14    '3) wklejanie
15    Range("E20").Select
16    ActiveSheet.PasteSpecial
17     
18End Sub