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
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 ;))
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ář.
Nezlobte se, ale víte, kolik já bych chtěl věcí? Vím, že to není řešení, jaké byste si přál, nicméně je to řešení, které pro takovéto situace poskytl Microsoft.
Nicméně, pokud zde nedáte přílohu, do které se můžeme kouknout, tak vám stejně nikdo nepomůže. A i tak nevím jestli vám někdo pomůže, protože podle toho co tu píšete, tam máte hromady vzorců a pochybuju, že někdo bude studovat, co jste tam vytvořil a překopávat to.
Chci, aby to bylo vzdy zaply jen se neprovadeli ty slozity vypocty.
Touto větou jste mně docela pobavil ;)) - dejte pryč ty vzorce a nebudou se počítat ;)))
Toto se dá udělat, ale není to řešení, které bych volil - místo vzorců si napište kód, který vám do vybraných buněk (kde máte ty vzorce) vypočte hodnoty, až budete chtít.
Špatná formulace - omlouvám se
samozřejmě, že tu volbu vypnete pro všechny sešity
Můžete si ta nastavení vytáhnout jako já na panel nástrojů Rychlý přístup a tak je budete mít vždy při ruce a ve chvíli zadávaní prostě vypnete, skončíte a zapnete. Navíc vždy hned vidíte, jak to máte nastavené
Kontingenční tabulka
Jde to i bez té transformace, ale pod každou tabulku jsem dal hodnotu "konec" a tu zneviditelnil - ale musí tam být
Důležité je nemít vzorce tam, kde můžou být konstanty
Pokud máte takovýto list, vypněte v něm automatické výpočty a přepočítávejte po stisku F9 (musíte na to ale pamatovat)
Od koho jsem se ptal quli řešení, které jste si vybral
A navíc k tomu co napsal Opičák asi není co dodat a k ToggleButton mně taky nic nenapadá ;))
Vložte přílohu a definujte, co chcete aby to dělalo a ono ne a ne a ne ;)))
pripadne ak by ich nebol rovnaky pocet
-priklad A1-A4, B1-B8, C1-C3, D1-D6 a boli by pod sebou... ?
Aha!
Ano, tohle je jedno z těch ale ;)))
Mno asi takhle:
Jde to, ale jsou tam ale, která u řešení vedle sebe nejsou ;)))
A proto nejjednodušší řešení je to, že to transformujete vedle sebe ;)))
A od koho tu instruktáž chcete? ;))
VBA není potřeba
stačí pojmenovaná oblast (dynamická)
Přesně k tomuhle slouží
ToggleButton
s přímým propojením na buňku (LinkedCell) a událostí Click
Mno - při snídani.
Nemůžu vyzkoušet, nemám data a definici těch oblastí bych asi udělal jinak, ale v zásadě
Při psaní kódu VBA musíte v Excelu přemýšlet, jak byste to udělali v listu - tam byste použili (jak píše Poki) Ctrl+H (.Find) nebo POZVYHLEDAT(MATCH) nebo COUNTIF.
Tak proč to v kódu potom řešíte pomocí cyklů (není to tak dávno, co jsem to vytýkal i Palooo) a ne stejně.
Sub Export_do_databaze()
ActiveWorkbook.Save
Dim zdroj As String
zdroj = ActiveWorkbook.Name
Dim c_Nabidky As String
c_Nabidky = Worksheets("Nabídka").Cells(13, 18).Value ' Číslo nabídky
With Worksheets("Databáze nabídek")
If Application.WorksheetFunction.CountIf(Range(.Cells(2, 2), .Cells(Columns(1).Rows.Count, 2).End(xlUp)), c_Nabidky) > 0 Then
' If Application.WorksheetFunction.CountIf(Range(.Columns(2)), c_Nabidky) > 0 Then
MsgBox "V databázi už tato nabídka existuje, je nutné změnit číslo cenové nabídky?", vbOKOnly, "Nabídka už existuje"
Else
Dim radek As Integer
radek = Worksheets("Databáze nabídek").Cells(Columns(1).Rows.Count, 2).End(xlUp).Row + 1
Worksheets("Databáze nabídek").Cells(radek, 2) = Worksheets("Nabídka").Range("R13") 'Číslo nabídky
Worksheets("Databáze nabídek").Cells(radek, 3) = Worksheets("Nabídka").Range("K16") 'Datum vystavení
MsgBox "Export do databáze byl ukončen", vbOKOnly, "Info"
End If
End With 'Worksheets("Databáze nabídek")
End Sub
Tomu zbytku kódu bez dat nerozumím, takže si to musíte doladit sám.
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.