Přestože má formát souboru DBF své již odslouženo, řada uživatelů byla nepříjemně zaskočena nepodporováním tohoto typu v rámci exportních funkcí Excelu 2007. V tomto článku si ukážeme, jak vygenerovat tabulku formátu dBase III.
Ačkoliv mě daný problém až tak netrápil, dlouho jsem hledal nějakou aplikaci zdarma, pracující i stylem příkazové řádky, která by zvládala konverzi zdrojových dat do DBF. Našel jsem pouze jedinou použitelnou - TXT2DBF. Ta umí převádět textový soubor do dBase III. Co to znamenalo pro další postup?
Obecně:
1) Vygenerovat textový soubor s pomocí VBA.
2) Převést s pomocí utilitky TXT2DBF textový soubor do formátu DBF.
Pro hlavičku dodržujte základní pravidla:
- bez diakritiky
- velká písmena
- namísto mezer podtržítko
- názvy do deseti znaků
O kódování se bohužel nikde nemluví. Podle mých zkušeností, ačkoliv Excel 2003 používá při exportu CP1250 (Windows 1250), nedokáže už své výtvory znovu korektně načíst! Očekává totiž kódování CP852 (Latin II, lidově dosovskou češtinu). Co tedy dělat, jestliže námi pracně vygenerované soubory budeme chtít otevírat někdy v Excelu?
Utilitka TXT2DBF sice umožňuje vložit na offset 32 typ kódování použitého zdroje, nicméně VBA v podstatě nic jiného než CP1250 běžně neumí. Potřebujeme tedy ještě konvertor češtiny pro vygenerovaný textový soubor. Naštěstí i u autora TXT2DBF najdeme konverzní nástroj pro příkazovou řádku - OKKONV. Ta by kromě jiného měla zvládnout převést kódování i přímo v DBF souborech.
Nastudovali jste si utilitku TXT2DBF z odkazu? Jen upřesňuji:
A) Přepínače kódování (při hledání jsem se docela zapotil):
/C0164 ... Codepage 852 Eastern European MS-DOS
/C0168 ... Codepage 895 Kamenicky (Czech) MS-DOS
/C01C8 ... Codepage 1250 Eastern European Windows
B) Délka 5.2 pro pole číselného typu značí celkovou délku 5 znaků (4 číslice + desetinná tečka), z toho 2 číslice za desetinnou tečkou (například 12.34).
C) Neosvědčilo se mi používat parametr /T.
D) U pravdivostních hodnot zlobí Y a N (A, N je špatně). Doporučuji používat jen T (True) a F (False).
Pojďme se nyní už podívat na příklad tabulky a kód VBA, který okomentuji posléze. Před jeho spuštěním vyberte oblast tabulky.
Pro kontrolu si necháme textovou podobu tabulky zobrazit v okně Immediate editoru VBA (Ctrl+G).
Při generování textové formy tabulky v dřívějším článku jsem si nedělal vrásky s technikou zjišťování maximální délky obsahu buňky ve sloupci. Zde už jsem se nad tím zamyslel. Jde o to, že na listu bychom použili maticový vzorec. Jak na něj ve VBA? Obecně by ho měla zvládat metoda Evaluate, nicméně jsou s ní problémy. Proto jsem použil malý trik, kdy jsem si nechal výsledek spočítat přes dočasný, pojmenovaný vzorec na listu. Podobně jsem složitějším maticovým vzorcem chtěl obdržet maximální počet číslic za desetinnou čárkou. Zde už začal ale použitý postup také selhávat. Nakonec jsem dospěl k takovému maticovému vzorci, který byl správně dopočítán i pod VBA. Aby toho nebylo málo, bez procházení buněk pravděpodobně není možné se dopracovat počtu viditelných desetinných míst (u naformátovaných čísel). Proti tomu už byly ostatní věci hračkou (zarovnání čísel a nahrazení desetinné čárky tečkou, převody datumů na americký formát, převody pravdivostních hodnot atd.)
A jak vypadá vygenerovaný soubor data852.dbf? K jeho prohlížení se nabízí několik bezplatných nástrojů (počítejte s určitou mírou chybovosti u každého z nich):