Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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:

[24177-ex2007-png]

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.

Předmět Autor Datum
Tedy takto: Sub filtr_vstup() ' ' kopie_vybranych_radku ' ' ActiveSheet.Unprotect Range("A4:A5001,E…
L-Core 10.11.2015 16:21
L-Core
Tiez by som povedal, ze ked zo zdroja len beriem, preco by som musel odomykat... Skusil by som si na… nový
robert13 10.11.2015 16:56
robert13
Ten balast tam mám z pohodlnosti. Aby byl focus pěkně nahoře, když na ten některý list překliknu. Fi… nový
L-Core 10.11.2015 21:19
L-Core
No, ak si nemyslíš, že nasledujúci kód je kapánek jednoduchší (vďaka tomu, že nič nevyberám špeciáln… nový
robert13 11.11.2015 16:48
robert13
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… nový
L-Core 11.11.2015 19:21
L-Core
:puff::beer:;-) poslední
robert13 11.11.2015 19:22
robert13
Nekopiroval by som len vybrane stlpce ale vsetky a v cieli by som makrom vymazal nepotrebne. Tym sa… nový
robert13 10.11.2015 17:13
robert13

Tedy takto:

Sub filtr_vstup()
'
' kopie_vybranych_radku
'

'
    ActiveSheet.Unprotect
    Range("A4:A5001,E4:M5001,R4:U5001,W4:Z5001").Select
    Selection.SpecialCells(xlCellTypeVisible).Select
    Selection.Copy
    Sheets("filtr-vstup").Select
    Range("A14").Select
    Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
        xlNone, SkipBlanks:=False, Transpose:=False
    Range("A2").Select
    Sheets("vstup").Select
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
        , AllowFiltering:=True
    Range("A2").Select
End Sub

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:

Sub Makro1()
    Sheets("Hárok1").Range("A1:K" & Sheets("Hárok1").Range("A1").End(xlDown).Row).Copy (Sheets("Hárok2").Range("A1"))
    Sheets("Hárok2").Range("B:D,F:F,I:I").Delete Shift:=xlToLeft
End Sub

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ť.

Zpět do poradny Odpovědět na původní otázku Nahoru