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É