Otevření dokumentu Office bez rozlišení verze
Zřejmě jste si všimli, že s příchodem balíku Office 2007 se změnil i typ
výchozích formátů souborů při ukládaní dokumentů.
Pokud píšete aplikace pro více uživatelů a ti mají různé verze Office včetně
nových 2007 a navíc ve svém kódu používáte metodu
GetOpenFileName, určitě jste
už museli řešit, jak nechat vybrat uživatele ten správný typ formátu.
Pří použití metody GetOpenFileName
máte možnost nastavit filtry pro výběr formátu, ale taky nemusíte žádné omezení
nastavovat a nechat uživatele vybrat ze všech typů souborů
( txt, doc, xls, bas, dbf,mdb a tisíce dalších ), což se v praxi moc
nepoužívá neboť to uživatele zdržuje. Většinou se snažíme ukázat pouze ty dokumenty,
které nás zajímají.
Vytvoření filtru je naprosto jednoduché, stačí napsat jakýkoliv textový popis,
který se zobrazí v comboboxu Typ souboru (Files of type) a vůbec nezáleží jaký
textový popis zvolíte, ale běžnou praxi je napsat název aplikace např.
Application.GetOpenFilename("Excel(*.xls),*.xls")
' ale muzete napsat opravdu cokoliv, jako textovy popis
' a dokonce nemusite uvadet text za carkou - carku ale ponechat musite
Application.GetOpenFilename("Moje soubory jen moje(*.xls),")
Obrázky obou případu následují
Pokud byste si třeba napsali svůj vlastní program, který by používal vlastní
typy souboru stačilo by pak napsat tento jednoduchý kód, který by zobrazil pouze
Vaše soubory ( zvolil sem koncovky "aaa" )
Application.GetOpenFilename("Vaše aplikace (*.aaa),*.aaa")
Teď už zbývá vyřešit pouze otázku, jak uživateli zobrazit typy souboru
starších verzí Office tak nejnovějších 2007.
Opět máme více možnosti, můžeme vybrat jaký typ
dokumentu uživatel chce vidět v comboboxu "typ souboru". Tzn. že si klasicky rozklikne
šipku a vybere jestli chce vidět dokumenty pouze xls nebo xlsx atd.
Programový kód by vypadal takto
Application.GetOpenFilename("Excel Files (*.xls),*.xls,Excel Files 2007 (*.xlsx),*.xlsx")
' pomoci argumentu FilterIndex muzeme urcit
' ktery typ bude vybrat jako prvni
Application.GetOpenFilename (FileFilter:="Excel Files (*.xls),*.xls,Excel Files 2007 (*.xlsx),*.xlsx",FilterIndex:=2)
Všimněte si, že jednotlivé typy dokumentů jdou pěkné za sebou a jsou odděleny čárkou.
Nejprve celá specifikace klasického xls - Text položky(přípona) čárka a pak následuje
další typ dokumentu. Výsledek vidíte na obrázku níže
Další z možnosti je vypsat všechny typy dokumentů, které chceme mít možnost otevřít
do jednoho řádku. Jak se to dělá? Je to opět tak jednoduché jako předchozí případ.
Kód je tentokrát delší, protož vypisujeme všechny možné typy dokumentu Excelu, ale
rozdíl v zápisu je pouze ten, že vyměníme čárku za středník mezi
jednotlivými typy dokumentů.
Application.GetOpenFilename(FileFilter:="All Excel Files (*.xlsx;*.xlsm;*.xlsb;*.xlam;*.xltx;*.xltm;*.xls;*.xlt),")
A nakonec zbývá poslední možnost jak nechat uživatele vybrat typ souboru bez omezeni verze.
Výhoda posledního souboru je univerzálnost, pokud Microsoft nezmění první dvě písmenka
a vždy bude jen přidávat nebo měnit písmena u přípony Excel dokumentu, tak už
nikdy nebude muset dopisovat další koncovky do kódu, tak jak tomu je v příkladu výše.
Nevýhoda je, že se můžou zobrazit i soubory, které s Excelem nemají nic společného,
ale jejich přípony dokumentů začínají na "xl" ( nejsem si jistý, jestli toto
má Microsoft patentováno ).Další možnou nevýhodou je zobrazení hvězdičky
v typu dokumentu, záleží na uživateli, jestli se mu to bude líbit nebo ne.
Kód pro toto univerzální řešení následuje
Application.GetOpenFilename(FileFilter:="All Excel Files (*.xl*),")
Jak sami vidíte, jdou vybrat všechny typy dokumentu pro Excel nový i starší.
Komentáře
Přehled komentářů
Pokud to dobre chapu, mel by Vam pomoci tento odkaz
http://groups.google.com/group/microsoft.public.excel.programming/msg/0f8e66f9e6f73cc4?pli=1
kde je diky API(ktere je zapouzdreno v tride), vyresen vas problem
GetOpenFileName - Initial FileName ?
(Standa, 13. 9. 2008 9:03)
Hezký popis funkce GetOpenFileName. Všechno je jasné. Ale co bych ještě rád věděl je, jak nastavit okénko FileName (v textu je nad okénkem Files of type). Pak by bylo uživateli naznačeno, o jaký soubor by mělo jít především ... Jde tato proměnná před voláním GetOpenFileName nějak nastavit?
Standa
RE:Cesta k souborům
(Premek, 22. 12. 2007 12:48)
Ahoj
jde to, použij příkaz CHDIR (Change Dir - změn adresář)
Např. když potřebuješ zobrazit dialog pro výběr souboru už rovnou např. v C:\Temp tak napíšeš toto
ChDir "C:\Temp\"
MsgBox Application.GetOpenFilename("Excel (*.xls),")
pokud cesta neexistuje, vrátí chybu 76 - nelze nalézt cestu.
Pokud bys potřeboval "vyskočit" o úroveň výše, můžeš použít tento zápis
ChDir ".."
Ale pozor, má to i své úskalí, příkaz ChDir mění pouze adresář,neumí měnit disky. Funguje to následujícím způsobem, pokud je zrovna aktuální disk "C" můžeš se po něm pohybovat do sytosti, ale pokud bys potom chtěl kódem přejít na disk "D" např. ChDir "D:\Temp" tak se očekávaného výsledku nedočkáš, budeš stále v posledním adresáři na disku "C". Musel bys přejít ručně na disk "D" kód pustit znovu a potom by to fungovalo, stejně to je i zpět na disk "C". Ale neboj se existuje ještě jeden příkaz a ten umí měnit disk :-)
Ten příkaz se jmenuje "ChDrive" a funguje velice jednoduše, viz. kód
' nastavi jako vychozi disk C
ChDrive "C:\"
' prejde do zadane cesty a zobrazi okno pro vyber souboru
ChDir "C:\Temp"
MsgBox Application.GetOpenFilename("Excel (*.xls),")
' nastavi jako vychozi disk D
ChDrive "D:\"
' prejde do zadane cesty a zobrazi okno pro vyber souboru
ChDir "D:\Hudba\"
MsgBox Application.GetOpenFilename("Excel (*.xls),")
Přemek
Cesta k souborům
(Jirka, 22. 12. 2007 9:24)
Ahoj tuto metodu používám a mám jednu otázku. Jde nějak nastavit, aby se uživateli otevřel adresář pro výběr souborů v kterém mám uložen soubor, z kterého je volána tato metoda? Standardně se mi nabízí adresář, který je nastaven v "Výchozí umístění souborů".
Jirka
GetOpenFileName - Initial FileName ?
(Premek, 19. 9. 2008 20:05)