
Excel: zamknutý list a kopírovací makro
Mám *xlsm (Excel 2007), se blbuvzdorným zabezpečením (dovolena editace jen některých polí) ve formě zamknutého listu. Potřebuji předem vyfiltrovaná data přenést na jiný list, Excel ale protestuje:
Je jedinou možností, jak to obejít, přidat do makra (po kopírování a před ním)
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFiltering:=True
ActiveSheet.Unprotect
tedy list odemknout, data překopírovat a pak zamknout? Zamknutí listu je bez hesla.
Tedy takto:
Funguje to.
Pak ale nechápu to omezení, na zdrojovém listu nedochází k žádným změnám. Notabene, když ruční kopírování funguje…
Tiez by som povedal, ze ked zo zdroja len beriem, preco by som musel odomykat... Skusil by som si nasimulovat, ci to nie je vec zapnuteho filtra (t.j. skusit skopcit zo zamknuteho ale bez filtracie)
Okrem toho si treba uvedomit, ze ak skopirujes do schranky filtrovanu zostavu, kopiruje sa ti automaticky len viditelny obsah, takze nie je treba specialny vyber viditelnych buniek (ale to si asi riesil skryte stlpce, vsak?)
V kode mas este aj tak strasne vela zbytocneho balastu...
Ten balast tam mám z pohodlnosti. Aby byl focus pěkně nahoře, když na ten některý list překliknu.
Filtrování je trochu složitější: vybírám řádky, ale nechci kopírovat všechny sloupce. Zdrojový list je de facto databáze, cílový tisková sestava určitého období (období je filtr), kde nechci různé pomocné výpočty atd. Kopírovat všechno a pak vymazávat, to by nemělo smysl.
O to mi ale nešlo, makro s odemčením a zamknutím funguje
Nechápu jen tu restrikci.
No, ak si nemyslíš, že nasledujúci kód je kapánek jednoduchší (vďaka tomu, že nič nevyberám špeciálne, neprilepujem hodnoty a formáty... atď atď, akurát v cieli potom vyrazím stĺpce, čo nepotrebujem), tak neviem...
P.S. dokonca týmto postupom som nemusel ani dočasne odomykať a zamykať zdroj...
Celý, celučičký Tvoj kód je nahradený týmito riadkami:
Samozrejme si musíš dosadiť svoje názvy hárkov zdroja a cieľa, rozsah stĺpcov kopírovanej oblasti (v príklade A až K) a nastaviť stĺpce, ktoré vyhadzuješ (v príklade stĺpce B až D plus stĺpce F a I)...
Posledný riadok zdroja sa odvádza zo stĺpca A (ak nevyhovuje, existuje x spôsobov ako poňať celé aktuálne pole...)
Žiadne Select-y, všetko sa udeje bez nich, akurát keď sa po vykonaní chceš ocitnúť v hárku 2, tak na záver si dáš Sheets("Hárok2").Select
P.S. a bolo by pomohlo hľadať dôvod odmietania poslušnosti makra, keby si bol dal aj ukážku, na ktorom riadku kódu si obdržal onú hlášku. Tých možností je v Tvojom kóde totiž viac.
Ale použitím môjho kódu je hľadanie už bezpredmetné
Ešte ma napadá, že by sa mohlo stať, že uplatnením filtra v inom stĺpci než A, sa v stĺpci A môžu vyskytnúť prázdne bunky, čo by spôsobilo výber poľa len po riadok prvej prázdnej bunky stĺpca A. Preto by bolo vhodné posledný riadok odvodzovať od toho stĺpca, v ktorom filtruješ (a nefiltruje sa na prázdny obsah). Z toho vyplýva, že v mojom príklade vymeníš ("A1").End(xlDown) napr na ("E1").End(xlDown), pokiaľ filtruješ v stĺpci E. Ide len o to, že v stĺpci, z ktorého je odvodzovaný počet riadkov, sa nesmie vyskytnúť prázdna bunka.
Ale ako píšem vyššie, dá sa to i označením poľa Aktuálna oblasť alebo z poslednej bunky (celého poľa) a pod... Ak by bol problém, daj vedieť.
Díky moc, musím se na to v klidu podívat, teď už se mi kouří z hlavy :)
Neprogramátor to má prostě těžké, jde cestou nejmenšího odporu..
Nekopiroval by som len vybrane stlpce ale vsetky a v cieli by som makrom vymazal nepotrebne. Tym sa neuveritelne zjednodusi kod, nepotrebujes prilepovat specialne, lebo aj obsahy aj formaty si bunky nesu so sebou, a cele kopirovanie sa zredukuje na:
Zdroj.Copy(Ciel)