piątek, 24 października 2014

Interakcja pomiędzy aplikacjami MS Office (4 z ...wielu)

Tym razem kilka słów na temat integracji aplikacji Excel z aplikacją PowerPoint. Zaprezentuję prostą operację polegającą na wkopiowaniu do PowerPointa obiektów pochodzących z arkusza Excel:
  • tabeli danych
  • wykresu
oraz ustawimy odpowiednie pozycje  i wymiary dla powyższych elementów slajdu.

Warto zwrócić szczególną uwagę w poniższym kodzie na edycję z wykorzystaniem zmiennych obiektowych. Zabieg ten jest przeprowadzony celowo w celu poprawienia czytelności kodu oraz wyraźnego wydzielenia, które operacje-obiekty dotyczą Excela, a które PowerPoint'a. Jedyną wada tego rodzaju zapisu to wydłużenie całej procedury o szereg linii związanych z deklaracją zmiennych i ich ustawieniem (linie Dim i Set).

Cała poniższa procedura działa dla prostego pliku Excela, gdzie w arkuszu Arkusz1 (nazwa kodowa arkusza) znajduje się jeden wykres oraz zakres danych wykresu znajduje się w komórkach A1:C4. Pozostałe ważne informacje i wskazówki znaleźć można w poniższym kodzie w postaci komentarzy.

01Sub Interakcja_z_PowerPoint()
02 
03    'stosujemy wczesne wiązanie
04    'uruchamiamy PP
05    Dim appPP As PowerPoint.Application
06    Set appPP = New PowerPoint.Application
07    
08    appPP.Visible = True
09    
10    'tworzymy nową prezentację, alternatywnie
11    'można otworzyć inną, istniejąca prezentację metodą .Open
12    
13    Dim presPP As PowerPoint.Presentation
14    Set presPP = appPP.Presentations.Add
15    
16    'dodajemy slajd do prezentacji, pusty
17    Dim sldPP As PowerPoint.Slide
18    Set sldPP = presPP.Slides.AddSlide(1, presPP.SlideMaster.CustomLayouts(7))
19    
20    'wkopiowujemy i pozycjonujemy kolejne elementy
21    'z arkusza excel: zakres komórek oraz wykres
22    
23    'wariant 1 dla wykresu- wklejanie domyślne obiektu
24        Dim chrEXL As ChartObject
25        Set chrEXL = Arkusz1.ChartObjects(1)
26        
27        chrEXL.Copy
28        
29        'wklejmy w PP
30        Dim chrPP As PowerPoint.Shape
31        Set chrPP = sldPP.Shapes.Paste(1)
32        
33        'ustawiamy pozycję
34        With chrPP
35            .Top = 10
36            .Left = 10
37        End With
38    
39    'wariant 2 dla wykresu
40    'wklejamy wykres ponownie ale tym razem jako obrazek
41        sldPP.Shapes.PasteSpecial ppPasteJPG
42        Set chrPP = sldPP.Shapes(sldPP.Shapes.Count)
43        With chrPP
44            .Top = 10
45            .Left = sldPP.Master.Width / 2
46        End With
47 
48    'wariant 3- dla zakresu- wklejanie domyślne
49        Dim rngEXL As Range
50        Set rngEXL = Arkusz1.Range("a1:c4")
51        rngEXL.Copy
52        
53        'sklejanie
54        Dim rngPP As PowerPoint.Shape
55        Set rngPP = sldPP.Shapes.Paste(1)
56        
57        With rngPP
58            .Top = sldPP.Master.Height / 2
59            .Left = 10
60        End With
61        
62    'wariant 4- dla zakresu- wklajanie jako obrazek
63        rngEXL.Copy
64        sldPP.Shapes.PasteSpecial ppPasteBitmap
65        Set rngPP = sldPP.Shapes(sldPP.Shapes.Count)
66        With rngPP
67            .Top = sldPP.Master.Height / 2
68            .Left = sldPP.Master.Width / 2
69        End With
70End Sub

Efektem działania powyższej procedury jest poniższy przykładowy slajd w prezentacji PowerPoint.


poniedziałek, 20 października 2014

Interakcja pomiędzy aplikacjami MS Office (3 z ...wielu)

Jendą z praktycznych technik wykorzystujących interakcję pomiędzy aplikacjami pakietu Office jest wypełnianie dokumentu Word danymi pochodzącymi np. z tabeli znajdującej się w aplikacji Excel. Chodzi o operację zbliżoną do pojęcia 'korespondencji seryjnej' z jedną istotną różnicą- odpowiednie informacje z Excela umieszczane są w zakładkach znajdujących się w dokumencie Word.

Prześledźmy to na następującym przykładzie:

1. Tworzymy dwa pliki - plik Excel'a o dowolnej nazwie oraz plik Word'a, który umownie nazwiemy 'dokument z zakładkami.docx'. Dla prostoty tego przykładu oba pliki proszę zapisać we wspólnym folderze (plik Excela powinien być typu xlsm gdyż zaraz dodamy do niego odpowiednie makro).

2. W treści dokumentu Word'a umieśćmy jakiś tekst, np.

Szanowny Pan Jan Kowalski, 
w nawiązaniu do rozmowy telefonicznej...

i jednocześnie oznaczmy naszego 'Jana Kowalskiego' jako zakładkę o nazwie ImieNazwisko. To właśnie ta zakładka będzie przykładowym fragmentem tekstu, który będziemy następnie podmieniać wykorzystując kod VBA. Zamknijmy utworzony dokument.

3. W pliku Excela musimy przygotować odpowiedni kod, który wykona następujące operacje:
  • uruchomi aplikację MS Word (wykorzystując technikę wczesnego wiązania)
  • otworzy plik DOCX znajdujący się w tym samym folderze
  • wstawi w zakładce ImieNazwisko dane nowej osoby
  • i tu kluczowy moment- wstawi ponownie zakładkę ImieNazwisko ze względu na fakt, że poprzedni punkt automatycznie ją usunął
  • opcjonalnie można dodać polecenie zapisywania pliku Worda- ten fragment nie został uwzględniony w poniższym kodzie.
Całość obrazuje poniższy zestaw dwóch procedur. Wewnątrz kodu znaleźć można dodatkowe komentarze wyjaśniające kluczowe punkty kodu VBA.

01Sub WordApplicationBookmark()
02 
03    Dim appWRD As Word.Application
04    Set appWRD = New Word.Application
05    
06    appWRD.Visible = True
07    
08    'praca ze zmiennymi obiektowymi jest _
09    jedną z bardziej wydajnych i efektywnych _
10    sposobów tworzenia kodu:
11    
12    Dim docWRD As Word.Document
13    Set docWRD = appWRD.Documents.Open(ThisWorkbook.Path & _
14                "\dokument z zakładkami.docx")
15    
16    'uruchamiamy procedurę zewnętrzną przekazując parametry: _
17        dokument Word w którym wykonany akcję, _
18        nazwę zakładki- ImieNazwisko, _
19        nową treść zakładki- docelowo pobierana z komórki Excela
20    PodmianaTresciZakladki docWRD, "ImieNazwisko", "Tadeusz Nowak"
21    
22    
23End Sub
01Sub PodmianaTresciZakladki(DokumentWord As Word.Document, _
02                                Zakladka As String, _
03                                Tekst As String)
04    
05    With DokumentWord
06        'odnajdujemy zakładkę i
07        'zapamiętujemy jej miejsce początkowe
08        Dim ZakladkaStart As Long
09        ZakladkaStart = .Range.Bookmarks(Zakladka).Start
10        
11        'podmieniamy tekst zakładki na nowy co _
12         skutkuje jej automatycznym usunięciem
13        .Bookmarks(Zakladka).Range.Text = Tekst
14        
15        'przywracamy zakładkę w celu ponownego, _
16         późniejszego jej wykorzystania
17        .Bookmarks.Add Name:=Zakladka, _
18                Range:=.Range(ZakladkaStart, _
19                                ZakladkaStart + Len(Tekst))
20    
21    End With
22 
23End Sub

poniedziałek, 13 października 2014

Interakcja pomiędzy aplikacjami MS Office (2 z ...wielu)

Kontynuując wpis z ubiegłego tygodnia chciałby krótko zaprezentować drugi typ wiązania a więc...

Wiązanie późne (late binding)

Wiązanie późne nie będzie wymagać od nas żadnych dodatkowych przygotowań i wskazywania zewnętrznych bibliotek wcześniej, niż dopiero na etapie edycji kodu. I tak, aby uruchomić aplikację MS Word i utworzyć w niej nowy dokument niezbędny kod wygląda następująco:

1Sub UruchomMSWordaLateBinding()
2 
3    Dim appWord As Object
4    Set appWord = CreateObject("Word.Application")
5    
6    appWord.Visible = True
7    appWord.Documents.Add
8    
9End Sub

Zalety późnego wiązania:
  • nie wskazujemy konkretnej wersji zewnętrznej biblioteki tak więc kod napisany w środowisku Office 2013 zadziała także skutecznie w starszych wersjach Office, np. 2007 czy 2010
  • biblioteka zostanie podłączona dopiero na etapie kompilacji kodu
Wady późnego wiązania:
  • utrudniona edycja przez co nie jesteśmy w stanie skorzystać z systemu IntelliSense edytując kod dla zewnętrznej aplikacji
  • zazwyczaj mniejsza wydajność kodu
  • brak do 'stałych' języka VBA dla zewnętrznej aplikacji (w miejsce np. WdInformation.wdActiveEndPageNumber niezbędne jest wstawienie numerycznego odpowiednika, tu: 3)

Dla osób zainteresowanych dogłębnie typami wiązań odsyłam do wyszukiwarki Google. Temat ten jest bardzo obszernie przedstawiony w wielu artykułach zarówno w języku polskim jak i językach obcych.

Na koniec chciałbym dodać, że zagadnienia interakcji omawiane są w czasie naszych kursów na poziomie średnio-zaawansowanym. Serdecznie zapraszam na nasze szkolenia z VBA organizowane w Warszawie, Krakowie i Wrocławiu.

poniedziałek, 6 października 2014

Interakcja pomiędzy aplikacjami MS Office (1 z ...wielu)

Tym wpisem chciałbym rozpocząć dłużą serię postów omawiających szereg zagadnień związanych z interakcją pomiędzy aplikacjami pakietu MS Office z wykorzystaniem kodu VBA. Postaram się omówić kilka prostych przykładów dot. aplikacji Excel, Word, PowerPoint i Access.

Rzecz od której nie sposób nie rozpocząć to zagadnienia dot. typów łączenia aplikacji, a więc jak wskazać w kodzie aplikacji Excel inną aplikację, np. Word'a w celu umożliwienia wykonania dalszych operacji w edytorze tekstu z poziomu kodu VBA umieszczonego w Excelu. Zagadnienie to określa się pojęciem 'wiązania' dookreślając możliwość zastosowania dwóch typów wiązań: 'wiązania wczesnego' (early binding) lub 'wiązania późnego' (late binding). W tym i kolejnym wpisie omówię krótko oba te warianty od strony praktycznej.

Wczesne wiązanie (early binding)...
...wymagać będzie od użytkownika wykonania akcji 'przed kompilacją kodu'. Operacja wiąże się z koniecznością ustawienia referencji w edytorze VBA w pozycji Menu >> Tools >> References... gdzie następnie należy wskazać i zaznaczyć odpowiednią bibliotekę lub aplikację. Przykładowo obrazuje to poniższy zrzut ekranu gdzie z poziomu aplikacji Excel wskazano referencję do aplikacji Word






Niezbędny kod VBA tworzący wiązanie wyglądać będzie następująco (tu: uruchomienie i wyświetlenie aplikacji Word oraz utworzenie nowego dokumentu)

1Sub UruchomMSWorda()
2 
3     Dim appWord As Word.Application
4     Set appWord = New Word.Application
5    
6     appWord.Visible = True
7     appWord.Documents.Add
8 
9End Sub

Zalety wczesnego wiązania:
  • ułatwiona edycja z wykorzystaniem IntelliSense. W powyższym przykładzie dla zmiennej appWord będzie podpowiadać się zestaw dostępnych metod i właściwości  
  • szybkość wykonania kodu- kompilator wie jakie zewnętrzne biblioteki należy uruchomić już na etapie prekompilacji
  • dostęp do 'stałych' języka VBA dla zewnętrznej aplikacji (np. WdInformation.wdActiveEndPageNumber)
Wady wczesnego wiązania:
  • ustawiając referencję do wskazanej biblioteki oczekiwana jest dokładnie ta sama wersja aplikacji, z którą wykonywana jest interakcja. Powyższy przykład nie zadziała z aplikacją MS Word w wersji 2010 lub wcześniejszą.
W kolejnym wpisie przedstawię pojęcie wiązania późnego...