Vsadil bych na nějaký zádrhel v systému nebo v Excelu. Restartuji jednou za měsíc (nebo déle)používám jiné soubory, jiné železo a pod. a občas se mi to taky stane. Pomůže jen restart PC - nestačí zavřít Excel nebo odhlásit se od PC. Ani Widle nejsou dokonalé.
Pokud se hlásíš do domény, pak by ti mohlo pomoci makro v příloze. Zjistí kdo otevírá sešit. Dalším krokem by pak bylo zobrazení jen listů pro daného uživatele. R.
Určitě se mýlíš. Obvykle stačí nějaký jiný pohled/ nápad a řešení se najde. Zatím to dodělám ve třech listech a udělám v tom tmp skrytý list do kterého nakopíruji pod sebe data a ze kterého budu cucat pivot tabulky. Je to lepší než nic a za cenu cca dvojnásobné velikosti souboru. Necháme železo nažrat :)
@daal
Pro načtení dat používám ...
Worksheets(cDBSheet).QueryTables.Add(Connection:=cConnectionDB, Destination:=.Range("A1")).CommandText = strSql ... @AL:
První odkaz je stejný postup který jsem zvolil. Je to obšlehnuté podle nápovědy ve VBA. Jeho stažený příklad mi funguje i doma na Off2007 :). Ten druhý odkaz http://www.contextures.com/xlPivot08.html je postup v nápovědě Excelu a našel jsem ho i na tomto webu. Pro mě je nevhodný/nepoužitelný a nebo jej neumím správně napsat/použít. Pokud se všechny data stupidně "sečtou" a nerespektují se textové položky, které se sčítat nedají a vypadne z toho počet, pak je to pro mě nepoužitelné.
Oba postupy myslím znám a zkoušel jsem je.
Jdu se podívat na to proč jeho demo funguje a moje né. Asi bude problém mezi židlí a klávesnicí.
Dík za odpovědi.
Data natahuji z MySQL do listu a nad listem je pověšená pivot tabulka. Vazba je na list a né na data v MySQL. Soubor, který se nakonec vytvoří je platný stav k aktuálnímu datu. Soubory jsou od roku 2009 po adresářích se jmeném adr. které představuje datum. V případě potřeby je možné vstoupit do určitého dne (adresáře) a otevřít tabulky/informace, které se k tomuto dni vztahovaly.
Další důvod je, že někdo vyžaduje pivot tabulky pro celkový pohled a jiný zase rád jen filtruje sloupce a kopíruje výseče, které potřebuje.
Z toho důvodů nepoužívám pro pivot tabulku MySQL jako zdroj, ale nazval bych to spíš statický přístup. Data se natáhnou do listu a nad něj se zavěsí pivot tabulky.
Zkusím obrátit, protože ta diskuze se dostala úplně jinde, než jsem očekával. Napadá Vás, jak namapovat tři listy se stejnou strukturou jako zdroj pro pivot tabulku ? Toto řešení mě trápí již několik let :( R.
Vlastně jsem to napsal. Nejdříve natáhnu data do listu a pak je použiji jako zdroj dat pro pivot tabulku. Pak v tom pracuji a nakonec spustím makro, které vytvoří nový soubor do kterého uloží zdrojové listy, pivot tabulky a uloží pod aktuálním datumem na disk do adresáře. Adresář je zpřístupněn v Apache .htaccess a přes http si uživatelé stáhnou co potřebují. Pokud bych ve zdroji nechal odkaz do MySQL, pak bych jej musel zpřístupnit ostatním apod, a to se mi nechce. Řešením by mohlo být vygenerovat cache pod apachem a zpřístupnit je přes php stránku. Pivot tabulka by nacucala již vygenerované sestavené data a nechodila by do MySQL. Ty data jsou stejná do doby než se znovu sestaví.
Excel má nyní 1048576 řádků což je 1MB nebo 2x 20b nebo 2x1048576 nebo dvě na dvacátou atd. To mi ujelo z assembleru.
Vygooglil jsem řešení IMEX=1 a po vložení je to funkční až na problémy se sdílením - už jsem nepátral, co to přesně znamená. Pokud máš seznam všech možných argumentů prosím o inf.
V práci jsem to zkoušel na Excelu 2010 a jede to bez problémů se sdílením - žádná chyba. Doma jsem to bastlil na Excelu 2007. Dočetl jsem se i o balíčku opravy pro Excel 2007 s tím, že to neřeší všechny problémy. Zkoušel jsem jej nainstalovat a skončilo to chybou. Mám špatný pocit, že ta havarie Excelu při pokusech jej nějak poškodila. Projevilo se to i ve VBA, ke začala blbnout nápovědě - že ji nelze otevřít :(
"Připojil jsem to i na kontingenční tabulku a načetl data "sám ze sebe". Bylo to bez problému ... jen se zaměnil zdroj dat." Použil jsem v připojovacím řetězci ActiveWorkbook.FullName a tudíž provider "Microsoft.ACE.OLEDB" se připojil k sešitu z kterého vyšel požadavek. (sám na sebe). Ještě jsem laboroval se způsoby připojení, pro čtení apod, uložením souboru před spuštěním, ale na 2007 to padalo.
... a k aplikaci
Používám MySQL + vložené procedury k načítání dat z okolí (extrakty ze SAPu, Připojení k Oraclu apod.) a baťáky spouštěné plánovačem úloh. Celkem 5 datových zdrojů. Po načtení se zpracují souhrné tabulky a po příchodu do práce je načítám do Excelu. Nejdříve data do jednoho listu a z dat vyrobím pivot tabulky atd. V tomto problematickém reportu mám list, na které mám tři dimenze (kapacity, plány výroby a zakázky), které bych rád rozdělil do tří listů nad kterýma se bude lépe pracovat. V minulosti jsem toto řešil s Excelem 2003 a nepodařilo se mi namapovat spojení tří identických zdrojových struktůr jako jeden zdroj pro pivot tabulku.
Pokud Vás napadne jak to vyřešit jinak, prosím o Vaše nápady.
Ahoj ALe.
Díky za nápady. Stále jsem hledal něco v kompatibilitě a pod. Nakonec je chyba v připojování přes ADO. Stačí do řetězce nakonec dát "IMEX=1". Tím se může načítat 2x20b. Připojil jsem to i na kontingenční tabulku a načetl data "sám ze sebe". Bylo to bez problému ... jen se zaměnil zdroj dat. A tím jsem skončil. Soubor se nedaří uložit. Hlásí chybu ve sdílení. Pokud zapnu sdílení, tak mi nadává, že v sešitě je hodně modulů s makrama. Nyní potřebuji vědět, jak to obejít, aby Excel celý nepadal pokaždé, když vytvořím kontingenční tabulku.
Jinak díky za nápady.
Roman
Ahoj.
Zkoušel jsem externí zdroj pro KT a laboroval jsem s "Microsoft.ACE.OLEDB". Níže uvedený kod v Off 2007 nefunguje. Nakonec jsem problém našel v počtu řádku. Pokud místo 1048576 napíšu jen 65536, pak je kod funkční. Nevíte jak přinutit Off aby respektoval celých 1048576 řádků z tabulky ? Tabulku jsem zkoušel ve formátu .xlsm a .xlsb. R.
Office 2007 + Win 7/32 bit
Sub Test_v2()
Dim c As ADODB.Connection
Dim Rs As Recordset
Dim Book As String
Set c = New ADODB.Connection
c.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ActiveWorkbook.FullName & _
";Extended Properties=""Excel 12.0;HDR=Yes;"";"
Set Rs = New ADODB.Recordset
Rs.ActiveConnection = c
Rs.Open "SELECT * from [Capacity$B5:AS1048576] " & _
" UNION SELECT * from [Flats orders$B5:AS1048576]"
Debug.Print Rs.Fields.Item(2)
Rs.Close
Set Rs = Nothing
End Sub
- máš chybu v makrech (zápis)
- špatně napsané makro, které neošetřuje vstup od usera a pak může dojít k tomu, že user nahraje něco špatného a Tvé zaheslované makro se zhroutí.
- špatně ošetřuješ chyby ... normálně se to nesmí nikdy zobrazit ... jinak se neuživíš.
Záleží na tom jak často to budete dělat. Pokud je to pravidelně se opakující činnost, pak nejlépe makrem. Dají se vychytat nepřesnosti. Pokud je to příležitostně, tak není důvod chodit na komára s kulovnicí. Stačí do prvního sloupce pomocí vzorce vložit 1 nebo 0 ... tj sudý nebo lichý řádek. Do druhého sloupce podmínku =KDYŽ(A1=0;"-";C1&C2). Do třetího sloupce nakopírovat hodnoty z CVS souboru. Předtím zkontrolovat dialog "Text do sloupců" zda v něm není nastaven oddělovač středník. Potom označit oblast A a B a vzorce vyplnit dolů CTRL+D. Pak musíme převést vzorce na hodnoty Ctrl+C ... Vložit jinak ... jako hodnoty. Potom označím všechny řádky Shift+Mezerník a setřídím podle sloupce B. Najdu a označím řádky s pomlčkou a vymažu je posunutím nahoru. Pak můžu odmazat sloupoce A,B ... nejsou potřeba. Nakonec označím sloupec s textovýma hodnotama a přes dialog "Text do sloupců" rozdělím hodnoty do buněk. Dá se to udělat na 60000 řádcích do cca 3 minut. R.
VBA je interpretovaný jazyk Visual Basic for Application. V Excelu si můžeš nahrát nebo napsat svůj vlastní program, který je pak možné spouštět. Je pravda, že je trochu jiný než jsem kdysi poznal na Commodore 64 a tak na starý Basic zapomeň.
V Excelu (různých verzích) můžeš spustit podprogram ALT+F11 Dostaneš se do nového programu Microsoft Visual Basic. Vlevo si najdi soubor a podívej se, zda má modul. Pokud né, pak najdi nahoře v menu Insert->Module. Ve velkém středním okně se Ti vytvoří prázné okno do kterého můžeš zapisovat své programy. Nebo případně se dívat, jak ti MacroRecorder nahrál tvůj postup. Do to bloku zkopíruj uvedenou proceduru. umísti kurzor do procedury a stiskni F5. Pak se přepni zpátky do Excelu a zkus, zda se to resetovalo nebo je to stejné.
Pokud je to noťas, pak zkus připojit externí klávesnici a zkusit jestli je to stejné. Pokud to bude funkční tak vyzkoušej co to ovlivňuje na noťasu. nějak a kombinace Fn+F(?). R.
Pokud Ti všechno ostatní funguje a nefunguje jen Ctrl+ tak se podívej, zda nemáš nějakému svému makru přiřazenou tuto zkratkovou kombinaci. Taky můžeš zkusit ve VBA napsat Sub blabla()
Application.OnKey "^{+}", ""
End Sub
... mohlo by to pomoci.
Nemáš noťas ? nemůžeš zkusit jinou klávesnici ?
Chyba, velká chyba ... tak rychle začni a uvidíš co budeš milovat na Excelu. Něco si vytvoř a pak zkus dvakrát poklepat na buňku v oblasti dat. Měla by se Ti vytvořit automaticky nová tabulka s daty, která odpovídá zvolené hodnotě. Věnuj tomu čas ... stojí to zato ... v práci budeš EXCEL GURU !!!
Nevím jak to myslíš, ale spíš funguje až moc. Tvoje makro skončí a nenaběhne aktualizování obrazovky a ty asi sejmeš Excel a spustíš jej znovu ??? Pokud mám pravdu pak se podívej kolikrát jsi zapnul obnovení obrazovky !!! Pokaždé, když dáš Exit Sub pak před to musíš dát displAlerts, screnUpd atd. Nejjednodužší je dát návěští před konec a všechny exit sub nahradit přískokem vpřed. Pokud je Tvůj případ opačný, tj. že Ti nenaběhne vypnutí překreslování GUI pak promiň. Je toto zbytečná připomínka. R.
Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.
Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.