Fórum pro uživatele kancelářského balíku OpenOffice | LibreOffice
 

#1 29. 5. 2014 06:12:18

csert
Člen
Registrace: 27. 2. 2014
Příspěvků: 30

Makrem uložit dokument - Vyřešeno

V tabulce mám vytvořené tlačítku s přiřazenou funkcí makra " uložit " dokument. To funguje bez možnosti změnit název souboru. Potřeboval bych, aby se ukládaný soubor jmenoval podle např. vloženého čísla v buňce A1. Ukládaná cesta je pevně nadefinovaná v makru.
děkuji za snahu
M.

REM  *****  BASIC  *****

sub ulozto
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = "file:///C:/Documents%20and%20Settings/My%20Documents/01.xls"
args1(1).Name = "FilterName"
args1(1).Value = "MS Excel 97"

dispatcher.executeDispatch(document, ".uno:SaveAs", "", 0, args1())


end sub

Takhle to vypadá, když to ukládá pod " pevným názvem "

Editoval csert (9. 6. 2014 08:47:17)

Offline

#2 29. 5. 2014 09:59:06

csert
Člen
Registrace: 27. 2. 2014
Příspěvků: 30

Re: Makrem uložit dokument - Vyřešeno

A teď jsem narazil na další problém. Tlačítko si nepamatuje přiřazenou akci ( makro ). Možná by to byl dotaz v jiném vlákně, ale snad se tady někdo chytne.
dík

Offline

#3 29. 5. 2014 11:57:07

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,468

Re: Makrem uložit dokument - Vyřešeno

Začnu od konce. Pravděpodobně nemáte správně uloženo. jestli je makro jen v původním sešitě kde bylo vytvořeno, tak v jiném fungovat nebude. Lze to udělat do knihovny "Moje makra - Standard, nebo určité jméno knihovny (standard je tam automaticky)". Pak ale musíte tuto knihovnu (makro) volat tlačítkem. V knihovně "Moje - Standard" to najde každý sešit, ale v novém sešitě nové tlačítko neví co má spustit - nejdřív se musí přiřadit makro k tlačítku. Řešením by snad bylo kopírování sešitu s tím funkčním tlačítkem - zese to má ale...
        Také je potřeba, aby se název (číslo souboru) načítalo do "stringu". Tedy například takto :

"file:///C:/Documents%20and%20Settings/My%20Documents/"& NázevProměnné &".xls"

Celou adresu musíte zadeklarovat například jako
"Dim sVar as string" a to číslo (název proměnné například jako
"Dim iVar as integer" potom :

sVar = "file:///C:/Documents%20and%20Settings/My%20Documents/"& iVar &".xls"

Následně pak v makru :

args1(0).Name = "URL"
args1(0).Value = sVar

        Nahrávání makra záznamníkem není pro tyto účely příliš vhodné. Podívejte se na seriál od Dana Sedláčka - "Malá makra". Tam tuto problematiku snadno pochopíte.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#4 30. 5. 2014 08:45:24

csert
Člen
Registrace: 27. 2. 2014
Příspěvků: 30

Re: Makrem uložit dokument - Vyřešeno

Začnu také odzadu.
Makro mám " Moje-Standart". Pokud mám přiřazené tlačítko na liště tak vše funguje OK v jakémkoliv sešitě. Pokud vytvořím tlačítku uvnitř sešitu tak se přiřazení k makru ztratí po uložení sešitu.
Píšete:
"V knihovně "Moje - Standard" to najde každý sešit, ale v novém sešitě nové tlačítko neví co má spustit .... " a to nechápu.

Panem Sedláčkem jsem se trochu prokousal, ale tohle zrovna nezvládám.Asi jsem starší ročník. Vaše "trknutí " mě nepomohlo.
Snažím se nastavit proměnnou na buňku G12 jako název ukládaného souboru a buď TO na mě řve, chyba scriptu, nebo TO ukládá jenom jako SAVEAS
děkuji

Ještě jedna poznámka. Pan Sedláček píše o možnosti, že si sešit/tlačítko " nese" makro sebou. Chápu to, že se neodkazuje na knihovnu. To by bylo leště lepší řešení

Editoval csert (30. 5. 2014 09:04:14)

Offline

#5 31. 5. 2014 18:42:15

rejze
Člen
Registrace: 9. 1. 2013
Příspěvků: 51

Re: Makrem uložit dokument - Vyřešeno

Zdravím. Jen pro upřesnění. Pracujete v CALC se souborem .xls? To by mohlo vysvětlovat,proč si tlačítko nepamatuje přiřazenou funkci. Ukládání pod názvem podle obsahu buňky lze takto.

Sub uloz
Dim bunka_nazev as object,document as object
Dim nazev as string

Sheets = ThisComponent.Sheets 'tohle scházelo
Sheet = Sheets.getByIndex(0) 'tohle scházelo
bunka_nazev = sheet.GetCellByPosition (9,6) 'vybere bunku J7 - tohle je upravené
nazev = trim(bunka_nazev.string)
uloz_novy_sesit ("/home/já/dokumenty/"+nazev+".xls") 'zustane promenna nazev+".xls" cestu nutno upravit
      zavri
      otevrit("Cesta k sablone/sablona.ots")
end sub

Sub uloz_novy_sesit (optional cesta as string)
dim oDoc as object
on error goto chyba
  oDoc=ThisComponent
  with oDoc    
       if (not .hasLocation) or .isReadOnly then' pokud jeste nebyl ulozen, nebo je jen pro cteni
        .storeAsURL(ConvertToURL(cesta), Array()) ' ulozit jako
      else
        .store() ' ulozit
      end if
      end with
  exit sub
chyba:
  msgbox("chyba!!!",0,"Chyba uloz_novy_sesit")
stop
end sub

sub zavri
dim oDoc as object
oDoc=ThisComponent
oDoc.Close(true)
end sub

Sub otevrit(optional cesta as string)

	Dim oArgs(2) As New com.sun.star.beans.PropertyValue 
	Dim oDoc
		oFileName = cesta 
		oURL = ConvertToUrl(oFileName)
			oArgs(0).Name="AsTemplate"
			oArgs(0).Value= true
			oArgs(1).Name="TemplateName"
			oArgs(1).Value = "oCalc_template"
			oArgs(2).Name="TemplateRegionName"
			oArgs(2).Value= "oCalcTemplateRegion"
		oDoc = StarDesktop.LoadComponentFromUrl(oURL, "_blank", 0, oArgs())
	Dim oGArgs
	Dim oDocArgs$ as String
	Dim i%
		On Error Resume Next
			oGArgs = oDoc.getArgs()
			for i = 0 to UBound(oGArgs)
				oDocArgs = oDocArgs & oGArgs(i).Name & " = "
				oDocArgs = oDocArgs & oGArgs(i).Value
				oDocArgs = oDocArgs & Chr$(10)
			next i
End Sub

Tlacitku priradite prvni makro uloz a to si zavolá uloz_novy_sesit.

Mělo by to fungovat. Také si upravte bunku J7 podle toho kam vkládáte ten název.

Editoval rejze (6. 6. 2014 07:27:59)

Offline

#6 1. 6. 2014 22:40:22

csert
Člen
Registrace: 27. 2. 2014
Příspěvků: 30

Re: Makrem uložit dokument - Vyřešeno

rejze moc dík za pomoc, ale
ať se snažím sebevíc nejde mě přepsat cesta ukládaného sešitu.
Pokud začnu tak jako Ty
(" blabla\"nazev+".xls") tak to na mě řve ,, uvozovky nesouhlasí,,
, nebo očekává se ,.   
A pokud použiji funkční zápis "file:///C:/Documents%20and%20Settings/My%20Documents/01.xls"
tak taky nic.
Nějak tomu přestávám rozumět.

Offline

#7 2. 6. 2014 06:26:56

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,468

Re: Makrem uložit dokument - Vyřešeno

Já jsem nějakým nedopatřením přehlédl Váš předchozí příspěvek. Proto jsem neodpověděl - omlouvám se. Píšete : "Asi jsem starší ročník. Vaše "trknutí " mě nepomohlo". To není tím starším ročníkem (mimochodem mě už bylo 60 a mohu se také mezi starší ročníky počítat). Drtivá většina příspěvků obsahuje formulaci, která vyvolá nesprávnou asociaci problému. To nemá nic moc společného s věkem, nebo schopností se vyjádřit. Já jenom z tohoto důvodu děvám dost rozsáhlé odpovědi (a dotazy na upřesnění). Autor dotazu je automaticky nezkušený (jinak by se zřejmě neptal). Svůj problém popíše ze svého nezkušeného pohledu. Ti, kteří by chtěli odpovědět (zkušenější) ale většinou neodhadnou správně co autor požaduje. Analýza dotazu je velice důležitá. Už se mi stalo, že jsem byl za upovídané příspěvky kritizován.
       Doufám, že tomu tak nebude z Vaší strany, protože nejasnost ve Vašem popisu také existuje. Bylo by asi potřebné upřesnit z Vaší strany postup :


1. Podle popisu to vypadá, že otevřete nějaký dříve uložený sešit, který již obsahuje makra a tlačítko - já ho nazvu "SešitZdrojů". Makro ovládané tímto tlačítkem může být jako součást sešitu "SešitZdrojů".
1a) Je pak uloženo jenom v knihovně tohoto sešitu (SešitZdrojů - Standard - module..)a parkticky se nedá zavolat odjinud.
1b) Makro je uloženo v knihovně "Moje Standard", která funguje nad všemi různými dokumenty, nejen Calcy a je dostupné vždy po otevření Basicu.
1c) Tlačítko jako takové je vždy součástí pracovní plochy sešitu. Je - li na liště může být přiřazeno buď každému novému Calcu, Nebo jen tomu jedinému (například "SešitZdrojů". Cituji : -

csert 30.5.2014 napsal(a)

Makro mám " Moje-Standart". Pokud mám přiřazené tlačítko na liště tak vše funguje OK v jakémkoliv sešitě. Pokud vytvořím tlačítku uvnitř sešitu tak se přiřazení k makru ztratí po uložení sešitu

     Problém už je jen v tom, že prakticky tlačítko "na liště" neexistuje jako správný výraz. Na liště (hlavní nabídky) může být buď název spojený s makrem (jako klikačka například vedle "Nápovědy" a je to skutečně lišta nabídek), nebo jako ikona. Ikona je obrázkové tlačítko a jako takové může existovat pro všechny Calcy - nové i staré. Místo kde se může nalézat "není lišta nabídek" ale "nástrojové lišty". Spojení "lišta nabídek"+"tlačítko" není úplně špatně, ale je přinejmenším matoucí. Pochopitelně kvůli možné záměně pojmů se ikoně "tlačítko" neříká. Navíc není zřejmé, zda by "ikona" platila obecně pro OOo - Tedy AOO, nebo LO. Může platit právě jen pro jediný sešit a v jiném se nezobrazuje (z toho plyne možná i chyba kterou popisujete "tlačítko se ztrácí"..


2. Podle popisu to také vypadá, že by práce mohla začít ne z již existujícího sešitu, ale z úplně nového - zadáním "Nový sešit". Pokud je tlačítko opravdu jako ikona přiřazená všem Calcům bude fungovat na každém novém i starém souboru (sešitu Calc). Jenomže toto postrádá logiku. Jednak by se makrem ušetřila asi jen jediná operace výběru adresáře a navíc by se musela ručně vyplnit buňka pro nový název (nebo se nakopíruje odjinud schránkou). V takovém případě by stačilo Původní sešit vybevený makrem uložit jen pod jiným názvem -  a pak je podstata vyjádření tohoto dotazu velmi nesprávně formulovaná. Původní (dříve vytvořený) sešit zůstává. proto je možné ho nechat například na ptracovní ploše a jednoduše ho hned otevřít, zadat nový název (adresu) a uložit "jako", nebo makrem.


3. Připadá mi, že možná potřebujete právě řešení automatických souborů z existujícího jediného Calcu a ne ze všech nových. To se ale dělá opravdu uložením toho původního například z "SešitZdrojů".
      Provedete výpočet - zapíšete do buňky (např G12) nový název a uložíte jako (na "SešitěZdrojů") nezávislý dokument. Tohle se ale dělá právě tak, že se "SešitZdrojů" uloží pod jiným názvem - a pak se obnoví jako "SešitZdrojů". Zrovna něco podobného dělám - rozšíření "Variace a Kombinace", které obsahuje rychlý generátor. Ten sám ukládá vygenerované Variace, nebo Kombinace do jednotlivých souborů - jsou jich opravdu kvanta. Bez automatického ukládání by to bylo k ničemu.
Například soubor všech kombinací na Sportku (13.983.816 tipů) vygeneruje a uloží v řádech několika málo hodin - podle výkonu stroje.



      No nic - omlouvám se. Popište svůj problém lépe. Já si pod tím popisem představím poměrně hodně variant řešení, respektive druhů problematik.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#8 2. 6. 2014 07:17:02

rejze
Člen
Registrace: 9. 1. 2013
Příspěvků: 51

Re: Makrem uložit dokument - Vyřešeno

Omlouvám se. Přehlédl jsem,ještě jedno znaménko + má t o vypadat takto ("blabla\"+nazev+".xls")
Pro kontrolu. Když je to správně,text mezi uvozovkami je červený a proměnná mezi plusy zelená.
Opravil jsem rovnou ten kód nahoře,tak by to snad už mělo fungovat.

Editoval rejze (2. 6. 2014 15:14:21)

Offline

#9 2. 6. 2014 21:35:31

csert
Člen
Registrace: 27. 2. 2014
Příspěvků: 30

Re: Makrem uložit dokument - Vyřešeno

pro rejze
už to maká, jenom jsem musel dopsat odkaz na list1

bunka_nazev = ThisComponent.Sheets(0).GetCellByPosition(9,6) 'vybere bunku J7

Teď se ješte pokusím prokousat neutr odpovědí

Offline

#10 2. 6. 2014 23:28:46

rejze
Člen
Registrace: 9. 1. 2013
Příspěvků: 51

Re: Makrem uložit dokument - Vyřešeno

Ještě tedy doplním,že tohle se používá pokud otvíráte sešit jako šablonu. Otevře se bezejména a tímto způsobem se potom pojmenuje podle buňky třeba datumem,nebo pořadovým číslem atd. Možná je to ve zkratce to co neutr rozepsal výše. Určitě si to dobře pročtěte,jelikož p.neutr vždycky dobře směruje. Navíc a možná to dělá záměrně,to nedá zadarmo,takže se člověk pak při tom naučí problém zvládnout sám.

Editoval rejze (2. 6. 2014 23:35:07)

Offline

#11 3. 6. 2014 01:47:20

csert
Člen
Registrace: 27. 2. 2014
Příspěvků: 30

Re: Makrem uložit dokument - Vyřešeno

rejze napsal(a)

Ještě tedy doplním,že tohle se používá pokud otvíráte sešit jako šablonu. Otevře se bezejména a tímto způsobem se potom pojmenuje podle buňky třeba datumem,nebo pořadovým číslem atd. Možná je to ve zkratce to co neutr rozepsal výše. Určitě si to dobře pročtěte,jelikož p.neutr vždycky dobře směruje. Navíc a možná to dělá záměrně,to nedá zadarmo,takže se člověk pak při tom naučí problém zvládnout sám.

A to je to poslední co mě dělá problém.
Mám bezejmennou šablonu *.ots s tlačítkem v listě, které má přiřazené makro z modulu standart. Makro změní a uloží šablonu na "název_buňky.xls" Až sem je to OK.
Ale teď mě zůstane otevřený sešit *.xls, kde už tlačítko s makrem nefunguje takže je třeba xls ručně zavřít a otevřít šablonu. A tím pádem makro ztrácí význam ( jak píše p.neutr. )
Nemohlo by makro pokračovat? xls neotvírat, nebo ho zavřít a nechat otevřenou šablonu. Bohužel nemohu takový příkaz najít. A docela mě pomohlo:
http://www.gymkrom.cz/web/ict/materialy … O-Calc.pdf

Offline

#12 3. 6. 2014 08:00:45

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,468

Re: Makrem uložit dokument - Vyřešeno

Děkuji rejze za pochvalu :-)
      Nyní už je podle csert problém čitelnější. Odzkoušejte následující kód :

Sub UlozJako
Dim sFileName As String
Dim sPath As String
Dim sSaveToURL as string  
       'Adresář sPath podle notace Windows ("C:\"), nebo Linux ("/home/")   
       sPath = "C:\"
       sFileName = thisComponent.getSheets.getByName("List1").getCellRangeByName("G12").getString
       sSaveToURL = ConvertToURL(sPath & sFileName)
'      Volba pro uložení jako Calc (ods), nebo Excel (xls) Název musí být v buňce vybaven koncovkou.
       thisComponent.storeToUrl(sSaveToURL, Array(MakePropertyValue("FilterName", "Calc8")))       
'      thisComponent.storeToUrl(sSaveToURL, Array(MakePropertyValue("FilterName", "MS Excel 97")))       
End Sub

Function MakePropertyValue(Optional sName As String, Optional sValue) As com.sun.star.beans.PropertyValue
Dim oPropertyValue As New com.sun.star.beans.PropertyValue       
        If Not IsMissing(sName) Then
           oPropertyValue.Name = sName
        EndIf       
        If Not IsMissing(sValue) Then
           oPropertyValue.Value = sValue
        EndIf   
	MakePropertyValue() = oPropertyValue
End Function

V buňce (například G12) musí být složený výraz pro Calc. V "G1" je vlastní číslo jako název

=G1 & ".ods"

Nebo výraz pro Excel (varianta pro excel je nyní vyřazena.

=G1 & ".xls"

    Pokud je potřeba ukládat jako .xls vyřadíme pomocí jednoduché uvozovky (nebo REM) řádek se zápisem "Calc8" a naopak aktivujeme (smazáním uvozovky) řádek s "MS Excel 97".
    Je možné samozřejmě použít i jiné filtry než Calc8 a Excel 97. Uloží se nový a zcela prázdný dokumen pod jménem, které je v buňce. POZOR soubor se neotevírá, jen se objeví v adresáři !!!
    Nevím jestli to bude chodit ze šablony, ale chodí to z běžného sešitu, který se sám o sobě nepřejmenuje.



  Je to vhodné jen pro omezený okruh úloh, přestože takto vytvořený sešit je kopií původního (obsahuje i makra). Pokud by bylo potřeba ho hned otevřít musí se připsat kód - 1 řádek.
     Častěji je potřeba uložit obsah sešitu jako mezifázi procesu a bez maker. To se dělá jinak. Popisoval jsem to například výše. Aktivní sešit se uloží "jako něco" (nejčastěji jako CSV) a obnoví se do původního stavu. Tohle ale podle všeho nepotřebujete.
     Jinou metodou je vytvořit nový zcela prázdný sešit, ihned ho otevřít (například jako skrytý) a data do něj makrem vložit - respektive jen přejmenovat a nic nevkládat.


     Kód neřeší například oznámení, že stejnojmenný soubor už existuje - a jednoduše ho přepíše. To může být problém. Zase malou úpravou je možné uložit se znakem rozšiřujícím původní název - nebo poznámkou například "druhý". Také by bylo někdy potřeba přerušit makro a vytvořit dotaz pomocí MsgBoxu co se má v takovém případě udělat a přidat kód pro takovou specifickou úpravu.

Editoval neutr (3. 6. 2014 08:27:32)


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#13 3. 6. 2014 16:31:17

rejze
Člen
Registrace: 9. 1. 2013
Příspěvků: 51

Re: Makrem uložit dokument - Vyřešeno

Poračovat může. Zavře se a uloží. Potom si otevřete novou šablonu,případně pokud chcete automaticky znovu otevřít šablonu,tak to lze taky. Myslim,že potřebujete ukládat a cyklicky otvírat novou šablonu,dokud na dotaz msgboxu nezvolíte konec. Pokud je to tak. Až přijdu domů. Dám sem na to kód.

Offline

#14 3. 6. 2014 21:04:05

csert
Člen
Registrace: 27. 2. 2014
Příspěvků: 30

Re: Makrem uložit dokument - Vyřešeno

rejze napsal(a)

Poračovat může. Zavře se a uloží. Potom si otevřete novou šablonu,případně pokud chcete automaticky znovu otevřít šablonu,tak to lze taky. Myslim,že potřebujete ukládat a cyklicky otvírat novou šablonu,dokud na dotaz msgboxu nezvolíte konec. Pokud je to tak. Až přijdu domů. Dám sem na to kód.


Ano je to tak. Potřebuji ukládat a cyklicky otevírat novou šablonu. Ukládaný sešit vidět nepotřebuji, nemusí se ani otevírat a msgbox mě taky nezajímá. Nemělo by nastat případ, že uložím dva stejné názvy. Pokud ano tak to nebude zas taková tragédie. Potřebuji tento úkon co nejvíce zjednodušit.
Otevřít, doplnit, uložit.
moc  děkuji

Offline

#15 4. 6. 2014 07:57:23

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,468

Re: Makrem uložit dokument - Vyřešeno

Dovolil jsem si poopravit kód od rejze. Chyba byla v deklaraci buňky :
-------------------------------------------------------------------------

Sub uloz
Dim bunka_nazev as object 
Dim nazev as string
Sheets = ThisComponent.Sheets 'tohle scházelo
Sheet = Sheets.getByIndex(0) 'tohle scházelo
bunka_nazev = sheet.GetCellByPosition (9,6) 'vybere bunku J7 - tohle je upravené
nazev = trim(bunka_nazev.string)
uloz_novy_sesit ("C:\"+nazev+".xls") 
'zustane promenna nazev+".xls" cestu nutno upravit - notace "C:\" je pro Windows
'rejze uvádel originálně notaci pro Linux
end sub

Sub uloz_novy_sesit (optional cesta as string)
dim oDoc as object
on error goto chyba
  oDoc=ThisComponent
  with oDoc    
       if (not .hasLocation) or .isReadOnly then' pokud jeste nebyl ulozen, nebo je jen pro cteni
        .storeAsURL(ConvertToURL(cesta), Array()) ' ulozit jako
      else
        .store() ' ulozit
      end if
      end with
  exit sub
chyba:
  msgbox("chyba!!!",0,"Chyba uloz_novy_sesit")
stop
end sub 

     Makro ukládá otevřený sešit, a znamená to že když tam bude makro, uloží se i makro. Ovšem funguje to nejen ze sešitu, ale také z "Moje makra Standard", takže když kód uložíte tam, a spustíte tlačítkem z aktivního sešitu, makro tam není - je tam jenom to co je na prvním listu, respektive také na všech ostatních - jsou - li tam nějaké.
     Vlastní sešit přejmenovaný zůstává otevřený. Zase na druhou stranu v nově uloženém sešitě je právě také tlačítko, které funguje, takže se dá ten samý proces opakovat (uložit pod jiným názvem).
     To samo o sobě nemusí být špatně, ale jestli se má sešit postnout například jiným uživatelům k reálnému užití - je to zbytečné a matoucí. Navíc je to asi určeno pro MS Excel - kde to fungovat jistojistě nebude. Nicméně když to bude jen pro Vás - víte oč kráčí a nevadí Vám to.
     Šlo by to změnit tak jak popisujete, ale chce to zásah do kódu. Možná pro takovou úpravu bude inspirací následující kód.
-------------------------------------------------------------------------

Sub UlozPrazdny
Dim sFileName As String
Dim sPath As String
Dim sSaveToURL as string       
       sPath = "C:\"
       sFileName = thisComponent.getSheets.getByName("List1").getCellRangeByName("G12").getString
       sSaveToURL = ConvertToURL(sPath & sFileName)
       thisComponent.storeToUrl(sSaveToURL, Array(MakePropertyValue("FilterName", "MS Excel 97"))) 
       uloz_do_zavreneho(sSaveToURL)     
End Sub

Function MakePropertyValue(Optional sName As String, Optional sValue) As com.sun.star.beans.PropertyValue
Dim oPropertyValue As New com.sun.star.beans.PropertyValue       
        If Not IsMissing(sName) Then
           oPropertyValue.Name = sName
        EndIf       
        If Not IsMissing(sValue) Then
           oPropertyValue.Value = sValue
        EndIf   
	MakePropertyValue() = oPropertyValue
End Function

sub uloz_do_zavreneho(ByVal adresa as string)
Dim arg(0) As New com.sun.star.beans.PropertyValue
arg(0).Name = "Hidden" ' otevřeme jako skrytý
arg(0).Value = True
cilovy_dok = stardesktop.loadComponentFromUrl(adresa,"_blank",0,arg())
list_cile = cilovy_dok.sheets(0)
RangeToClear = list_cile.getCellRangeByPosition(0,0,1023,1048575)
RangeToClear.clearContents(23) 'Maže obsah sešitu - hodnoty, čísla a vzorce
RangeToClear.clearContents(64) 'Maže styly
RangeToClear.clearContents(128)'Maže grafické objekty (tedy také tlačítko)
cilovy_dok.store()
cilovy_dok.close(True)
'msgbox "Nový sešit uložen jako prázdný",0,"NOVÝ DOKUMENT ULOŽEN"
end sub 

      Toto makro je také vlastnostmi podobné tomu předchozímu právě tím, že je podstatné, kde je uloženo. Když bude uloženo jen v konkrétním sešitě, vykopíruje také makro, které nese vlastně zbytečně. Jednak k němu už není tlačítko, a také pokud ho otevře MS Excel - nebude fungovat.
      Takže opět je vhodné ho uložit do knihovny "Moje Makra Standard" a v sešitě vytvořit jen tlačítko, které spouští makro "UlozPrazdny". Ve výsledku je pak uložen skutečně sešit který je prázdný. Nemá na sobě ani tlačítko, ani nic jiného (maže se pouze 1. list), ale lze snadno smazat i všechny ostatní. To jsem neřešil, protože na druhém a dalším listu může být také individuální obsah a smazání by mohlo být nežádoucí.


      Na rozdíl od makra, které uvádí rejze se tento sešit jenom kopíruje ale jinak zůstává nedotčený. Je stále otevřený pod svým vlastním názvem (není obnovovaný tak jak to dělávám já nejčastěji). Sešit podle kódu rejze se přepisuje, takže pracujete vždy se sešitem, který má nové jméno.
      Na rozdíl od makra od 'rejze' musíte do buňky ze které čtete název přidat také koncovku. Uloží se to i bez koncovky, a pro OS je to neidentifikovaný soubor - zeptá se v čem to otevřít. Takže postup jsem uvedl již v příspěvku dřívějším. Jde o to, že název v buňce může být jenom text bez uvozovek, ale s koncovkou .xls (nebo příslušnou jinou koncoku třeba .ods aj.).
      Pokud se má generovat název, tak se uvede například pro buňku G12 = G1 & ".xls" - v Buňce G1 je například jen nějaké číslo, nebo se do ní bude generovat název (jméno ap) ze seznamu.
-------------------------------------------------------------------------
Společné možnosti
- Možností pro rozšíření kódu od rejze je přidání mého makra uloz_do_zavreneho. Makro by mělo smazat obsah sešitu, který je již zavřený - když by se spustilo na aktuální - otevřený sešit vyskočí chyba. Když by se také upravilo, aby fungovalo v aktuálním sešitě - smaže tlačítko a jsme nahraní. Tlačítko by se muselo znovu vytvořit. Takže tudy cesta asi nevede. Ale v podstatě to lze udělat na soubor zpětně když v makru podržíme proměnou "adresa" z původního sešitu a pustíme ji do makra které původní sešit "poseká".
- V makru 'uloz_do_zavreneho' je komentář k řádkům, které mažou. Takže je možné například nastavit jen smazání grafického obejktu (což je tlačítko) ap.
- Existuje - li nějaká potřeba ukládat za sebou sadu sešitů a známe - li předem jaké budou mít názvy.
     Například jste uváděl čísla, ale mohou to být i jména - například sešit se jménem uživatele a ten se hned uzamkne heslem. Uživateli pak pošlete sešit jiným kanálem, nežli heslo - to ovšem nejde pro MS OFFICE, ale je možné například z Calcu generovat sešity Writer pod jménem a heslem ap.
     V takovém případě, kdy je znám seznam, nebo algoritmus názvů, lze postavit makro, které jedním vrzem vygeneruje tisíce sešitů. Respektive pokud je název výsledkem nějaké operace, lze do makra této základní operace vložit výše uvedený kód. Je to poměrně běžná praktika.

Editoval neutr (4. 6. 2014 08:23:55)


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#16 4. 6. 2014 21:14:17

rejze
Člen
Registrace: 9. 1. 2013
Příspěvků: 51

Re: Makrem uložit dokument - Vyřešeno

Zdravím. Dostal jsem se sem až dnes. Nahoře je doplněna oprava od neutr a pár řádků aby se sešit zavřel. Děkuju za upozornění.

Editoval rejze (4. 6. 2014 21:15:44)

Offline

#17 4. 6. 2014 21:26:21

csert
Člen
Registrace: 27. 2. 2014
Příspěvků: 30

Re: Makrem uložit dokument - Vyřešeno

pro neutr:
1 / zkusil jsem dopsat ty dva řádky do " mého " scriptu " ulož a makro se hned zastavilo na prvním dopsaném řádku "" Sheets................   vlastnost, nebo metoda nenalezena......
Tak jsem zkusil ještě překopírovat celé Vaše makro a chyba byla stejné.

2 /  makro ulož prázdný se zastaví na  řádku  sFileName = this ...............vlastnost, nebo metoda nenalezena......
Bohužel moje znalosti chybu nevidí
Možná jsem neupřesnil, že opravdu používám Win a OO. Takže ani Linux, ani MS Excel
M

Offline

#18 5. 6. 2014 09:18:34

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,468

Re: Makrem uložit dokument - Vyřešeno

ad 1/ - oprava těch dvou řádků kterou jste uváděl se týká makra prvního (od rejze). Aby to fungovalo musíte ještě přepsat třetí řádek (ty dva Vámi citované jsou jen deklarace). Vlastní funkčnost zajišťuje právě ten řádek následující, tedy
bunka_nazev = sheet.GetCellByPosition (9,6)
Původně tam bylo něco jiného. Takže bez této úpravy to chodit nemůže.
----------------------------------------------------------------------
ad 2/ - píšete "Tak jsem zkusil ještě překopírovat celé Vaše makro a chyba byla stejné.". Tohle je ale jiný systém maker - ten druhý - ode mne a musí se překopírovat všechny 3 procedury a funkce.
      Mezi námi není divné že to hlásí stejnou chybu jako nesprávně opravené makro od rejze? Proč jste proboha místo opravy celý kód (od rejze mnou opravený, nebo opravený přímo od rejze) nepřekopíroval místo toho co jste už měl v modulu Basic?
      Totéž s mým kódem (2 makra a 1 funkce). Všechny 3 zkopírovat a vložit do Basicu. To co uvádíte jako chybu mého kódu má asi prozaickou podstatu :
sFileName = thisComponent.getSheets.getByName("List1").getCellRangeByName("G12").getString
Jednoduše zřejmě nemáte list pojmenovaný jako "List1". Do makra napište svůj název listu a neměl byste opomenout aby byl v uvozovkách.
POZNÁMKA :
Listy lze určit také jinou deklarací konkrétně :
sFileName = thisComponent.getSheets.getByIndex(číslo od nuly 0=1.list)
To ale načte vždy ten list, který je podle čísla pořadí od levé strany (0 je 1. list vlevo). Stačí listy přehodit a čte to jiný list. Což není moc vhodné kvůli této možnosti chyby. Když tam je uveden název jako text .getByName("něco") tak se načte vždy jenom tento list ať už je kde chce - hlavně že existuje

       Takže dle mne nemáte správné jméno listu, na kterém chcete číst adresu. Ale je jasné že začátečník naráží na podivnosti kterým samozřejmě nerozumí, netož aby pochopil z chybové hlášky oč jde. Takových věcí je hodně. Nejhorší jsou sémantické chyby - makro nechodí jak má, ale nehází chybovou hlášku.
       Ještě bych doporučil maličkost : Dejte si například kód od rejze do samostatného modulu (záložka v Basicu - standardně je vytvořen "Module 1"). Postavte kurzor na spodní lištu okna Basic a pravým tlačítkem vyvolejte "Vložit" - modul Basic" (bez dalšího se vloží Module 2, potom Module 3 ..., nebo vytvořte z nabídky :
"Nástroje" > "Makra" > "Správce maker" >"LibreOffice Basic" (obecně OpenOffice.Basic podle toho co užíváte). Vyberte nejlépe "Moje Makra - knihovna Standard" - tlačítko "Organizátor" > tlačítko "Nový". Vyskočí dialog kde zadáte své jméno nového modulu.
       Má to velice praktický důvod. Když totiž v kódu některého "SUB", Nebo "Function" bude chyba, kterou Basic najde nedovolí spustit nic z tohoto modulu - například stejné názvy maker. Takže chyba jednoho systému blokuje spuštění jiného systému - který s tím chybným vůbec nesouvisí.
       Když je chyba v jiném modulu - Basic neblokuje kód aktivního modulu. při tom se dá samozřejmě volat makro (funkce) z jiného modulu stejné knihovny bez dalších deklarací. Ale když tam bude chyba (na modulu kde leží volaná procedura) chyba vyskočí. Z principu to chce pracovat s kódem opatrně a testovat tak, aby bylo možné určit kde je chyba alespoň ve smyslu lokace.
    Proto si do jednoho modulu dejte kód od rejze 2 makra, a do druhého modulu kód ode mne - 2 makra + funkce. Až to budete mít otestované a bez chyby můžete to dát do stejného modulu. Jen tam nesmí být stejné názvy. Takže obecně - testujte nové kódy na samostatném modulu Basic a pak je kopírujte do modulů, které máte k běžnému užívání - obsah testovacího modulu smažte, nebo odstraňte celý testovací modul.

Editoval neutr (5. 6. 2014 09:39:51)


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#19 5. 6. 2014 21:47:49

csert
Člen
Registrace: 27. 2. 2014
Příspěvků: 30

Re: Makrem uložit dokument - Vyřešeno

pro neutr.
Pane neutr. Děkuji za Vaši snahu mě navést k vytvoření kódu. Bohužel jsem " makro_laik" a Vaše rady mě jenom nutí se prokousávat programováním. Z Vašich odpovědí je vidět, že problematice rozumíte, ale toto nebylo předmětem vlákna. Pouze jsem potřeboval pomoct s vytvořením z mého pohledu jednoduchého kódu pro ukládání sešitu, kde bude název souboru obsahovat číslo v buňce. To mám částečně hotovo díky "rejze". Pouze se vyskytly související problémy s ukládáním. Shrnu to a požádám Vás o úpravu, nebo doplnění kódu. Případně mě kontaktujte na   csert@email.cz Děkuji.
Mám vytvořenou šablonu *.ots s tlačítkem ( třeba na buňce G18 )uvnitř listu ( list 1 ). Tlačítko má přiřazené makro na uložení šablony, kde v názvu souboru je obsah buňky G12 s příponou*.xls.
Až sem vše funguje. Bohužel potřebuji šablonu ukládat několikrát za sebou vždy s jiným názvem ( G12 ). Přepisuji v šabloně pár buněk.
Ale po uložení šablony zůstane otevřený sešit (G12).xls, kde již tlačítko nefungule. To je pochopitelné.
Můj dotaz zní. Bylo by možné do současného scriptu dopsat řádek
" zavři současný otevřený sešit *.xls ( nebo při uložení šablony sešit ani neotevírej )
a otevři šablonu *.ots "
kód makra:
Sub uloz
Dim bunka_nazev as object,document as object
Dim nazev as string

document= ThisComponent.CurrentController.Frame
bunka_nazev = ThisComponent.Sheets(0).GetCellByPosition(6,11) 'vybere bunku G12
nazev = trim(bunka_nazev.string)
uloz_novy_sesit ("C:\Documents and Settings\My Documents\"+nazev+".xls")
end sub

Sub uloz_novy_sesit (optional cesta as string)
dim oDoc as object
on error goto chyba
  oDoc=ThisComponent
  with oDoc   
       if (not .hasLocation) or .isReadOnly then' pokud jeste nebyl ulozen, nebo je jen pro cteni
        .storeAsURL(ConvertToURL(cesta), Array()) ' ulozit jako
      else
        .store() ' ulozit
      end if
      end with
  exit sub
chyba:
  msgbox("chyba!!!",0,"Chyba uloz_novy_sesit")
stop
end sub

Moc děkuji za krátkou odpověď

Offline

#20 6. 6. 2014 04:52:57

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,468

Re: Makrem uložit dokument - Vyřešeno

Samozřejmě že to jde udělat. Vzhledem k tomu, že toto může být zajímavé také pro jiné uživatele a už jsem se v kódu vrtal - udělám to jako rozšíření. Předpokládám možnost volby mezi více druhy ukládání. Místo tlačítka udělám buď ikonu, nebo spíš nabídku v hlavním pruhu. Z té se otevře vybraný druh šablony jako nový sešit, který si pak můžete uložit pro další potřeby využítí v budoucnu.
      První verzi udělám jen na Vaše zadání a jeho varianty. To by mělo být už dnes, pokud mi do toho nic nevleze. Základní variantu v této podobě ale rozšířím o náhradu hromadné korespondence, která je zřejmě někdy z neznámých důvodů nefunkční.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#21 6. 6. 2014 07:25:16

rejze
Člen
Registrace: 9. 1. 2013
Příspěvků: 51

Re: Makrem uložit dokument - Vyřešeno

Zdravím. Nahoře je ten kód doplněný o to co potřebujete. Tedy uloží dokument .xls, zavře ho a znovu otevře šablonu. Nezkoušel jsem funkčnost,ale jednotlivá makra používám a fungují. Zkopírujte to celé,upravte cesty a mělo by to jít. Navíc ta makra na otevírání a ukládání lze volat s jinými cestami i z jiných maker,která budete používat. Napsal jsem Vám to jako jeden kód,ale jinak je výhodné ta makra s deklarací (proměnná optional) mít v separátním modulu a volat si je dle potřeby.

Editoval rejze (6. 6. 2014 07:38:52)

Offline

#22 9. 6. 2014 08:46:39

csert
Člen
Registrace: 27. 2. 2014
Příspěvků: 30

Re: Makrem uložit dokument - Vyřešeno

A je to. Díky moc hlavně " rejze".
Jenom pro úplnost a přehlednost uvádím celý kod:

Sub uloz_protokol
Dim bunka_nazev as object,document as object
Dim nazev as string

Sheets = ThisComponent.Sheets
Sheet = Sheets.getByIndex(0)
bunka_nazev = sheet.GetCellByPosition (6,11) rem pro buňku G12, buňky jsou číslovány od O ne od 1
nazev = trim(bunka_nazev.string)
uloz_novy_sesit ("C:\( vlož celou cestu ).xls")
      zavri
       otevrit("C:\( vlož celou cestu ).ots")
end sub

Sub uloz_novy_sesit (optional cesta as string)
dim oDoc as object
on error goto chyba
  oDoc=ThisComponent
  with oDoc   
       if (not .hasLocation) or .isReadOnly then' pokud jeste nebyl ulozen, nebo je jen pro cteni
        .storeAsURL(ConvertToURL(cesta), Array()) ' ulozit jako
      else
        .store() ' ulozit
      end if
      end with
  exit sub
chyba:
  msgbox("chyba!!!",0,"Chyba uloz_novy_sesit")
stop
end sub

sub zavri
dim oDoc as object
oDoc=ThisComponent
oDoc.Close(true)
end sub

Sub otevrit(optional cesta as string)

    Dim oArgs(2) As New com.sun.star.beans.PropertyValue
    Dim oDoc
        oFileName = cesta
        oURL = ConvertToUrl(oFileName)
            oArgs(0).Name="AsTemplate"
            oArgs(0).Value= true
            oArgs(1).Name="TemplateName"
            oArgs(1).Value = "oCalc_template"
            oArgs(2).Name="TemplateRegionName"
            oArgs(2).Value= "oCalcTemplateRegion"
        oDoc = StarDesktop.LoadComponentFromUrl(oURL, "_blank", 0, oArgs())
    Dim oGArgs
    Dim oDocArgs$ as String
    Dim i%
        On Error Resume Next
            oGArgs = oDoc.getArgs()
            for i = 0 to UBound(oGArgs)
                oDocArgs = oDocArgs & oGArgs(i).Name & " = "
                oDocArgs = oDocArgs & oGArgs(i).Value
                oDocArgs = oDocArgs & Chr$(10)
            next i
End Sub

Offline

Zápatí