O.Dokumencie 50 64 i 65   strona główna:
A po co ten Excel ;-)
Zadanie na dziś. :-)  
    1. Podać sumaryczną ilość stron wykorzystywanych w arkuszu   
    2. Na której stronie leży dana komórka  
  Function ThisPageNum()
Kiedyś przeglądając stronkę Daily Dose of Excel (do czego zachęcam) trafiłem na funkcję ThisPageNum której zadaniem jest   
realizacja zadania nr.2 jednak wypowiedź podpowiada problem:  
    >> John Walkenbach  Add 5-6 formulas that use that function and things slow to a crawl <<  
rzeczywiście "muli wściekle". Podpowiedzi rozwiązania kierują użytkownika do Makr Excela 4.0. My też spróbujemy pójść tą drogą.  
 
Opis tych możliwości programu Excel można postudiować czytając zawartość pliku pomocy Macrofun.hlp dostępny na stronach M$'u   help topics for Microsoft Excel 4.0 macro functions
W tym pliku otwórzmy sobie informacje nt. GET.DOCUMENT gdzie poczytamy o:  
  50 The total number of pages that would be printed based on current settings, excluding notes, or 1 if the document is a chart  
  64 An array of row numbers corresponding to rows that are immediately below a manual or automatic page break.  
  65 An array of column numbers corresponding to columns that are immediately to the right of a manual or automatic page break.  
 
Żeby używać takich funkcji należy definiować je w nazwach.  
 
Zadanie.1  
E2003: Zakładka: Wstaw / Nazwa / Definiuj  
Nazwy w skoroszycie: iloscStron  
Odwołuje się do: =O.DOKUMENCIE(50)+TERAZ()*0  
 
    >> Tajan (MVP)  Jeżeli chodzi o funkcję TERAZ, to jej zadaniem jest wymuszenie każdorazowego obliczenia formuły przy   
                             przeliczaniu arkusza. Jeżeli jej nie zastosujemy, formuła nazwy zostanie przeliczona tylko raz - po jej   
                             wprowadzeniu. Do chwili, gdy nie nastąpi zmiana  wartości w odpowiedniej komórce (..) formuła nie będzie   
                             przeliczana, nawet po naciśnięciu F9. <<  
 
Następnie, w komórce, w której chcielibyśmy otrzymać ilość stron wykorzystywanych w Arkuszu, w którym znajduje się ta komórka   
wpisujemy:  
=iloscStron  
Funkcja grzecznie zwraca ilość stron.  
 
    Należy się też wyjaśnienie samej nazwy funkcji. :-) Za słownieczek z translatorem może nam posłużyć plik FUNCS.XLS (link z prawej).   FUNCS.XLS
Po "dwukliku" na wybraną nazwę funkcji powinna się otworzyć pomoc dot. klikniętej funkcji, a przynajmniej okno z informacją jakiego   
pliku pomocy nam brakuje :D  
 
Zadanie.1a  
Jak wpiszemy powyższą formułę w innym Arkuszu funkcja wskaże ilość stron wykorzystywanych w tym arkuszu. Jak więc zwrócić w   
Ark.Arkusz2 ilość stron Ark.Arkusz1?  
Należy w funkcji O.DOKUMENCIE wskazać o który Arkusz nam chodzi.   
 
Do tego celu posłużymy się inną funkcją Excela4.0 mianowicie GET.CELL  
   32 Name of the workbook and sheet containing the cell If the window contains only a single sheet that has the same name as the   
       workbook without its extension, returns only the name of the book, in the form BOOK1.XLS. Otherwise, returns the name of the  
       sheet in the form "[Book1]Sheet1".  
 
    Wracając do zadania:  
E2003: Zakładka: Wstaw / Nazwa / Definiuj  
Nazwy w skoroszycie: iloscStron  
Odwołuje się do: =O.DOKUMENCIE(50;O.KOMÓRCE(32;Arkusz1!$A$1))+TERAZ()*0  
 
Zadanie.2  
To zadanie trochu trudniejsze :-|  
    Funkcja O.DOKUMENCIE z parametrem 64 Wprowadzona tablicowo zwraca numery wierszy odpowiadających wierszom, które są   
bezpośrednio pod automatycznym lub ręcznym podziałem strony. 65 analogicznie - w stosunku do numerów kolumn.  
    Pierwszym problemem jest fakt że poprzez Application.ExecuteExcel4Macro nie znam sposobu, jak zapisać do zmiennej całą tablicę.  
ExecuteExcel4Macro("Get.Document(65)") zwraca tylko pierwszy jej element więc lipa z funkcji użytkownika :-|. Co prawda jeżeli   
w funkcji używamy odwołań do funkcji Excela4.0 to i tak nie działają jako UDF więc "podwójna lipa" :-P  
 
    Do realizacji zadania potrzebujemy przeznaczyć dwa pomocnicze wiersze w których będziemy zwracać wyniki funkcji zdefiniowanych  
 w nazwach. Utwórzmy zatem dwie nazwy:  
nazwa podzialV =O.DOKUMENCIE(64;O.KOMÓRCE(32;Arkusz1!$A$1))+TERAZ()*0  
nazwa podzialH =O.DOKUMENCIE(65;O.KOMÓRCE(32;Arkusz1!$A$1))+TERAZ()*0  
 
W zakresie J1:R1 wstawmy tablicowo =pidzialH , a w zakresie J2:R2 =podzialV. W kol. I oba zakresy rozpocznijmy od 1'ki  
 
kolejne dwie nazwy określą pozycję danej komórki, jej wiersza lub numeru kolumny, względem wartości zwróconych w pomocniczych  
zakresach. Będą to:  
nazwa nrStrW =PODAJ.POZYCJĘ(WIERSZ();Arkusz1!$I$2:$R$2;1)  
nazwa nrStrK =PODAJ.POZYCJĘ(NR.KOLUMNY();Arkusz1!$I$1:$R$1;1)  
 
Wiedząc zatem pomiędzy którymi liniami podziału strony znajduje się komórka zdefiniujemy  
nazwa nrStr =JEŻELI(nrstrK=1;nrstrW;(ILE.LICZB(Arkusz1!$J$2:$R$2)+1)*(nrstrK-1)+nrstrW)   link do przykładu
 
Teraz wpisując w dowolną komórkę =nrStr funkcja poda numer strony na której znajduje się komórka w której wpisano funkcję.  
Może więc warto się tym starym makrom poprzyglądać :-))