Celé se to dá řešit mnohem elegantněji. Jak jsem psal ve svém dalším
příspěvku, může mít každá událostní procedura jako parametr objekt
událost, z níž se dá vyčíst vše o prvku, který událost vyvolal.
Každý ovládací prvek formuláře má vlastnost "Další informace", která
slouží k využití dle vlastních potřeb. Pokud do této vlastnosti zapíšete
adresu buňky (třeba v klasickém tvaru List1!A1) můžete v událostní
proceduře tuto hodnotu zjistit a použít k dosazení data do patřičné
buňky. Ještě výhodnější je použít pojmenované oblasti - když budete
tabulky upravovat vkládáním či mazáním řádků/sloupců, pojmenovaná oblast
se bude přesouvat a nebudete v kombu muset nic měnit. Jedna událostní
procedura pak snadno obslouží libovolný počet datových (a i jiných polí
- i typ pole lze zjistit z objektu událost).
Jako ukázku zvolím nejjednodušší variantu - předpokládám, že všechna
datová pole budou na listu List1. Přes buňku C3 budu mít překreslené
datové pole a budu chtít, aby hodnota z pole se vkládala rovněž do buňky
C3. Do vlastnosti "Další informace" u daného datového pole tedy zapíšu C3.
Procedura pak bude vypadat následovně:
sub ControlValue(oEvt)
'Makro zjisti, do ktere bunky ma dosadit vybrane vybrane datum
'Muze obslouzit libovolny pocet datovych poli bez zasahu do programu
Dim oDocument as object, oSheets as object, oSheet as object
Dim oDpage as object, oDatum as object, oRange as object
Dim Result as string, SheetName as string, Bunka as string
Dim radek as integer
SheetName = "List1" 'Nazev listu
oDocument = ThisComponent
oSheets = oDocument.Sheets
oSheet = oSheets.GetByName(SheetName)
Bunka = oEvt.Source.Model.Tag 'Precteni vlastnosti "Dalsi
informace"
Result= oEvt.Source.Text 'Hodnota data jako text
oRange = oSheet.getCellRangeByName(Bunka) 'Ziskani oblasti z
adresy bunky
oRange.value = dateValue(Result) 'dosazeni hodnoty data do bunky
end subend sub
Ukazku se dvěma datovými poli obsluhovanými jednou událostní procedurou
si muzete stáhnout z http://web.telecom.cz/funtrio/file/MacroTest_3.ods
Zdravím,
Jiří Spitz
Tomas Bilek napsal(a):
Díky informacím předchozího příspěvku se mi podařilo vytvořit jakž takž
použitelnou proceduru, která hodnotu z "Pole pro datum" vloží do buňky
která je právě vybraná.
To má výhodu v tom že pomocí jednoho "Pole pro datum" a k ní přiřazené
proceduře lze vybrané datum zapsat do jakékoliv buňky na listu
a také možnost pole kopírovat na další listy bez ztráty funkčnosti.
Nevýhodou je určitá nepřehlednost - datum se zadává v poli (které je třeba
ve hlavičce sloupce s datumy), ale cílová buňka je někde pod ním.
Uživatel musí
nejprve vybrat buňku kam se bude vkládat a potom klepnout na šipku "Pole
pro datum".
Také je možnost zavlečení nechtěných chyb při nahodilém použití.
Takže celý postup zprovoznění je tento:
1. Do uvažovaného souboru přidat Basic modul a nakopírovat tam proceduru
"ZapisDatum".
2. Do listu vložit "Pole pro datum", v jeho vlastnostech nastavit v
"Obecné"
Rozbalit=Ano, zajistit aby stejný "Název" byl uveden i v proceduře
(DateField).
V záložce "Události" přiřadit makro "ZapisDatum" k "Text změněn" (nebo
k "Při ztrátě zaměření"?).
3. Vypnout režim návrhu a vyzkoušet. (Pokud se má v buňce ukázat opravdu
datum tak
je třeba také nastavit "Formát buněk/čísla/datum".)
Sub ZapisDatum 'zapise datum zadane datumovym polem do bunky s kurzorem
dim oDoc, oSelect as object
dim Result, shtname, DatPole as string, sht as integer
DatPole = "DateField" ' nazev ve vlastnostech datumoveho pole musi
souhlasit oDoc = ThisComponent
oSelect=oDoc.CurrentSelection.getRangeAddress
'oBrowser(oDoc.CurrentSelection.getRangeAddress)
sht=oSelect.Sheet ' index listu s kurzorem
shtname=oDoc.sheets(sht).name 'jmeno listu
oDatum = oDoc.Sheets(sht).DrawPage.Forms(shtname).getByName(DatPole) '
odkaz na datumove pole
'oDatum.HelpText="Zadejte nebo vyberte datum které bude vloženo na místo
kurzoru."
Result= oDatum.text
On Local Error GoTo NODOCUMENTTYPE ' ignoruje chyby - např nesmyslne
zadane datum
' zapsat do bunky na ktere je kurzor.
if result <> "" then
oDoc.sheets(sht).getCellByPosition(oSelect.StartColumn,oSelect.StartRow).Value
= dateValue(Result) else
oDoc.sheets(sht).getCellByPosition(oSelect.StartColumn,oSelect.StartRow).string
= ""
end if exit sub
NODOCUMENTTYPE:
beep End Sub
Pokusný soubor zde: http://www.volny.cz/tombil/DatumVybraneZKalendare.ods
Zdraví
Tom B.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]