Jak zachytit smazání řádku

0
0

Dobrý den, existuje způsob jak odchytit událost smazání řádku uživatelem?

Marked as spam
Odeslal Anonymous
Otázka položena 1.1.2019 17:01
59 views
0
Private answer

Můžete nachystat past. Zvolte si referenční buňku a třeba na Worksheet_Change/Worksheet_Calculate testujte, jestli se nezměnilo číslo jejího řádku.

Marked as spam
Odeslal xlnc
Odpověděl 1.1.2019 18:24
0
Private answer

A to bych měl zvolit jak? Napsat do ní nějakou hodnotu a pak ji hledat a přečíst si její číslo řádku přes vlastnost row?

Marked as spam
Odeslal Anonymous
Odpověděl 1.1.2019 21:10
0
Private answer

A co když těch řádků vymaže třeba 20 a to včetně té referenční buňky?
Abyste rozuměl, v buňce např. A1 mám vzoreček =Počet2(A2:A1000) pro zjištění počtu vyplněných buněk v rozsahu A2 až A1000.
Pokud umažu v tomto rozsahu řádek (nebo víc ), vzoreček se změní na Počet2(A2:A999) a to nechci..

Marked as spam
Odeslal Anonymous
Odpověděl 1.1.2019 21:19
0
Private answer

Ona buňka může být hluboko dole. Nepotřebujete do ní nic zapsat, dáte jí název a čtete vlastnost Row. Změna vzorečku mi přijde smysluplnější než zadání. Ostatně s tím, že přijdete o řádky, se změnil rozsah dat, přijdete o formátování, a kdo ví, co ještě. Ale... POČET2 můžete nasadit na celý sloupec (ano, dávat součtový vzorec nad sčítaný sloupec je bejkárna, jsou tu ovšem definované názvy, absolutní adresování, dále NEPŘÍMÝ.ODKAZ, POSUN, ...).

Marked as spam
Odeslal xlnc
Odpověděl 1.1.2019 22:30
0
Private answer

Nakonec jsem to vyřešil v události onChange následovně:

Private Sub Worksheet_Change(ByVal Target As Range)
If ListMeridla.Cells(1, 2).Formula "=COUNTA(B3:B2003)" Then
ListMeridla.Cells(1, 2).Formula = "=COUNTA(B3:B2003)"
ListMeridla.Cells(1, 1).Formula = "=MAX(B3:B2003)"
End If
Snad to nebude na jiné mašině blbnout (tak trochu rekurze).
End Sub

Marked as spam
Odeslal Anonymous
Odpověděl 2.1.2019 10:01
0
Private answer

Principiálně v tom samozřejmě bota je - ta vaše rekurze. Abyste v událostní proceduře zamezil vzniku další události, používá se Application.EnableEvents = False a na konci True. Kromě toho vám tady v podmínce chybí srovnávací operátor a celá ta logika je víc než divná.

Marked as spam
Odeslal xlnc
Odpověděl 2.1.2019 11:36
0
Private answer

Jo, jak jsem to rozhazoval na řádky do chatu, operátor mi vypadl. Správně je to
If ListMeridla.Cells(1, 2).Formula "=COUNTA(B3:B2003)" Then
ListMeridla.Cells(1, 2).Formula = "=COUNTA(B3:B2003)"
ListMeridla.Cells(1, 1).Formula = "=MAX(B3:B2003)"
End If

EnableEvents je fakt lepší použít, taky jsem se k tomu probojoval, ale vcelku to fungovalo i tak, jenom to proběhlo ještě jednou v tomto případě.

Díky za radu.

Marked as spam
Odeslal Anonymous
Odpověděl 3.1.2019 11:45
0
Private answer

Hm, zase při kopírování vypadly znaky na nerovnost v podmínce . Divné.

Marked as spam
Odeslal Anonymous
Odpověděl 3.1.2019 11:46
0
Private answer

Pro úplnost
Private Sub Worksheet_Change(ByVal Target As Range)
If ListMeridla.Cells(1, 2).Formula nerovnáse "=COUNTA(B3:B2003)" Then
EnableEvents = False
On Error GoTo E_change
ListMeridla.Cells(1, 2).Formula = "=COUNTA(B3:B2003)"
ListMeridla.Cells(1, 1).Formula = "=MAX(B3:B2003)"
E_change: EnableEvents = True
End If
End Sub
Účelem bylo, aby se mi nezměnil vzorec pro počet čísel v oblasti B3 až B2003 a pro stanovení jejich maximální hodnoty, pokud uživatel odebere v této oblasti řádek.

Marked as spam
Odeslal Anonymous
Odpověděl 3.1.2019 11:57
0
Private answer

Dejme tomu, jen byste si měl zkusit i vzorečky, které rozsah po smazání řádku nemění. Dá se použít NEPŘÍMÝ.ODKAZ, POSUN, POČET/POČET2 a odkaz na celý sloupec absolutně aj.

Marked as spam
Odeslal xlnc
Odpověděl 3.1.2019 12:32
0
Private answer

Dobrý den,
zkusil jsem a funguje to pěkně, =POČET2(POSUN(A2:A2;1;1;2003;1)), jenom je potřeba zajistit, aby nešlo odstranit buňku A2, třeba zámkem. Ale A2 je stejně nadpis sloupce, takže proč ne.
Díky.

Marked as spam
Odeslal Anonymous
Odpověděl 4.1.2019 7:54

Odešlete svou odpověď

Attach YouTube/Vimeo clip putting the URL in brackets: [https://youtu.be/Zkdf3kaso]