Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 75891 Skopiuj do schowka Uruchamianie makra po zmianie wyniku formuły
Autor Wiadomość
partner2001 
Exceloholic


Wersja: Win Office 365
Posty: 248
Wysłany: 03-06-2024, 12:39   Uruchamianie makra po zmianie wyniku formuły

Witam.
Wiem, że temat był już wielokrotnie poruszany ale nie znalazłem rozwiązania dla mojego problemu. Chcę aby makro uruchamiało się po zmianie wyniku formuły z "Fałsz" na "Prawda"
Zdarzenie arkusza Worksheet_Change nie rozwiązuje problemu bo formuła zawarta w komórkach kolumny np. D5:D100 nie zmienia się. Zmienia się tylko jej wynik z Fałszu na Prawdę i odwrotnie w zależności spełnienia lub niespełnienia określonych warunków a to nie powoduje powstania zdarzenia uruchamiającego procedurę. Zdarzenie arkusza Worksheet_Calculate też nie rozwiązuje mojego problemu bo po zmianie w jednej komórce procedura uruchamia się wielokrotnie i bardzo opóźnia pracę arkusza. Czy jest jakiś sprawdzony sposób żeby np. po zmianie wyniku formuły w określonej komórce uruchomiła sie określona procedura ale tylko 1 raz?
_________________
Dziękuję za pomoc.
Pozdrawiam
Leszek
ID posta: 435644 Skopiuj do schowka
 
 
Tajan


Pomógł: 5597 razy
Posty: 12121
Wysłany: 03-06-2024, 15:58   

Użyj zmiennej publicznej do zapamiętania wartości danej komórki. W procedurze Worksheet_Calculate porównaj jej wartość z aktualną wartością komórki. Jeżeli są różne, przypisz do zmiennej aktualną wartość komórki i uruchom makro, które ma reagować na zmianę.
ID posta: 435651 Skopiuj do schowka
 
 
partner2001 
Exceloholic


Wersja: Win Office 365
Posty: 248
Wysłany: 04-06-2024, 08:16   

Zaciąłem się.
Próbuję już od 5 rano i nic mi nie wychodzi.
Czy możesz pomóc.
_________________
Dziękuję za pomoc.
Pozdrawiam
Leszek
ID posta: 435666 Skopiuj do schowka
 
 
Tajan


Pomógł: 5597 razy
Posty: 12121
Wysłany: 04-06-2024, 12:27   

W sumie to nie bardzo wiem jak ci pomóc. Zamieściłeś post w dziale "Mam problem z makrem" ale nie pokazałeś ani przykładowego pliku, ani makra z którym masz problem.
Być może, twój problem dałoby się rozwiązać w inny sposób, np. wykorzystując zdarzenie Worksheet_Change ale monitorując komórki mające wpływ na wynik formuły a nie samą komórkę z formułą.
ID posta: 435673 Skopiuj do schowka
 
 
partner2001 
Exceloholic


Wersja: Win Office 365
Posty: 248
Wysłany: 04-06-2024, 14:00   

Mam zdarzenie
Kod:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim KeyCells As Range

    Set KeyCells = Range("BZ2:BZ100")

If Not Application.Intersect(KeyCells, Range(Target.Address)) _
           Is Nothing Then
'        teraz można podać nazwę procedury która się ma uruchomić po zmianie wartości komórki
        MsgBox "Makro się uruchamia."

End If
End Sub

Zdażenie nie wywołuje procedury (w tym wypadku okna MsgBox z komunikatem" ponieważ w komórkach kolumny BZ jest formuła zwracająca wartość prawda lub fałsz.

Przy użyciu zdarzenia
Kod:
Private Sub Worksheet_Calculate()

    Dim Xrg As Range
    Set Xrg = Range("BZ2:BZ100")
    If Not Intersect(Xrg, Range("BZ2:BZ100")) Is Nothing Then
    MsgBox "Uruchamianie makra"

    End If
End Sub

Procedura (w tym wypadku Wyskakuje okno MsgBox po jakiejkolwiek zmianie dokonanej w tym arkuszu.
Formuły w komórkach kolumny BZ to
Kod:
=LUB(AO11=3;AQ11=3;CC11="TAK";CD11="TAK")

Które zwracają wartość prawda lub fałsz.
Ja chcę żeby zmiana wyniku tej formuły z prawda na fałsz lub z fałszu na prawdę spowodowała wywołanie innej procedury np. w tym wypadku wyświetlenie okna MsgBox.
_________________
Dziękuję za pomoc.
Pozdrawiam
Leszek
ID posta: 435679 Skopiuj do schowka
 
 
Tajan


Pomógł: 5597 razy
Posty: 12121
Wysłany: 04-06-2024, 14:12   

A wartości w komórkach AO11, AQ11, CC11, CD11 są wprowadzane ręcznie czy są wynikiem formuły?
ID posta: 435680 Skopiuj do schowka
 
 
partner2001 
Exceloholic


Wersja: Win Office 365
Posty: 248
Wysłany: 04-06-2024, 14:41   

To też wyniki formuł.
_________________
Dziękuję za pomoc.
Pozdrawiam
Leszek
ID posta: 435683 Skopiuj do schowka
 
 
partner2001 
Exceloholic


Wersja: Win Office 365
Posty: 248
Wysłany: 04-06-2024, 14:49   

Myślałem żeby wprowadzić kolumnę techniczną (np. CG) w komórkach których jakieś inne zdarzenie wpisywałoby wartość w zależności od wartości komórek w kolumnie BZ i wtedy można by wykorzystać zdarzenie Worksheet_Change, ale nie wiem jak to zrobić.
_________________
Dziękuję za pomoc.
Pozdrawiam
Leszek
ID posta: 435684 Skopiuj do schowka
 
 
Tajan


Pomógł: 5597 razy
Posty: 12121
Wysłany: 04-06-2024, 14:51   

Ale te formuły muszą gdzieś mieć źródło, które nie jest formułą. Pozostaje do ustalenia gdzie się ono znajduje. W sumie to wychodzi z tego taka zgadywanka. Ja bez przykładowego pliku raczej nie będę się w nią bawił.
ID posta: 435685 Skopiuj do schowka
 
 
partner2001 
Exceloholic


Wersja: Win Office 365
Posty: 248
Wysłany: 04-06-2024, 14:58   

Załączam plik.

IMW SKRZATÓW - PLIK TESTOWY.xlsm
Pobierz Plik ściągnięto 32 raz(y) 66.33 KB

_________________
Dziękuję za pomoc.
Pozdrawiam
Leszek
ID posta: 435687 Skopiuj do schowka
 
 
Tajan


Pomógł: 5597 razy
Posty: 12121
Wysłany: 04-06-2024, 15:44   

Z pliku wynika, że wynik formuły zależy od danych wprowadzonych w obszarze "Z2:AN16" więc do tych komórek należy odnieść działanie procedury zdarzeniowej Worksheet_Change. Przykładowe makro sprawdzające kolumnę BZ po zmianie wartości w tych komórkach:
Kod:
Private Sub Worksheet_Change(ByVal Target As Range)
   
    Dim KeyCells As Range
    Dim ChangedCell As Range
   
    Set KeyCells = Range("Z2:AN16")
   
    Set ChangedCell = Application.Intersect(KeyCells, Target)

    If Not ChangedCell Is Nothing Then
     
        With ChangedCell
       
            If .Count = 1 Then
           
                If IsNumeric(.Value) And Range("BZ" & .Row).Value = True Then
       
                    MsgBox "Uruchamianie makra"
               
                End If
           
            End If
       
        End With
       
    End If

End Sub
ID posta: 435689 Skopiuj do schowka
 
 
Maciej Gonet 
Excel Expert


Wersja: Win Office 365
Pomógł: 3601 razy
Posty: 10605
Wysłany: 04-06-2024, 16:06   

A moja propozycja na bazie zdarzenia Calculate, tylko inny kod niż Ty używałeś.

Kod:
Private Sub Worksheet_Calculate()
    Static Prev As Variant
    Dim Xrg As Variant
    Xrg = Range("BZ2:BZ16").Value
       
    With Application
        If .Or(.Bitxor(Xrg, Prev)) Then
            Prev = Xrg
            MsgBox "Uruchamianie makra"
        End If
    End With
End Sub
Za pierwszym razem po otwarciu pliku makro się uruchomi. Jeśli to problem, to można dodać jeszcze makro Workbook_Open, a zmienną Prev zadeklarować jako publiczną w module uniwersalnym. Wtedy zmienna Prev byłaby inicjowana przy otwieraniu skoroszytu.

IMW SKRZATÓW - PLIK TESTOWY.xlsm
Pobierz Plik ściągnięto 27 raz(y) 67.76 KB

ID posta: 435691 Skopiuj do schowka
 
 
partner2001 
Exceloholic


Wersja: Win Office 365
Posty: 248
Wysłany: 04-06-2024, 17:21   

Dziękuję Maćku i Tajanie.
Zarówno propozycja Tajana na bazie zdarzenia Workseet_Change jak i propozycja Maćka na bazie zdarzenia Workseet_Calculate działają. Musiałem tylko wprowadzić dodatkowe warunki sprawdzające czy set i mecz się zakończył bo w kolumnie wyniki (kolumny AO;AQ) wpisywały się wartości po wprowadzeniu tylko punktów zdobytych przez zawodnika 1. To powodowało że formułą zawarta w kolumnie BZ traktowała że mecz już się zakończył i uruchamiała się procedura. Wprowadziłem w dodatkowych kolumnach sprawdzenie czy set się zakończył tzn wpisana jest ilość zdobytych punktów przez obu zawodników aktualizuje się wynik meczu.
Jeszcze raz dziękuję Wama bardzo.
Myślę że z waszych propozycji skorzysta niejedna osoba.
Jesteście wielcy - obaj.
Nie wiem tylko jak zrobić żeby przy wykorzystaniu zdarzenia Worksheet_Calculate przy otwarciu pliku nie uruchamiała sie procedura. Co prawda opisałeś że można dodać makro Workbook_Open, a zmienną Prev zadeklarować jako publiczną w module uniwersalnym ale nie wiem czy wystarczy tylko utworzyć zdarzenie
Kod:
Private Sub Workbook_Open()

Public Prev As Variant

End Sub
_________________
Dziękuję za pomoc.
Pozdrawiam
Leszek
ID posta: 435692 Skopiuj do schowka
 
 
Maciej Gonet 
Excel Expert


Wersja: Win Office 365
Pomógł: 3601 razy
Posty: 10605
Wysłany: 04-06-2024, 17:44   

Trzeba wprowadzić 3 zmiany:
1) dodać moduł uniwersalny i w nim wpisać deklarację:
Kod:
Public Prev As Variant

2) w module skoroszytu dodać obsługę Workbook_Open - musi inicjować zmienną publiczną:
Kod:
Private Sub Workbook_Open()
    Prev = Worksheets("TG8").Range("BZ2:BZ16").Value
End Sub

3) z modułu arkusza z procedury Worksheet_Calculate usunąć deklarację zmiennej statycznej Prev.

IMW SKRZATÓW - PLIK TESTOWY1.xlsm
Pobierz Plik ściągnięto 28 raz(y) 68.58 KB

ID posta: 435693 Skopiuj do schowka
 
 
partner2001 
Exceloholic


Wersja: Win Office 365
Posty: 248
Wysłany: 04-06-2024, 18:18   

Tajan, Maciek

Jeszcze raz serdeczne dzięki.
_________________
Dziękuję za pomoc.
Pozdrawiam
Leszek
ID posta: 435694 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.wip.pl

Archiwum

Strona uĹźywa plikĂłw cookies.

Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przegl�darce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
SprawdĹş, w jaki sposĂłb przetwarzamy dane osobowe