< návrat zpět

MS Excel


Téma: Skrývanie riadkov rss

Zaslal/a 18.9.2013 14:31

Zdravím,
potreboval by som nejakym sposobom, najlepsie cez tlacitko (asi, alebo aj inak) skryt niektore riadky, v ktorých je urcite slovo
napr. kliknutim na tlacitku sa skryju vsetky riadky, v ktorych je napisane slovo "auto" (v niektorej bunke riadku)
avsak potrebujem aby to fungovalo aj spatne, aby som si ich mohol aj odkryt a pozriet...
predstavujem si to tak ze by som mal dve tlacitka, jedno na skrytie nepotrebnych riadkov, druhe na ich odkrytie, pripadne aj jedno tlacitko ktore by fungovalo raz na skrytie a raz na odkrytie...

stop Uzamčeno - nelze přidávat nové příspěvky.

Strana:  1 2 3   další »
icon #015273
Poki
Prilozte soubor!!!

jak se ma ten, kdo vam bude chtit pomoci, jinak dozvedet, jak ma reseni vypadat, nebo dokonce, jake dalsi skryte problemy, ktere jste nezminil (a ze jich byva hodne), mohou vzniknout...???

Protoze jinak vam odpovim takto:
1) Pouzijte metodu .Find
2) kde naleznete, pouzijte rows(i).Hidden = True
citovat
#015275
avatar
tak tu to je...
co potrebujem je popisane v bunke N5
Příloha: zip15275_zosit1.zip (25kB, staženo 35x)
citovat
icon #015278
Poki
co takto?
Příloha: zip15278_zosit1.zip (37kB, staženo 37x)
citovat
#015299
avatar
funguje to super, skusal som si to urobiť sam (zatiaľ som s makrami nepracoval), hodil by sa mi nejaky strucny navod ak by sa dalo...
a inac ako cez to makro sa to asi neda nie?citovat
icon #015300
eLCHa
Kód od Pokiho samozřejmě funguje, ale nemůžu si odpustit malý komentář

Vždy mě totiž překvapí, když u pokročilejších uživatelů vidím zbytečné využití OnError nebo GoTo. I Find je tady zbytečné, protože kontrolovaná hodnota je v konkrétním sloupci (i tak bych volil CountIf místo Find)
Mno a taky je žádoucí minimalizovat přístupy na list - tady v tomto případě není poznat rozdíl, ale při 1000 řádků už ano - pak byste se museli zbytečně uchylovat k ScreenUpdating=False.
Toto se řeší proměnnou typu Range a na list tak přisoupím pouze jedinkrát
A nejsem fanouškem ani Exit Sub

Řádek 2 používáte asi jako detekci - tady bych asi použil Caption ovládacího prvku a toto pak není potřeba. Ale pokud použijete řádek 2 jako detekční, mělo by to vypadat nějak takhle
Sub Skryt()
If Rows(2).Hidden Then
Rows.Hidden = False
Worksheets("Hárok1").cmbSKRYT.Caption = "skryť"
Else
Dim rRowsToHide As Range
Set rRowsToHide = Rows(2)

Dim rRow As Range
For Each rRow In ActiveSheet.UsedRange.Rows
If Intersect(rRow, Range("G:G")).Value = "SKRYŤ!!!" Then
Set rRowsToHide = Union(rRowsToHide, rRow)
End If
Next rRow
Set rRow = Nothing

rRowsToHide.EntireRow.Hidden = True
Set rRowsToHide = Nothing

Worksheets("Hárok1").cmbSKRYT.Caption = "zobraziť"
End If
End Sub


Není to kritika - jen komentář.citovat
icon #015302
Poki
Dovolim si taky jeden komentar k prispevku eLCHa.
Treba se pri vzajemne vymene nazoru oba neco priucime (nebo aspon ja 2)

1) hodnota "SKRYŤ!!!" neni pouze ve sloupci G (ale i v tomto kratkem prikladu take ve sloupci I - a kdo vi, kde vsude muze byt...), takze vlozeny kod nebude fungovat spravne a je nutne pouzit nejake vyhledani vyskytu na kokretnim radku (jestli countif nebo .find - to je spis otazka osobnich preferenci, rekl bych - ale jestli existuji nejake konkretni duvody, proc je lepsi COUNTIF, rad se poucim)

2) pouziti UsedRange - toto velmi nerad pouzivam, protoze to rozhodne nezarucuje, ze se bude pracovat jen opravdu pouzitou oblasti (pokud se hodnot tyce) - muze existovat nejake formatovani na konci listu a zbytecne budete prochazet vsechny radky listu (UsedRange), coz bude ve finale neuveritelne pomale...

3) pouziti For Each v tomto pripade pracuje s objektovou promennou typu Range a tedy do pameti ukladani spoustu vlastnosti pri kazdem novem cyklu (teoreticky by to melo byt pomalejsi, ikdyz v tomto pripade se to samozrejme neprojevi...)
Rozhodne souhlasim s tim, ze eLCHuv kod je napsany lepe pro nekoho, kdo je hodne zbehly.
Nicmene jako odpoved na dotaz bych radeji volil kod, ktery bude pro tazatele jednodussi a snadno pochopitelnejsi - protoze nejde jen o to, aby to spravne fungovalo, ale aby se tazatel taky neco naucil - obecne je pro me osobne prehlednejsi kod lepsi nez ten nejkratsi nebo nejvyladenejsi (uz i kvuli udrzbe, kterou muze za par let/mesicu delat nekdo jiny, nez autor kodu.

Ted par otazek na eLCHu:
1) Má vase preference COUNTIF mist .Find nejaky realny zaklad nebo jde spis jen o to, co se vam zda lepsi?
2) Ma vase mirna averze k pouziti Exit Sub nejaky realny zaklad nebo to jen proste nemate rad?
3) Vidite v pouziti On Error... nejake uskali, nebo proc ho povazujete za zbytecne (ted se nebavim o tomto konrektnim pripade, ale obecne)

Diky za pripadne pouceni me osoby, ci vyvraceni mych domnenek...citovat
icon #015303
eLCHa
1
Moje chyba - nesroloval jsem dolů a přehlédl jsem
V tom případě platí CountIf

Proč CountIf a ne Find?
Nemám podloženo co je rychlejší, ale zastávám názor, že po opuštění kódu by měl být Excel ve stejném stavu jako při spuštění
Proto Nikdy nepoužiju např
ScreenUpdating=False
ScreenUpdating=True

ale
bScreen=ScreenUpdating
ScreenUpdating=False
...
ScreenUpdating=bScreen

Toto oceníte při velkých projektech, když už pak nevíte, která procedura vlastně tu vlastnost přepla nebo vám ji jiná zapne, když má být ještě vypnutá. Takže jsem se to naučil dělat vždy a problém mi odpadl.
Mno a Find při použití
r = Rows(i).Find(what:="SKRYŤ!!!", lookat:=xlWhole, LookIn:=xlValues).Row
nechá zaškrtnutou volbu Pouze celé buňky v dialogu Ctrl+H a při použití této zkratky pak nemusíte ani vědět, že tomu tak je a divíte se - jááák tóó!! (já se takhle divím ;)) )
CountIf nic nemění a jako kontrola stačí
If CountIf>0 then

2
Souhlasím - UsedRange může být zrádné, nicméně to i
Cells(Rows.Count, 2).End(xlUp)
protože ve 2. sloupci nemusí být hodnota a ve 3. ano
Případ od případu

3
Pokud použijete For I = místo mého For Each rRow
tak musíte použít např Cells(I) a když to řeknu laicky,(nejsem programátor, ale amatér a samouk), kompilátor musí vždy hledat, co za buňku to je a zjistit si její vlastnosti (dá se ale obejít pomocí With)
kdežto rRow už je načtená
S pamětí máte pravdu, rychlost posoudit neumím, ani jedno už dnes asi řešit nemusíme ;) - takže beru to, co je mi přijde praktičtější

Souhlasím, že kód nemá být co nejkratší, ale co nejpřehlednější a nejjednodušší - ostatně můj je delší než ten váš, ale použití GoTo ten váš hodně znepřehledňuje.
Pokud se někdo zrovna učí - nejhorší jsou špatné návyky. Proto by se měl hned naučit použití With, ForEach, Select apod.

A teď pár odpovědí
1 - viz výše
2 - naprosto nemá, prostě mi to přijde méně přehledné, než If - End IF
3 - Naopak - OnError je báječná věc - a proto láká ke zneužití. Legrace je, že se jí dá někdy krásně vyhnout, jenže se musí přemýšlet
Včera jsem např řešil název s neplatným odkazem (=#REF!)
Tady to přímo láká, že?
A přitom stačí InStr a místo tří řádků máte jeden.

Bože - tolik písmen ;)))
Tolik ke komentáři komentáře ;))citovat
#015304
avatar
statik89 musi mat radost ked to cita :))citovat
icon #015305
eLCHa
Ještě oprava výše uvedeného kódu
Sub Skryt()
If Rows(2).Hidden Then
Rows.Hidden = False
Worksheets("Hárok1").cmbSKRYT.Caption = "skryť"
Else
Dim rRowsToHide As Range
Set rRowsToHide = Rows(2)

Dim rRow As Range
For Each rRow In ActiveSheet.UsedRange.Rows
If Application.WorksheetFunction.CountIf(rRow, "SKRYŤ!!!") > 0 Then
Set rRowsToHide = Union(rRowsToHide, rRow)
End If
Next rRow
Set rRow = Nothing

rRowsToHide.EntireRow.Hidden = True
Set rRowsToHide = Nothing

Worksheets("Hárok1").cmbSKRYT.Caption = "zobraziť"
End If
End Sub
citovat
icon #015310
avatar
@Paloo: statik89 musi mat radost ked to cita :))
Asi chápem, ako to myslíš. Na druhej strane, výpočet argumentov, ktoré tu padli je napr. pre mňa určite prínosom, takže: statik si odnesie, čo potrebuje (funkčný kód) a ostatní (vrátane statika), pokiaľ majú chuť, tak majú príležitosť sa niečomu priučiť, prípadne konfrontovať s postupmi, ktoré sami pri písaní kódu používajú 1. Za mňa veľká vďaka 1citovat

Strana:  1 2 3   další »

Uživatelské menu

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

Menu

Formulář Faktura

Formulář Faktura IV

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

Helios iNuvio

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.

On-line nástroje