Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Excel makro - Podľa hodnoty zmenej bunky prepočítať stĺpec

Minule som potreboval poradiť s makrom. Teraz potrebujem znova. Myslel som, že si vystačím s vedomosťami z predchádzajúceho makra, ale nie je to tak. O čo mi ide:
- zmením hodnotu bunky D1
- automaticky sa musí podľa hodnoty prepočítať celý stĺpec F a G od 5. do povedzme 200. riadku

Niečo takéto:

ak D1change tak
  pre každú bunku F5:F200 opakuj
    bunka = bunka * D1
    bunka.ofset(0, 1) = bunka * 2
  koniec pre

Čiže akože toto:

Private Sub D1_Change(ByVal Target As Range)
    On Error GoTo ErrorHandler
    Application.EnableEvents = False
    
    Set intersection = Intersect(Target.Cells, Range("F5:F200"))
    For Each cell In intersection
        cell = cell * D1
        cell.offset(0, 1) = cell * 2
    Next
    
ErrorHandler:
    Application.EnableEvents = True
End Sub

Môžte mi niekto poradiť, ako to správne zapísať?

Předmět Autor Datum
Viem, že to je len náznak, ako by to makro mohlo vyzerať, ale rozmýšľaj trocha: - VBA nemá pre zmenu…
los 17.05.2007 20:00
los
Nie, vzorce tam byť nesmú. Ide o to, že nikto nesmie vedieť, ako sa k danej hodnote prišlo. Zatiaľ ď…
msx. 17.05.2007 20:47
msx.
Takže nefunguje to. Presnejšie povedané funguje, ale nie v tomto súbore. Tam už nejaké makrá sú a bi…
msx. 19.05.2007 16:11
msx.
Ak tam už existuje funkcia Worksheet_Change, tak to musíš samozrejme vložiť do nej, a nie dopísať ďa…
los 19.05.2007 18:48
los
VYriešil som to skopírovaním listu do nového súboru a vložením makra. Zatiaľ to stačí. Ďakujem za po…
msx. 28.05.2007 23:12
msx.
Podľa toho čo tu čítam, ma napadá že jednoduchšie by bolo mať samostatný pracovný zošit so všetkými…
senior 19.05.2007 19:15
senior
Áno, vlastne tak som to urobil. poslední
msx. 28.05.2007 23:13
msx.

Viem, že to je len náznak, ako by to makro mohlo vyzerať, ale rozmýšľaj trocha:
- VBA nemá pre zmenu každej bunky samostatnú udalosť, takže D1_Change zrejme nerobí, to čo čakáš. Aj keby taká udalosť existovala, aký význam by mal argument Target?
- Keď chceš meniť hodnoty buniek v Range("F5:F200"), tak prečo by si mal prechádzať len cez bunky, ktoré sú v nejakom prieniku?
- Ak chceš bunke priradiť hodnotu, tak to musíš priradiť do vlastnosti cell.Value. Teraz si priradíš do premennej cell hodnotu a v ďalšom riadku s tou premennou pracuješ, ako keby v nej bola stále bunka.

Na takéto úlohy typu "ak sa zmení jedna bunka, tak nech sa zmenia hodnoty v iných bunkách" obyčajne stačia vzorce. Nestačili by aj v tomto prípade?

To makro by mohlo vyzerať takto:

Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo ErrorHandler
    Application.EnableEvents = False
    
    Dim cell As Range
    
    If Not Intersect(Target, Range("D1")) Is Nothing Then
        For Each cell In Range("E5:E10")
            cell.Value = cell * Range("D1")
            cell.Offset(0, 1).Value = cell * 2
        Next
    End If
    
ErrorHandler:
    Application.EnableEvents = True
End Sub

Podľa toho čo tu čítam, ma napadá že jednoduchšie by bolo mať samostatný pracovný zošit so všetkými vzorcami a vytvoriť makro na vyexportovanie potrebných údajov do userackého cenníka. Ide to viacerými spôsobmi. Asi by som zvolil spôsob, že v pracovnom zočite by som pomocou makra načítal všetky hodnoty ako premenné a zapísal do už naformatovaného userackého zošita. Iná možnosť je, oznáčiť v pracovnom zošite v prislušnom hárku oblasť obsahujúce údaje a tie skopírovať, potom otvoriť nový zošit a do toho vložiť fomaty, údaje a všetko čo potrebujeme, samozrejme pomocou makra, do ktorého je nutné dopísať niektoré príkazy. Napr. definovať šírku stlpcov a tiež názov nového zošita trebars aj s aktálnym dátumom. Takto bude pri každom spustení makra vytvorený nový uživateľský cenník, na rozdiel od predchadzajúceho spôsobu, kde sa budú v cenníku iba meniť údaje.

Zpět do poradny Odpovědět na původní otázku Nahoru