Stránka 1 z 1

Excel - Makro bez cyklu pro výpočet v kterémkoliv řádku

Napsal: 10 kvě 2017 09:17
od wilma
Zdravím,
potřebovala bych poradit s úpravou makra. Makro má po vyplnění buňky ve sloupci 8 ve stejném řádku některé buňky vyplnit, zamknout a provést výpočet do sloupce 14 z hodnot doplněných do sloupců 11,12.
Řádků postupně přibývá až do množství cca 200-300. Je nutné, aby výpočet proběhl hned, nikoliv po minutu dlouhém běhu případného cyklu. Makro je v sešitech určených pro mnoho různých uživatelů a každý se při vyplňování chová trochu jinak a má jiné požadavky..
Makro, které se mi povedlo sestavit, funguje prefektně do okamžiku, kdy někdo ve sloupci 8 vyplní více řádků najednou, pak teprve zpětně vyplňuje hodnoty ve sloupcích 11,12. V ten okamžik výpočet samozřejmě proběhne opět pouze u posledního řádku.

Moc by se mi hodilo, kdyby bylo možné vyplnit hodnotu ve sloupci 8 v kterémkoliv řádku a výpočet by proběhl korektně.
Activecell.row jsem zkoušela, ale nevyhovuje, protože po vyplnění hodnot ve sloupcích 11, 12 dá polovina uživatelů enter, čímž odskočí o řádek níže a výpočet již také neproběhne.
Prosím zkušenější o nápad, jak tyto situace ošetřit...
Plus ještě jedna věc, nepřišla jsem na to, jak makro přepsat tak, aby probíhalo jen v tabulce, tj. bez záhlaví, od řádku 8. Ošetřila jsem to podmínkou na hlavičku daného sloupce, ale to samozřejmě není moc čisté řešení.
Moc díky za pomoc.

Kód: Vybrat vše

Private Sub Worksheet_change(ByVal Target As Range)

Dim radek, sloupec_typ, sloupec_hodnota, sloupec_ks  As Variant

radek = Cells(Rows.Count, "H").End(xlUp).Row
sloupec_typ = 8
sloupec_ks = 10
sloupec_bef = 11
sloupec_after = 12
sloupec_vbi = 13
sloupec_hodnota = 14
sloupec_obj = 16
sloupec_pozn = 17


   If Cells(radek, sloupec_typ) = "typ" Then
         Application.EnableEvents = False
                Application.EnableEvents = True

    ElseIf Cells(radek, sloupec_typ) = "A" Then
         Application.EnableEvents = False
        ActiveSheet.Unprotect
        ActiveSheet.Cells(radek, sloupec_ks) = "1"
        ActiveSheet.Cells(radek, sloupec_ks).Locked = True
        ActiveSheet.Cells(radek, sloupec_bef).Locked = False
        ActiveSheet.Cells(radek, sloupec_after).Locked = False
        ActiveSheet.Cells(radek, sloupec_vbi).Locked = True
        ActiveSheet.Cells(radek, sloupec_hodnota) = Cells(radek, sloupec_after) - Cells(radek, sloupec_bef)
        ActiveSheet.Cells(radek, sloupec_hodnota).Locked = True
        ActiveSheet.Protect
        Application.EnableEvents = True
     
     
      ElseIf Cells(radek, sloupec_typ) = "B" Then
        Application.EnableEvents = False
        ActiveSheet.Unprotect
        ActiveSheet.Cells(radek, sloupec_ks) = "1"
        ActiveSheet.Cells(radek, sloupec_ks).Locked = True
        ActiveSheet.Cells(radek, sloupec_bef).Locked = False
        ActiveSheet.Cells(radek, sloupec_after).Locked = False
        ActiveSheet.Cells(radek, sloupec_vbi).Locked = True
        ActiveSheet.Cells(radek, sloupec_hodnota) = Cells(radek, sloupec_after) - Cells(radek, sloupec_bef)
        ActiveSheet.Cells(radek, sloupec_hodnota).Locked = True
        ActiveSheet.Protect
        Application.EnableEvents = True
       
    Else
        Application.EnableEvents = False
        ActiveSheet.Unprotect
       ActiveSheet.Cells(radek, sloupec_ks) = "1"
        ActiveSheet.Cells(radek, sloupec_ks).Locked = True
        ActiveSheet.Cells(radek, sloupec_bef).Locked = True
        ActiveSheet.Cells(radek, sloupec_after).Locked = True
        ActiveSheet.Cells(radek, sloupec_vbi).Locked = True
        ActiveSheet.Cells(radek, sloupec_hodnota).Locked = False
        ActiveSheet.Protect
        Application.EnableEvents = True
    End If   

End Sub

Re: Excel - Makro bez cyklu pro výpočet v kterémkoliv řádku

Napsal: 10 kvě 2017 17:58
od guest
To je na půl hodiny vysvětlování...

Pracovat je potřeba s Target, resp. Selection, porovnávat adresu sledované oblasti s Target (technika Union, Intersect), vzít si kolekci Cells a projít jí (For Each ... Next)

Můžeme pořešit soukromě s tím, že pošlete daný sešit a ještě jednou vysvětlíte, co to má dělat. A ne že mi vezmete tužku :-)