Programovanie makier v LibreOffice: Swap

LO.png Na začiatku si ukážeme alternatívne volanie funkcii, procedúr a tried (tie ešte v rámci seriálu nepoznáte). Potom sa vrhneme na výmenu hodnôt medzi dvoma premennými pomocou swapu.  

Volanie Call

Jednou z možností, ako môžete volať procedúry, funkcie či triedy je pomocou slova Call.

1. príklad: Využitie príkazu Call pri dvoch procedúrach

Sub TestSub(cislo, cislo1)
 
 MsgBox "Vysledok scitania: " & cislo+cislo1 & Chr(10) & "Vysledok odcitania: " & 
cislo-cislo1 & Chr(10) & "Vysledok nasobenia: " & cislo*cislo1 & Chr(10) & 
"Vysledok delenia: " & cislo/cislo1 
 
 End Sub 
 
 Sub macro
 
 Dim m As Integer
 Dim n As Integer
 
 m = InputBox("Zadajte prve cele cislo")
 n = InputBox("Zadajte druhe cele cislo")
 
 Call TestSub(m, n) REM voláme procedúru
 
 End Sub

Prvý vstup od užívateľa Prvý vstup od užívateľa

Druhý vstup od užívateľa Druhý vstup od užívateľa

Výsledná činnosť makra Výsledná činnosť makra

Rozbor makra: Makro je jednoduché na pochopenie. Procedúru voláme pomocou funkcie Call.

Skúsme teraz miesto procedúry využiť funkciu? Bude výsledok iný?

2. príklad: Voláme funkciu pomocou Call

Function TestFunction(cislo, cislo1)

MsgBox "Vysledok scitania: " & cislo+cislo1 & Chr(10) & "Vysledok odcitania: " & 
cislo-cislo1 & Chr(10) & "Vysledok nasobenia: " & cislo*cislo1 & Chr(10) & 
"Vysledok delenia: " & cislo/cislo1 

End Function

Sub macro

Dim m As Integer
Dim n As Integer

m = InputBox("Zadajte prve cele cislo")
n = InputBox("Zadajte druhe cele cislo")

Call TestFunction(m, n) REM voláme funkciu

End Sub

Prvý vstup od užívateľa Prvý vstup od užívateľa

Druhý vstup od užívateľa Druhý vstup od užívateľa

Výsledná činnosť makra Výsledná činnosť makra

Rozbor makra: Rovnaký výsledok ako v prvom príklade. Všetko funguje ako má.

Swap

Swap v počítačovej terminológii znamená, výmena hodnôt medzi dvoma prvkami. Aspoň takto by som to v jednoduchostí definoval. Aj vo Visual Basicu môžeme využívať tieto fintíčky.

Pre názornosť je lepšie ukázať jednoduchý príklad. Následne by som vám chcel ukázať ďalšie príklady so swapom.

3. príklad: Jednoduchý príklad so swapom

Sub swap

Dim a As Integer
Dim b As Integer
Dim pomocnaPremenna As Integer

a = InputBox("Zadajte prve cele cislo")
b = InputBox("Zadajte druhe cele cislo")

pomocnaPremenna = a REM swap

a = b
b = pomocnaPremenna

MsgBox "Po vykonani swapu: a = " & a & ", b = " & b 

End Sub

Prvý vstup od užívateľa Prvý vstup od užívateľa

Druhý vstup od užívateľa Druhý vstup od užívateľa

Výsledná činnosť makra Výsledná činnosť makra

Rozbor makra: Vtip swapu je v tom, že si vytvoríme tretiu premennú. Volajme ju pomocná premenná. V nej uložíme hodnotu z prvej premennej. Potom prvá premenná získa hodnotu z druhej premennej. A na koniec, druhá premenná získa uloženú hodnotu z pomocnej premennej. Takto vieme jednoducho vymieňať hodnoty medzi dvoma prvkami.

4. príklad: Ideme na ostrejší príklad so swapom

Sub swap

Dim poleDatum(0 to 2) As String
Dim stringDatum As String
Dim pomocnaPremenna As String

stringDatum = InputBox("Zadajte dátum vo formáte dd.mm.rrrr!")
poleDatum = Split(stringDatum, ".")

pomocnaPremenna = poleDatum(0) REM swap s prvkami poľa

poleDatum(0) = poleDatum(2)
poleDatum(2) = pomocnaPremenna

stringDatum = Join(poleDatum, ".")

MsgBox stringDatum

End Sub

Prvý vstup od užívateľa Prvý vstup od užívateľa

Výsledná činnosť makra Výsledná činnosť makra

Rozbor makra: Užívateľ zadá dátum v predpísanom tvare. S pomocou funkcie Split nasekáme reťazec do poľa. Vďaka tomu môžeme využiť swap. Vymeníme nultý prvok s druhým a získame opačne napísaný dátum. Funkcia Join už len premení pole na reťazec a vypíšeme na obrazovku.

No a čo tak ten vstupný reťazec zmeníme na typ Variant? Bude zmena?

5. príklad: Vstupná reťazec nech je typu Variant

Sub swap

Dim poleDatum(0 to 2) As String
Dim stringDatum As Variant
Dim pomocnaPremenna As String

stringDatum = InputBox("Zadajte dátum vo formáte dd.mm.rrrr!")

poleDatum = Split(stringDatum, ".")

pomocnaPremenna = poleDatum(0)

poleDatum(0) = poleDatum(2)
poleDatum(2) = pomocnaPremenna

stringDatum = Join(poleDatum, ".")

MsgBox stringDatum

End Sub 

Prvý vstup od užívateľa Prvý vstup od užívateľa

Výsledná činnosť makra Výsledná činnosť makra

Rozbor makra: Už dávnejšie vieme, že Variant je ako skladisko premenných. Prehltne všetky typy premenných. Ak napíšeme správne reťazec, tak žiadna zmena oproti 4 programu nenastane.

(Jako ve škole) Průměr: 2.33 | Hodnotilo: 6
 

Komentáře

user avatar Martin Banic
Odpovědět
Programovanie makier v LibreOffice: Swap
19. 01. 2017, 04:11:59
Zdravim vsetkych :)

ako nejeden z Vas som dlhe roky programoval MsOff, VBfA, Win32API atd ... Po case som si urobil kniznicu svojich funkcii, ako doplnok Accessu a Excelu.

Ak som mal v mojej kniznici funkciu, ktora pocitala Cenu s DPH, tak som si vo svojom projekte napojil moju kniznicu a ked som potreboval vypocitat Cena s Dph, tak kdekolvek v mojom projekte, ci uz v bunke, alebo v makre som si cenu vypocital.

Postupom casu som uz mal sto projektov, ktore sa vsetky odkazovali na kniznicu s mojimi funkciami. Takyto pristup mal tu vyhodu, ze ked sa zmenila DPH, nemusel som upravovat mojich sto projektov a hladat, kde sa rata DPH, ale som upravil vypocet DPH v mojej funkcii (z kniznice) a logicky vsetkych 100 projektov dokola zacalo pocitat DPH po novom.

AKo urobit obdobnu vec v LibreOffice jednoducho ? Cesta cez Extensions a manualne editovanie Manifestu a dalsich xml suborov je ABSOLUTNE o hovne !
user avatar neutr
Odpovědět
Programovanie makier v LibreOffice: Swap
19. 01. 2017, 10:19:48
Když ta makra dáte do knihovny Moje makra Standard a budete na ni odkazovat tak máte to co hledáte.

Vy jste zřejmě zatím udělal makra jen v určitém dokumentu - a ten má pouze svou knihovnu. Takže Vaše orientace by měla být stejná jen odkázat na knihovnu která je nad všemi moduly. Ještě jednou připomínám že je to ta knihovna která se otevře hned jak zavoláte IDE Basic. Někdy je potřeba deklarovat tak aby to bylo vidět ve všech modulech - ale to byste měl znát.

Tenhle systém má nedostatek v tom, že když někomu pošlete dokument tak nemá Vaši knihovnu a chodit mu to nebude. Pak právě fungují separátní knihovny v dokumentu - dají se přenášet s dokumentem. To je asi také pochopitelné.

Takže ještě maličkost - tahle diskuse by měla být jen rámcově omezena na téma článku. Vy dáváte v podstatě stížnost, ale měl by to být dotaz do fóra. A navíc my se tady sice někdy názorově střetáváme ale vulgarizmy tady místo nemají což byste měl také akceptovat.

Přidat názor

 

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích najdete v nápovědě. Diskuzi můžete sledovat pomocí RSS kanálu.

 
Eduard Boldižár

Eduard Boldižár

Som redaktorom stránky astrotech.cz. Mám 24 rokov. Čas trávim v IT škole. Medzi moje záľuby patrí astronómia, sci-fi literatúra a programovanie.

 
 
 
woo jaw demo hz