niedziela, 24 maja 2015

VBA Jeśli edytuję % rabatu, obliczana jest cena oferowana. Jeśli edytuję cenę oferowaną, zmienia się procent rabatu.

W formatce Excela edycja kolumny x powoduje wyliczenie w kolumnie y, a jeżeli zacznie edytować komórkę y, będzie wyliczona komórka x.
Jak zaspokoić taką potrzebę? Wstępnie zastanawiam się nad zastosowaniem VBA i on change.
- jeżeli edytowana jest komórka w kolumnie x, wstaw formułę w kolumnie y.
- jeżeli użytkownik edytuje komórkę w kolumnie y, wstaw formułę w kolumnie x.
Czy to dobry kierunek? Obawiam się trochę, że powstaną "circular references" - zapętlone formuły. Jak tego uniknąć?
Oczywiście sam nie pozostanę bezczynny i postaram się przez weekend poeeksperymentować ale bardzo byłbym wdzięczny za wszelkie odpowiedzi.

EDIT: Oto co osiągnąłem przez weekend:

Private oListObj As ListObject

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Set oListObj = Worksheets("PROFORMA PLN").ListObjects("TableA")

Application.EnableEvents = True

    If Not Intersect(Target, oListObj.ListColumns("CENA OFEROWANA NETTO").DataBodyRange) Is Nothing Then
    Application.EnableEvents = False
    Target.Formula = Target.Value
    Application.EnableEvents = True
    End If
    
    If Not Intersect(Target, oListObj.ListColumns("OFEROWANY RABAT").DataBodyRange) Is Nothing Then
    Application.EnableEvents = False
    Target.Formula = Target.Value
    Application.EnableEvents = True
    End If



End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

Set oListObj = Worksheets("PROFORMA PLN").ListObjects("TableA")

Application.EnableEvents = True

    If Not Intersect(Target, oListObj.ListColumns("CENA OFEROWANA NETTO").DataBodyRange) Is Nothing Then
    Application.EnableEvents = False
    Target.Offset(0, 6).Formula = "=IF([@[CENA OFEROWANA NETTO]]<>"""", -([@[CENA OFEROWANA NETTO]]-[@[CENA KATALOGOWA ZA 1 SZT]])/[@[CENA KATALOGOWA ZA 1 SZT]],"""")"
    Application.EnableEvents = True
    End If
    
    If Not Intersect(Target, oListObj.ListColumns("OFEROWANY RABAT").DataBodyRange) Is Nothing Then
    Application.EnableEvents = False
    Target.Offset(0, -6).Formula = "=IF([@[Descr]]<>"""",[@[CENA KATALOGOWA ZA 1 SZT]]-([@[CENA KATALOGOWA ZA 1 SZT]]*[@[OFEROWANY RABAT]]),"""")"
    Application.EnableEvents = True
    End If

End Sub

Makro działające w Excelu tutaj

Brak komentarzy:

Prześlij komentarz