< návrat zpět

MS Excel


Téma: Zamčení buňky při zavření souboru rss

Zaslal/a 21.3.2013 13:12

Ahoj,
prosím o pomoc zdatnější :-)
Mám v excelu několik sloupců, do kterých se každý měsíc vyplní do jedné buňky hodnota. Po uložení a zavření souboru bych potřebovala, aby se vyplněná buňka uzamčela. Pomůžete mi? Díky

Zaslat odpověď >

Strana:  « předchozí  1 2 3 4   další »
icon #012490
eLCHa
@AL
Když jsem začínal s VBA (to byl asi ještě E2000), taxem taky zkoušel podobnou úlohu (tedy public proměnná na úrovni modulu), ale pamatuji se, že mi tenkrát excel vyhazoval chybovou hlášku nebo nepracoval spolehlivě. Po zkoumání jsem zjistil, že "zapomíná" hodnotu proměnné (vaše MyLockedRange). Teď myslím, pokud se jedná odlohodobější otevření sešitu - v řádu hodin. Od té doby mu jaxi nevěřím a používám buď pojmenovaných oblastí (což má nevýhodu přepočtu) nebo jiných postupů. Používáte toto řešení a jaké máte zkušenosti?

A technická - On Error Resume Next - v tomto případě zbytečné až nebezpečné - Range má vždycky rodiče na úrovni listu a pokud bude špatně zadané heslo, tak to uživatele neupozorní a nebude vědět, kde je chyba. Jestli smím: Vždy používejte On Error Resume Next s kombinací On Error GoTo X (nejlépe 0) a ošetřujte jen ten kousek kódu, kde to chcete použít (klidně několikrát v jedom kódu, ale vždy znovu zapněte).citovat
icon #012496
avatar
@eLCHa
k jednotlivým poznámkam:
Používáte toto řešení a jaké máte zkušenosti?
Pravdou je, že použitie mojej premennej na úrovni modulu som netestoval na odolnosť v čase, takže neviem, či by to v prípade, že súbor bude nejakú dobu otvorený, naozaj nezačalo páchať šarapatu, ale nemám dôvod Vám neveriť, keď to zmieňujete. Použitie pomenovaných oblastí je spôsob, ktorý by to mohol vyriešiť, ďakujem. Inak, ale, ja som zas toľko kódov, aby som mohol hovoriť o nejakých skúsenostiach, nenapísal, čiže nemám nejakú zaručenú kuchárku, riešim väčšinou nejaké ad-hoc veci a pokiaľ sa mi nejaký postup osvedčí, tak ho používam.

On Error Resume Next - v tomto případě zbytečné až nebezpečné - Range má vždycky rodiče na úrovni listu
Ošetrenie chyby som použil pre prípad, kedy bude súbor otvorený, ale na dotknutý list (so zamykanými bunkami) sa pred uložením nebude zapisovať. V tom prípade by totiž objekt MyLockedRange zostal nothing a makro hodí chybu, v tomto prípade totiž ten objekt rodiča nemá.

Jestli smím no isteže smiete, ja som naopak skutočne rád, pokiaľ mi radí niekto, kto veci rozumie a som Vám vďačný.

Aby som pravdu povedal, tak presne neviem, čo znamená inštrukcia On Error GoTo 0, kam presne kód odskočí v prípade chyby, pokiaľ nikde label 0 v kóde nepoužijem?

P.S. - úloha od slečny z Egypta sa stáva pomaly mojou nočnou morou, slečna sa makro rozhodla použiť na cca 350 úloh v rámci jednoho projektu a vyzerá to špatne. Mne, než som to svoje makro prerušil, vyhodilo už 216472 záznamov (niektoré úlohy majú totiž i 40 vetvení, takže počet kombinácií narastá naozaj geometrickou radou), to je peklo. Budem to musieť napísať celé odznova nejako inak. Skúšal som Vaše a po prerušení to pre istotu nevypísalo nič (asi preto, že Vaše to vypíše do listu až po tom, čo si to celé vytvorí niekde v pamäti)citovat
icon #012502
eLCHa
@AL
Pokud víte, že hodnota může být Nothing (což jsem si neuvědomil a toto testování by mělo být použito prakticky vždy), tak nepoužívejte On Error.., ale
If Not XY Is Nothing Then
'kód
End If


On Error GoTo 0 nikam nepřeskakuje, ale zpětně zapíná odchyt chyb
http://msdn.microsoft.com/en-us/library/5hsw66as(v=vs.80).aspx

Prostě klasika. Když něco vypnu, tak to musím zase zapnout, abych se pak nedivil ;)

ad Egypt. Viděl bych to na řešení mimo excel. Ale pokud to má takové množství kombinací, tak stejně nechápu, jak to chce slečna dále zpracovávat ;)citovat
icon #012503
avatar
@eLCHa
opäť veľká vďaka za výborné tipy.

ad Egypt: slečna vo svojej práci na obhajobu PhD počíta kritickú cestu u projektu, mne bohužiaľ na začiatku nedocvaklo, že z pár úloh v projekte bude razom niekoľko sto a to makro na to nebolo vôbec stavané (o stovkách úloh na začiatku nepadlo slovo, moja smola, mal som to predvídať). Včera v noci som u toho už dosť zúril a uvažoval nad riešením v Access, ešte to zvážim. Tam ale budem musieť tiež vytvoriť nejaký dotaz, ktorý v cykle bude jednotlivé cesty reťaziť, manuálne je to prakticky neriešiteľné...

@Elly - na základe cennej poznámky od eLCHy, v kódovom okne ThisWorkbook teda:Option Explicit
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Application.ScreenUpdating = False
Dim SheetToProtect As Worksheet
If Not MyLockedRange Is Nothing Then
Set SheetToProtect = MyLockedRange.Parent
SheetToProtect.Unprotect ("HESLO")
MyLockedRange.Locked = True
SheetToProtect.Protect ("HESLO")
End If
Application.ScreenUpdating = True
End Sub
Pokiaľ by tá globálna premenná nefungovala korektne, tak to nahradíme pomenovanou oblasťou ako navrhol eLCHa, ale najprv sa pozrite, či to funguje takto a budeme riešiť až v prípade problémucitovat
#012527
avatar
To AL: Super, funguje. Moc děkuji za pomoc!citovat
#012528
avatar
Ještě jedna věc. Je možné kód použít pro více listů v jednom sešitu? Nefunguje mi to :-(citovat
icon #012529
avatar
Je-po istej úprave. Pre každý list si musíš vytvoriť samostatnú premennú podobnú mojej MyLockedRange.
Kód s príslušnou novou premennou použiť potom pre daný list (napísať ho do kódového okna daného listu).
V tom kóde BeforeSave uloženom v kódovom okne ThisWorkbook sa potom postupne odkazovať na jednotlivé listy a ich oblasti uložené v danej premennej. Trochu sa posnaž, toto by si už mala byť schopná si dorobiť, pomôžem, až keď napriek snahe, ktorú vynaložíš sama, budeš naozaj v koncoch 1citovat
#012530
avatar
Při kliknutí na buňky, aniž by došlo k zápisu hodnoty, dojde také k uzamčení buňky. Je možné nějak ošetřit, aby se uzamčely je ty buňky, které obsahují při ukládání nějakou hodnotu? Prázdná buňka není přípustná.citovat
icon #012531
avatar
Při kliknutí na buňky
Nie, pri kliku, ale pri dvojkliku, pri kliku sa bunka nezamkne. Môžem vedieť, prečo používaš doubleclick? Trochu začínaš vymýšľať 1

O.k. tak aby to fungovalo i na doubleclick, tak trebárs takto (v kódovom okne daného listu):Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If MyLockedRange Is Nothing Then
If Target <> "" Then Set MyLockedRange = Target
ElseIf Target <> "" Then Set MyLockedRange = Union(MyLockedRange, Target)
End If
End Sub
citovat
#012533
avatar
To AL: Chtěla jsem to vzdát, protože programování opravdu nerozumím, ale zázrakem se mi podařilo upravit kód pro více listů. Nefunguje mi to ale pro sloučené buňky 5 Nechci prudit, ale jde s tím něco udělat? 5citovat

Strana:  « předchozí  1 2 3 4   další »

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

On-line nástroje

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Aktivní diskuse

Sloučení dat dvou sešitů

marjankaj • 18.5. 21:31

Sloučení dat dvou sešitů

Anonym • 18.5. 21:25

Sloučení dat dvou sešitů

marjankaj • 18.5. 21:08

Sloučení dat dvou sešitů

Scraper • 18.5. 18:38

přiřazování hodnot funkcí když

elninoslov • 17.5. 23:50

přiřazování hodnot funkcí když

Borks • 17.5. 23:06

Otevřený sešit zpomaluje makro

Pavdi07 • 17.5. 15:25