Pokazywanie postów oznaczonych etykietą obiekty warstwy rysunkowej. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą obiekty warstwy rysunkowej. Pokaż wszystkie posty

poniedziałek, 21 września 2015

Jak wyrównać tekst w kształtach Shape

Pomysł na niniejszy wpis powstał po przeczytaniu pytania i kilku odpowiedzi w serwisie StackOverflow. Postawione pytanie było proste lecz tu przedstawię je w zmodyfikowanej i bardziej rozbudowanej formie- jak uzyskać efekt, w którym poszczególne paragrafy w kształcie są naprzemiennie wyrównane do prawej i lewej strony (zgodnie z tym co prezentuje poniższy przykładowy obrazek)?

Oto prosty kod realizujący zadanie wraz z kilkoma komentarzami:

środa, 2 września 2015

Microsoft Word- zamiana tekstu na obiekt ContentControl (lub inny)

Operacja do wykonania wydaje się być prosta- określone wystąpienie tekstu w dokumencie chcemy zamienić nie na inny tekst lecz na…obiekt. Pierwsza myśl to często- 'jaki jest symbol specjalny dla danego obiektu?'. W istocie, w metodzie .Find możemy zastosować znaki specjalne (Wildcards) w celu wyszukiwania i podmiany tekstu. Tutaj zastosujemy jednak inne i jednocześnie bardzo proste rozwiązanie- w miejscu wyszukanego tekstu po prostu wstawimy (dodamy) interesujący nas obiekt (w przykładzie będzie to ContentControl). Oto przykład wraz z dodatkowymi komentarzami.

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.

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:

piątek, 20 lutego 2015

Jak odnaleźć źródło danych dla wykresu?

Utworzenie wykresu z wykorzystaniem kodu VBA jest relatywnie łatwe, zawsze można wspomóc się rejestratorem makr co szczególnie dotyczy początkujących adeptów programowania. W jaki sposób odnaleźć źródło danych dla wskazanego wykresu, a więc zakres komórek, na bazie których nasz wykres rysuje linie czy kolumny? W tym zadaniu nie pomoże rejestrator makr, całą koncepcję musimy oprzeć na obiektach powiązanych z wykresem wykorzystując precyzyjnie hierarchię tych obiektów i odpowiednie właściwości.

Jako punkt odniesienia przyjmijmy następujący wykres liniowy posiadający jedną serię danych.



W rozwiązaniu, które poniżej musimy wykorzystać następujące obiekty i ich właściwości:

1. Obiekt Chart, czyli wykres, i jego właściwość:
2. Series, czyli serię danych wykresu, oraz jej właściwość
3. Formula, zwracającą formułę tworzącą referencję do zakresu danych.

Właściwy kod niezbędny do odnalezienia poszukiwanego zakresu wraz z dodatkowymi komentarzami znajduje się poniżej.

A co jeżeli chcielibyśmy odnaleźć kolejne elementy, punkty naszego wykresu i referencję do zakresu dla każdego z nich? W tym celu w miejscu oznaczonym gwiazdką w powyższym przykładzie musimy wstawić poniższy kod.

piątek, 6 czerwca 2014

Imitacja zdarzenia MouseOver (Hover) dla komórki Excela...

...czyli jak wywołać makro pod wpływem najechania wskaźnikiem myszy nad określoną komórkę Excela.

Znawcy VBA z pewnością od razu domyślają się, że nie chodzi o wykorzystanie zdarzenia gdyż do wersji Office 2013 w zasobie dostępnych zdarzeń nie znajdziemy takiego, które wywoła efekt MouseOver dla komórki Excela. Okazuje się jednak, że efekt ten możemy uzyskać połączywszy ze sobą dwa elementy:
  • własną funkcję użytkownika (UDF), wewnątrz której zdefiniujemy określoną akcję wywoływaną pod wpływem najechania myszą nad komórkę
  • formułę komórkową HIPERŁĄCZE (opcjonalnie połączoną z formułą JEŻELI).
Zanim zaprezentuję określony kod nakreślmy oczekiwany scenariusz:
  • komórka A1 zawierać będzie tekst: "Najedź myszą w celu uzyskania dodatkowych informacji"
  • komórka B1 zawierać będzie tekst: "Wyłącz dodatkowe informacje"
  • najechanie myszą na komórki A1 i B1 będzie odpowiednio odkrywać i ukrywać obiekt Shape zawierający dodatkowe informacje (kształt Shape w naszym przypadku nazywa się "ShapeTip1")
Krok 1. Zacznijmy od stworzenia funkcji UDF, której zadaniem będzie pobranie parametru decydującego o odkryciu/ukryciu kształtu:


Krok 2. W arkuszu tworzymy kształt i ustawiamy jego nazwę na ShapeTip1.

Krok 3. W komórce A1 dodajemy formułę HYPERLINK wg schematu:


Z niewiadomych przyczyn formuła HIPERŁĄCZE zwracać może błąd dla powyższej konstrukcji dlatego też warto od razu obudować ją w formułę JEŻELI(CZY.BŁ(...)) (wskazówka: formuła JEŻELI.BŁĄD() niekoniecznie sprawdza się w tej sytuacji co warto przetestować).
Ostatecznie więc do komórki B1 wpisujemy następującą formułę wyzwalającą ukrywanie:


Ostateczny układ arkusza mógłby wyglądać jak na poniższym zrzucie ekranu. Najechanie muszą na komórkę A1 odkrywa prostokąt z komunikatem. Ukrywanie prostokąta wyzwalane jest przez najechanie myszą na komórkę B1.


Wskazówki i uwagi końcowe:

  • warto zwrócić uwagę, że zatrzymanie myszy nad komórkami A1 i B1 powodują nieustanne wywoływanie utworzonej funkcji UDF co nie jest zbyt efektywne
  • niestety nie udało mi się stworzyć mechanizmu autoukrywania kształtu po opuszczeniu komórki A1 bez najechania na komórkę B1. Funkcja nie wyzwala zdarzeń ani polecenia Application.OnTime.
  • Inspiracją do stworzenia niniejszego wpisu były przykłady znalezione w sieci. Tu chciałbym jednak polecić Waszej uwadze doskonały arkusz oparty o podobne rozwiązanie, który prezentuje okresowy układ pierwiastków. Pod tym linkiem znajdziecie zarówno gotowy przykład pliku Excela jak również prosty filmik prezentujący działanie tego narzędzia.

poniedziałek, 10 lutego 2014

Przycisk w relacji do komórki wynikowej

Wyobraźmy sobie sytuację, w której w arkuszu, w określonej kolumnie umieszczamy szereg przycisków. Ich rola niech będzie banalna- zwiększenie/zmniejszanie wartości określonej komórki. Przyjmijmy jednak założenie, że komórka wynikowa znajduje się w określonej relacji do przycisku- np. jest to komórka bezpośrednio po lewej stronie względem naszego przycisku. Całość, w lekko rozbudowanym wariancie, niech zobrazuje poniższy schemat.



Chcąc zachować względną relację pomiędzy komórką wynikową a komórką nad którą znajdują się przyciski warto sięgnąć po .TopLeftCell. Właściwość ta występuje w przypadku większości obiektów warstwy rysunkowej i wskazuje komórkę (obiekt Range), nad którą znajduje się lewy górny róg naszego obiektu.

Kod dla przycisku czerwonego, który zmniejsza ilość elementów w kolumnie B będzie więc następujący:

Kod dla przycisku zielonego, który zwiększa ilość elementów w kolumnie B będzie więc następujący:

Zaletą stosowania takiego rozwiązanie jest wspomniana wyżej relacja w położeniu pomiędzy przyciskiem a kolumną wynikową. Pozwala nam to na wstawienie kilku kolumn po lewej stronie od kolumny B oraz  wierszy powyżej naszego przykładowego rzędu. W obu przypadkach przyciski nadal będą działać w prawidłowej relacji do komórki wynikowej.

piątek, 30 sierpnia 2013

Przeglądarka zdjęć w Excelu

W czasie dwóch prowadzonych szkoleń z VBA dla Excel w Krakowie i Wrocławiu padło pytanie o możliwość stworzenia czegoś na wzór przeglądarki zdjęć w Excelu w oparciu o nazwy plików graficznych umieszczonych w kolumnie arkusza.

Oczywiste pytanie, które również zadałem brzmiało- po co i dlaczego mielibyśmy tworzyć takie rozwiązanie? Jak się okazało, i tu będę bazował na podobnych elementach uzyskanych odpowiedzi, chodziło o szybką i skuteczną weryfikację jak wygląda dany produkt w bazie produktów danej firmy.

Poniżej przedstawiam wariant uproszczony przygotowany w trzech krokach. Wszelkie modyfikacje i rozszerzenia są jak najbardziej możliwe i zalecane.

Krok 1. Tworzymy listę plików graficznych. 
W tym celu w komórce A1 dowolnego arkusza proszę wprowadzić ścieżkę do katalogu, w którym znajdują się nasze pliki graficzne, np: c:\Users\Imię Naziwsko\Documents\Moje obrazy.

Następnie proszę wywołać poniższe makro, którego celem będzie utworzenie listy wszystkich plików graficznych JPG począwszy od rzędu 11 w kolumnie A.

Krok 2.  Wstawianie i usuwanie grafiki.
Poniższe dwa makra będą odpowiedzialne za wyświetlenie oraz usunięcie pliku graficznego z naszego arkusza. Dodatkowe informacje na temat ich działania zawarte są w komentarzach wewnątrz kodu.


Krok 3. Automatyczne działanie z pomocą obsługi zdarzenia.
Na koniec połączymy nasze makra ze zdarzeniem. Chcemy bowiem aby wyświetlił się nam obraz tylko wtedy, gdy zaznaczymy pojedynczą komórkę w kolumnie zawierającej nazwę pliku, a w każdym z pozostałych przypadków chcemy usunąć zbędną grafikę. W tym celu w module naszego arkusza dodamy następujący kod obsługi zdarzenia Worksheet_SelectionChange:


poniedziałek, 6 maja 2013

Ścieżka do grafiki osadzonej w MS Word

Poniższy kod ma swoje źródło w pytaniu na jednym z globalnych forów. Chodziło w nim mniej więcej o uzyskanie ścieżki do pliku źródłowego dla zaznaczonego obrazu umieszczonego w dokumencie aplikacji MS Word.

W sumie rozwiązanie jest proste nie mniej w MS Word mamy do czynienia z dwoma typami obiektów rysunkowych należącymi albo do kolekcji Shapes albo do kolekcji InlineShapes.Poniższy kod dzięki prostej technice obsługi błędów sprawdza oba warianty. Jeżeli obiekt nie należy do pierwszej z kolekcji to sprawdzona zostaje druga. Ostatecznie uzyskamy oczekiwany wynik, a w sytuacji gdy nie został zaznaczony obiekt typu rysunkowego zwrócone zostanie puste okno MsgBox.