ID tematu: 75891
 |
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
|
|
|
 |
|
|
|
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
|
|
|
 |
|
|
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
|
|
|
 |
|
|
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
|
|
|
 |
|
|
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
|
|
|
 |
|
|
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
|
|
|
 |
|
|
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
|
|
|
 |
|
|
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
|
|
|
 |
|
|
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
|
|
|
 |
|
|
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
|
|
|
 |
|
|
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
|
|
|
 |
|
|
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
|
|
|
 |
|
|
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
|
|
|
 |
|
|
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
|
|
|
 |
|
|
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
|
|
|
 |
|
|
|