Makro na informację o zmianie wartości liczbowej w zakresie komórek
-
- Posty: 13
- Rejestracja: śr sie 07, 2024 4:29 pm
Makro na informację o zmianie wartości liczbowej w zakresie komórek
Witam,
kombinowałem, ale ciągle wyskakuje mi jakiś błąd... Czy ktoś mógłby pomóc w przygotowaniu makra jak w temacie? W pliku w komórkach N2:AE50 występują wartości liczbowe (1,2,3,4...), potrzebuję informacji w sytuacji, kiedy jakaś wartość liczbowa w komórce ulegnie zmianie np.
komórka N2 "wartość uległa zmianie; było 1, a jest 2"
W zdarzeniach dokumentu nie ma np. czegoś takiego jak "zmiana wartości".
Version: 24.8.4.2 (X86_64) / LibreOffice Community
Build ID: bb3cfa12c7b1bf994ecc5649a80400d06cd71002
CPU threads: 4; OS: Windows 10 X86_64 (10.0 build 19045); UI render: Skia/Raster; VCL: win
Locale: pl-PL (pl_PL); UI: pl-PL
Calc: CL threaded
kombinowałem, ale ciągle wyskakuje mi jakiś błąd... Czy ktoś mógłby pomóc w przygotowaniu makra jak w temacie? W pliku w komórkach N2:AE50 występują wartości liczbowe (1,2,3,4...), potrzebuję informacji w sytuacji, kiedy jakaś wartość liczbowa w komórce ulegnie zmianie np.
komórka N2 "wartość uległa zmianie; było 1, a jest 2"
W zdarzeniach dokumentu nie ma np. czegoś takiego jak "zmiana wartości".
Version: 24.8.4.2 (X86_64) / LibreOffice Community
Build ID: bb3cfa12c7b1bf994ecc5649a80400d06cd71002
CPU threads: 4; OS: Windows 10 X86_64 (10.0 build 19045); UI render: Skia/Raster; VCL: win
Locale: pl-PL (pl_PL); UI: pl-PL
Calc: CL threaded
Ostatnio zmieniony sob sty 04, 2025 2:26 pm przez Jermor, łącznie zmieniany 1 raz.
Powód: Przeniosłem post do tego działu. Dział Base dotyczy programu Base, czyli tematów bazy danych.
Powód: Przeniosłem post do tego działu. Dział Base dotyczy programu Base, czyli tematów bazy danych.
Libre Office 7.4 na Windows 10 PRO
Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek
Przeniosłem twój post do działu "Makra i programowanie". Dział "Base", w którym umieściłeś swój wpis, dotyczy baz danych.
Wracając do wpisu, nie bardzo rozumiem, do czego to makro ma służyć.
Zmiana wartości komórki może wystąpić z dwóch powodów: dokonania wpisu przez użytkownika arkusza albo przez przeliczenia formuły znajdującej się w komórce, spowodowanej zmianą zawartości komórek źródłowych.
Przypadek pierwszy jest możliwy do oprogramowania, ale chyba bezcelowy, bo wpisując nowe dane, widzisz jakie dane zastępujesz.
Przypadek drugi wymaga sprawdzania, czy zmieniła się którakolwiek z komórek źródłowych i na tej podstawie zadziałanie na komórce wynikowej.
W obu przypadkach należy uwzględnić fakt, że zmiana wartości może nastąpić poprzez wpisanie jej z klawiatury lub skopiowanie wartości z innej lokalizacji metodą "skopiuj i wklej".
A jeśli jak napisałeś
Wracając do wpisu, nie bardzo rozumiem, do czego to makro ma służyć.
Zmiana wartości komórki może wystąpić z dwóch powodów: dokonania wpisu przez użytkownika arkusza albo przez przeliczenia formuły znajdującej się w komórce, spowodowanej zmianą zawartości komórek źródłowych.
Przypadek pierwszy jest możliwy do oprogramowania, ale chyba bezcelowy, bo wpisując nowe dane, widzisz jakie dane zastępujesz.
Przypadek drugi wymaga sprawdzania, czy zmieniła się którakolwiek z komórek źródłowych i na tej podstawie zadziałanie na komórce wynikowej.
W obu przypadkach należy uwzględnić fakt, że zmiana wartości może nastąpić poprzez wpisanie jej z klawiatury lub skopiowanie wartości z innej lokalizacji metodą "skopiuj i wklej".
A jeśli jak napisałeś
to pokaż, co próbowałeś zrobić.
AOO 4.1.15, LO 24.8.5 (x64) na Windows 11 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
-
- Posty: 13
- Rejestracja: śr sie 07, 2024 4:29 pm
Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek
Dzięki za przeniesienie i pomoc. W pracy mam 2 pliki, w jednym wpisuje w kolumnie B kto i za co zapłacił, wtedy pojawia się tam nazwisko. W pliku drugim z kolei, mam tabelkę do rozliczeń, wpisuje sobie tam kwoty umowy, kwoty wpłaty i dzięki temu bardziej kontroluje faktury. W podanym zakresie T2:AE50 znajdują się wartości liczbowe, które są równe ilości "nazwiska" w poprzednim pliku w kolumnie B. Jako, że nie tylko ja wprowadzam dane do kolumny B, chce być informowany jeżeli zmieni się wartość któregoś z moich klientów, wtedy jeszcze bardziej mogę pilnować sobie płatności klientów.
Mam na przykład coś takiego, w zdarzeniach nie ma czegoś takiego jak "Zmiana wartości", przypisywałem do zdarzeń arkusza bo tam jest coś takiego jak zmiana wartości komórki, ale nie działa.
Kod: Zaznacz cały
Dim previousValues As Object
Sub MonitorChanges()
Dim sheet As Object
Dim cellRange As Object
Dim currentValues As Object
Dim row As Integer, col As Integer
' Pobierz arkusz i zakres monitorowanych komórek
sheet = ThisComponent.Sheets(0) ' Pierwszy arkusz (indeks 0)
cellRange = sheet.getCellRangeByName("T2:AE50")
' Jeśli to pierwsze uruchomienie, zapisz aktualne wartości
If IsNull(previousValues) Then
previousValues = cellRange.getDataArray()
Exit Sub
End If
' Pobierz aktualne wartości
currentValues = cellRange.getDataArray()
' Sprawdź zmiany
For row = LBound(currentValues) To UBound(currentValues)
For col = LBound(currentValues(row)) To UBound(currentValues(row))
If currentValues(row)(col) <> previousValues(row)(col) Then
MsgBox "Zmiana w komórce " & cellRange.getCellByPosition(col, row).AbsoluteName & _
": było " & previousValues(row)(col) & ", jest " & currentValues(row)(col), 64, "Zmiana wartości"
End If
Next col
Next row
' Zaktualizuj zapamiętane wartości
previousValues = currentValues
End Sub
Ostatnio zmieniony wt sty 07, 2025 11:03 am przez Jan_J, łącznie zmieniany 1 raz.
Powód: Znaczniki [code] obejmujące kod programistyczny
Powód: Znaczniki [code] obejmujące kod programistyczny
Libre Office 7.4 na Windows 10 PRO
Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek
Przygotowałem ci przykładowy arkusz z makrami.
Żółty obszar w arkuszu ma przypisaną nazwę "zakres" i to w nim kontrolowane są zmiany zawartości komórek. Liczby, które widać w tym obszarze są wynikami formuł obliczeniowych wykonanych na liczbach z kolumny B i z pierwszego wiersza.
Makra zostały umieszczone w module "Listener"
Po załadowaniu skoroszytu należy uruchomić makro "Uruchom_Listener". Od tego momentu wszystkie zmiany wartości będą raportowane.
Aby zakończyć raportowanie, należy wykonać makro "Zamknij_Listener".
Żółty obszar w arkuszu ma przypisaną nazwę "zakres" i to w nim kontrolowane są zmiany zawartości komórek. Liczby, które widać w tym obszarze są wynikami formuł obliczeniowych wykonanych na liczbach z kolumny B i z pierwszego wiersza.
Makra zostały umieszczone w module "Listener"
Po załadowaniu skoroszytu należy uruchomić makro "Uruchom_Listener". Od tego momentu wszystkie zmiany wartości będą raportowane.
Aby zakończyć raportowanie, należy wykonać makro "Zamknij_Listener".
- Załączniki
-
- olistener.ods
- Przykład raportowania zmian w wybranych komórkach
- (13.33 KiB) Pobrany 18 razy
AOO 4.1.15, LO 24.8.5 (x64) na Windows 11 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek
Uruchomienie makra da się przypisać wewnątrz dokumentu do zdarzenia jego otwarcia.
Być może ma to sens, jeśli śledzenie ma się odbywać w domyślnym trybie pracy.
Być może ma to sens, jeśli śledzenie ma się odbywać w domyślnym trybie pracy.
JJ
LO (25.2|24.8) ∙ Python (3.12|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (25.2|24.8) ∙ Python (3.12|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
-
- Posty: 13
- Rejestracja: śr sie 07, 2024 4:29 pm
Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek
Bardzo dziękuję Ci za Twój poświęcony czas. Po uruchomieniu Listener, wyskakuje błąd:Jermor pisze: ↑śr sty 08, 2025 12:24 am Przygotowałem ci przykładowy arkusz z makrami.
Żółty obszar w arkuszu ma przypisaną nazwę "zakres" i to w nim kontrolowane są zmiany zawartości komórek. Liczby, które widać w tym obszarze są wynikami formuł obliczeniowych wykonanych na liczbach z kolumny B i z pierwszego wiersza.
Makra zostały umieszczone w module "Listener"
Po załadowaniu skoroszytu należy uruchomić makro "Uruchom_Listener". Od tego momentu wszystkie zmiany wartości będą raportowane.
Aby zakończyć raportowanie, należy wykonać makro "Zamknij_Listener".
Błąd uruchomieniowy języka BASIC.
Nie znaleziono właściwości lub metody: Cells.
Chciałem teraz zrobić przez "rejestrację zmian", ale problem z tym jest taki, że ja w komórce np. N2 mam formułę wpisaną, a wartość zmienia się automatycznie po wprowadzeniu zmian w kolumnie B w drugim pliku. "Rejestracja zmian" z tego co widzę bierze pod uwagę to co jest zapisane bezpośrednio w komórce, zamiast tą wartość z komórki. :/
Libre Office 7.4 na Windows 10 PRO
-
- Posty: 13
- Rejestracja: śr sie 07, 2024 4:29 pm
Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek
https://zapodaj.net/plik-oK0yMkDYT4
1. Załóżmy, że w tym wyciętym fragmencie jest nazwisko "Nowak"
2. Mam takie coś w pliku "X", na zdjęciu jest sytuacja taka jakby w kolumnie B w pliku "Y" pojawiło już się raz nazwisko "Nowak", jak w kolumnie B, w pliku "Y" pojawi się w kolejnej komórce nazwisko "Nowak" to wartość liczbowa "1" zmieni się na "2".
To makro, które przygotowałeś działa, ale jeżeli zastoje je do tego pliku, to i tak po zmianie wartości w komórce nie wyświetla się komunikat. ;/
1. Załóżmy, że w tym wyciętym fragmencie jest nazwisko "Nowak"
2. Mam takie coś w pliku "X", na zdjęciu jest sytuacja taka jakby w kolumnie B w pliku "Y" pojawiło już się raz nazwisko "Nowak", jak w kolumnie B, w pliku "Y" pojawi się w kolejnej komórce nazwisko "Nowak" to wartość liczbowa "1" zmieni się na "2".
To makro, które przygotowałeś działa, ale jeżeli zastoje je do tego pliku, to i tak po zmianie wartości w komórce nie wyświetla się komunikat. ;/
Libre Office 7.4 na Windows 10 PRO
-
- Posty: 13
- Rejestracja: śr sie 07, 2024 4:29 pm
Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek
Mam na przykład taki kod makra z pomocą chatu gpt, ale też to nie działa. Wartość w komórce się zmienia, ale jak otwieram plik to nie wyskakuje komunikat.
Kod: Zaznacz cały
Sub ZapiszDaneZakresu()
Dim oDoc As Object, oSheet As Object, oHiddenSheet As Object
Dim oRange As Object, oData() As Variant
oDoc = ThisComponent
oSheet = oDoc.Sheets(0) ' Arkusz główny
oRange = oSheet.getCellRangeByName("N2:AE50")
oData = oRange.getDataArray()
' Sprawdź, czy istnieje ukryty arkusz
If Not oDoc.Sheets.hasByName("Poprzednie Dane") Then
oHiddenSheet = oDoc.Sheets.createHiddenByName("Poprzednie Dane")
Else
oHiddenSheet = oDoc.Sheets.getByName("Poprzednie Dane")
End If
' Zapisz dane do ukrytego arkusza
oHiddenSheet.getCellRangeByName("A1:Z50").setDataArray(oData)
End Sub
Sub PorownajDaneZakresu()
Dim oDoc As Object, oSheet As Object, oHiddenSheet As Object
Dim oRange As Object, oOldRange As Object
Dim oData() As Variant, oOldData() As Variant
Dim i As Integer, j As Integer
Dim msg As String
oDoc = ThisComponent
oSheet = oDoc.Sheets(0) ' Arkusz główny
oRange = oSheet.getCellRangeByName("N2:AE50")
oData = oRange.getDataArray()
' Sprawdź, czy istnieje ukryty arkusz
If Not oDoc.Sheets.hasByName("Poprzednie Dane") Then Exit Sub
oHiddenSheet = oDoc.Sheets.getByName("Poprzednie Dane")
oOldRange = oHiddenSheet.getCellRangeByName("A1:Z50")
oOldData = oOldRange.getDataArray()
' Porównaj dane
msg = ""
For i = LBound(oData) To UBound(oData)
For j = LBound(oData(i)) To UBound(oData(i))
If oData(i)(j) <> oOldData(i)(j) Then
msg = msg & "Zmiana w komórce " & Chr(78 + j) & (2 + i) & ": było " _
& oOldData(i)(j) & ", jest " & oData(i)(j) & Chr(10)
End If
Next j
Next i
' Wyświetl wyniki
If msg <> "" Then
MsgBox "Wykryto zmiany:" & Chr(10) & msg, 64, "Zmiany w danych"
End If
End Sub
Sub OnDocumentLoad()
PorownajDaneZakresu()
End Sub
Sub OnDocumentUnload()
ZapiszDaneZakresu()
End Sub
Libre Office 7.4 na Windows 10 PRO
-
- Posty: 13
- Rejestracja: śr sie 07, 2024 4:29 pm
Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek
Powyżej udostępniłem kod z próbą przypisania tych zdarzeń, ale dalej zong
Libre Office 7.4 na Windows 10 PRO
Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek
U mnie nie są zgłaszane żadne błędy.
Jeśli jednak o nich piszesz, to powinieneś przekopiować podprogram do postu i podać, w której linii sygnalizowany jest błąd.
Po wystąpieniu błędu otwierany jest edytor Basica a wiersz, w którym raportowany jest błąd, jest podświetlony.
Zastanawia mnie także to, że komunikat dotyczy metody Cells a w moim oprogramowaniu taki ciąg liter nigdzie się nie pojawia.
Przy okazji sprawdziłem to rozwiązanie w Apache OpenOffice. Też działa bez problemu, ale jest realizowane inaczej.
W LibreOffice raport pojawia się przed zmianą wartości w komórce, natomiast w Apache raport wyświetlany jest po zmianie wartości, więc jego formuła jest myląca, gdyż brzmi "jest... będzie... ", podczas gdy w rzeczywistości zmiany już nastąpiły i powinien brzmieć "było... jest...".
Jeśli jednak o nich piszesz, to powinieneś przekopiować podprogram do postu i podać, w której linii sygnalizowany jest błąd.
Po wystąpieniu błędu otwierany jest edytor Basica a wiersz, w którym raportowany jest błąd, jest podświetlony.
Zastanawia mnie także to, że komunikat dotyczy metody Cells a w moim oprogramowaniu taki ciąg liter nigdzie się nie pojawia.
Przy okazji sprawdziłem to rozwiązanie w Apache OpenOffice. Też działa bez problemu, ale jest realizowane inaczej.
W LibreOffice raport pojawia się przed zmianą wartości w komórce, natomiast w Apache raport wyświetlany jest po zmianie wartości, więc jego formuła jest myląca, gdyż brzmi "jest... będzie... ", podczas gdy w rzeczywistości zmiany już nastąpiły i powinien brzmieć "było... jest...".
AOO 4.1.15, LO 24.8.5 (x64) na Windows 11 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
-
- Posty: 13
- Rejestracja: śr sie 07, 2024 4:29 pm
Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek
W edycji makr do arkusza ROZLICZENIA dodałem folder Standard, tam zrobiłem moduł "Sledzenie", do tego modułu dodałem Twoje makra, zapisałem. Uruchomiłem makro, wyłączyłem plik. Wprowadziłem zmiany w pliku "y" w kolumnie B, tak żeby w zakresie komórek zmieniła się gdzieś wartość liczbowa z 1 na 2 (czyli powiedzmy, że współpracownik wpisał jakąś wpłatę klienta o nazwisku Nowak). Wchodzę do tego pliku "x" z makrami --> otwieram --> wartość w komórce np. T2 zmieniła się z "1" na "2", ale nie wyskoczyło żadne powiadomienie --> uruchomiłem makro ale nic nie wyskoczyło --> zapisuje plik i zamykam, nie wyskakuje błąd. Tak to wygląda po kolei.Jermor pisze: ↑czw sty 09, 2025 2:23 pm U mnie nie są zgłaszane żadne błędy.
Jeśli jednak o nich piszesz, to powinieneś przekopiować podprogram do postu i podać, w której linii sygnalizowany jest błąd.
Po wystąpieniu błędu otwierany jest edytor Basica a wiersz, w którym raportowany jest błąd, jest podświetlony.
Zastanawia mnie także to, że komunikat dotyczy metody Cells a w moim oprogramowaniu taki ciąg liter nigdzie się nie pojawia.
Przy okazji sprawdziłem to rozwiązanie w Apache OpenOffice. Też działa bez problemu, ale jest realizowane inaczej.
W LibreOffice raport pojawia się przed zmianą wartości w komórce, natomiast w Apache raport wyświetlany jest po zmianie wartości, więc jego formuła jest myląca, gdyż brzmi "jest... będzie... ", podczas gdy w rzeczywistości zmiany już nastąpiły i powinien brzmieć "było... jest...".
Libre Office 7.4 na Windows 10 PRO
-
- Posty: 13
- Rejestracja: śr sie 07, 2024 4:29 pm
Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek
Zaznaczyłem zakres komórek N2:AE50 i nazwałem to zaznaczenie "zakres".divertalive pisze: ↑czw sty 09, 2025 3:12 pmW edycji makr do arkusza ROZLICZENIA dodałem folder Standard, tam zrobiłem moduł "Sledzenie", do tego modułu dodałem Twoje makra, zapisałem. Uruchomiłem makro, wyłączyłem plik. Wprowadziłem zmiany w pliku "y" w kolumnie B, tak żeby w zakresie komórek zmieniła się gdzieś wartość liczbowa z 1 na 2 (czyli powiedzmy, że współpracownik wpisał jakąś wpłatę klienta o nazwisku Nowak). Wchodzę do tego pliku "x" z makrami --> otwieram --> wartość w komórce np. T2 zmieniła się z "1" na "2", ale nie wyskoczyło żadne powiadomienie --> uruchomiłem makro ale nic nie wyskoczyło --> zapisuje plik i zamykam, nie wyskakuje błąd. Tak to wygląda po kolei.Jermor pisze: ↑czw sty 09, 2025 2:23 pm U mnie nie są zgłaszane żadne błędy.
Jeśli jednak o nich piszesz, to powinieneś przekopiować podprogram do postu i podać, w której linii sygnalizowany jest błąd.
Po wystąpieniu błędu otwierany jest edytor Basica a wiersz, w którym raportowany jest błąd, jest podświetlony.
Zastanawia mnie także to, że komunikat dotyczy metody Cells a w moim oprogramowaniu taki ciąg liter nigdzie się nie pojawia.
Przy okazji sprawdziłem to rozwiązanie w Apache OpenOffice. Też działa bez problemu, ale jest realizowane inaczej.
W LibreOffice raport pojawia się przed zmianą wartości w komórce, natomiast w Apache raport wyświetlany jest po zmianie wartości, więc jego formuła jest myląca, gdyż brzmi "jest... będzie... ", podczas gdy w rzeczywistości zmiany już nastąpiły i powinien brzmieć "było... jest...".
https://zapodaj.net/plik-e8ddzZrvEm tak to wygląda u mnie
Libre Office 7.4 na Windows 10 PRO
-
- Posty: 13
- Rejestracja: śr sie 07, 2024 4:29 pm
Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek
U Ciebie w pliku działa to świetnie, tylko wartość zmienia się ręcznie przez zmianę wartości liczbowej mnożnika.Jermor pisze: ↑czw sty 09, 2025 2:23 pm U mnie nie są zgłaszane żadne błędy.
Jeśli jednak o nich piszesz, to powinieneś przekopiować podprogram do postu i podać, w której linii sygnalizowany jest błąd.
Po wystąpieniu błędu otwierany jest edytor Basica a wiersz, w którym raportowany jest błąd, jest podświetlony.
Zastanawia mnie także to, że komunikat dotyczy metody Cells a w moim oprogramowaniu taki ciąg liter nigdzie się nie pojawia.
Przy okazji sprawdziłem to rozwiązanie w Apache OpenOffice. Też działa bez problemu, ale jest realizowane inaczej.
W LibreOffice raport pojawia się przed zmianą wartości w komórce, natomiast w Apache raport wyświetlany jest po zmianie wartości, więc jego formuła jest myląca, gdyż brzmi "jest... będzie... ", podczas gdy w rzeczywistości zmiany już nastąpiły i powinien brzmieć "było... jest...".
(uruchamiam makro, zmieniam wartość mnożnika, makro informuje co będzie znajdowało się po zmianie mnożnika).
U mnie wartość zmienia się w po otwarciu pliku lub załadowaniu go ponownie.
Libre Office 7.4 na Windows 10 PRO
Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek
W tym właśnie tkwi problem. Gdy ładujesz (uruchamiasz) plik z arkuszem najpierw wykonują się wszystkie obliczenia. Więc gdy uruchamiasz makro, to dla niego, w arkuszu są "stare dane". By poprawnie to funkcjonowało, należałoby uruchamiać plik A przed uruchomieniem pliku B, plik A powinien pozostać otwarty do końca dnia, bez względu na to, czy plik B byłby zamykany i otwierany. Po ostatecznym zamknięciu pliku B należałoby zaktualizować dane i dopiero wówczas zamknąć plik A.
Nasuwa się pytanie, o co właściwie chodzi. Przedstawiłeś ten problem w taki sposób, że oczekujesz natychmiastowej reakcji na zmiany wynikające z działań wykonywanych na pliku B. Nie wiem, w jaki sposób przejmujesz dane. Jeśli korzystasz z łącza do danych lub funkcji DDE(), to dane są pobierane zawsze przy uruchamianiu pliku a później na żądanie. Więc to ty musisz wymusić ich pobranie, czyli być może nie trzeba tworzyć makra, które nasłuchuje czy nastąpiła zmiana, ale utworzyć rozwiązanie, które zobrazuje zaszłe zmiany od ostatniego oglądu.
Przedstawiam ci pomysł na podstawie przesłanego pliku.
Tym razem skoroszyt zawiera trzy arkusze.
"Bieżący" to ten, który zawiera dane pobierane z pliku B. W tym arkuszu formatowanie warunkowe wyróżnia wartości, które uległy zmianie. Zawiera także przycisk "Obejrzałem zmiany", do którego podpiąłem nagrane makro, kopiujące wartości z arkusza bieżącego do arkusza ukrytego.
"Różnice" to arkusz zawierający w odpowiadających komórkach, w których nastąpiły zmiany tekst "Jest tyle, Było tyle".
"Ukryty" zawierający ostatnią zatwierdzoną kopię.
Jeżeli w arkuszu bieżącym pojawi się wartość inna niż w jego kopii ("Ukryty"), wartość zostanie wyróżniona, a w arkuszu "Różnice" w odpowiadającej komórce pojawi się informacja.
Nasuwa się pytanie, o co właściwie chodzi. Przedstawiłeś ten problem w taki sposób, że oczekujesz natychmiastowej reakcji na zmiany wynikające z działań wykonywanych na pliku B. Nie wiem, w jaki sposób przejmujesz dane. Jeśli korzystasz z łącza do danych lub funkcji DDE(), to dane są pobierane zawsze przy uruchamianiu pliku a później na żądanie. Więc to ty musisz wymusić ich pobranie, czyli być może nie trzeba tworzyć makra, które nasłuchuje czy nastąpiła zmiana, ale utworzyć rozwiązanie, które zobrazuje zaszłe zmiany od ostatniego oglądu.
Przedstawiam ci pomysł na podstawie przesłanego pliku.
Tym razem skoroszyt zawiera trzy arkusze.
"Bieżący" to ten, który zawiera dane pobierane z pliku B. W tym arkuszu formatowanie warunkowe wyróżnia wartości, które uległy zmianie. Zawiera także przycisk "Obejrzałem zmiany", do którego podpiąłem nagrane makro, kopiujące wartości z arkusza bieżącego do arkusza ukrytego.
"Różnice" to arkusz zawierający w odpowiadających komórkach, w których nastąpiły zmiany tekst "Jest tyle, Było tyle".
"Ukryty" zawierający ostatnią zatwierdzoną kopię.
Jeżeli w arkuszu bieżącym pojawi się wartość inna niż w jego kopii ("Ukryty"), wartość zostanie wyróżniona, a w arkuszu "Różnice" w odpowiadającej komórce pojawi się informacja.
- Załączniki
-
- zmiany.ods
- Inny sposób analizy zmian
- (19.26 KiB) Pobrany 10 razy
AOO 4.1.15, LO 24.8.5 (x64) na Windows 11 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek
Słowo Cells daje mi do myślenia, że zachodzi próba uruchomienia funkcji excelowskiego Basica.
Nie mam pewności, ponieważ jest to legalna nazwa i może być użyta gdziekolwiek. Jednak w VBA ta nazwa opisuje strukturę komórek na planszy skoroszytu.
Być może więc masz gdzieś przypisane uruchmienie nie tego makra co trzeba. Może nawet poza dokumentem.
Nie mam pewności, ponieważ jest to legalna nazwa i może być użyta gdziekolwiek. Jednak w VBA ta nazwa opisuje strukturę komórek na planszy skoroszytu.
Być może więc masz gdzieś przypisane uruchmienie nie tego makra co trzeba. Może nawet poza dokumentem.
JJ
LO (25.2|24.8) ∙ Python (3.12|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (25.2|24.8) ∙ Python (3.12|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
-
- Posty: 13
- Rejestracja: śr sie 07, 2024 4:29 pm
Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek
Kurczę, nie wiem jak to dobrze wyjaśnić. Przygotowałem testowe dwa pliki z formułami takimi jakie mam. W "ROZLICZENIA Z KLIENTAMI" trzeba zmienić tylko lokalizację pliku żeby czytało z tego pliku STYCZEŃ 2025.ods
Najpierw zmiany zachodzą w pliku STYCZEŃ 2025 w kolumnie B, tam są zapisane i plik zamykany.
Potem odpalam plik ROZLICZENIA Z KLIENTAMI, tam po otwarciu aktualizują się wartości w komórkach. Jeżeli w pliku STYCZEŃ "Nowak" będzie 3x to w pliku ROZLICZENIA Z KLIENTAMI w danej komórce zamiast np. 0 będzie 3.
Chciałbym żeby oprócz tego, że po uruchomieniu pliku ROZLICZENIA Z KLIENTAMI zmieniała się wartość to żeby jeszcze mnie informowało gdzie się zmieniło coś, że na przykład Nowaków w kolumnie B było dwóch, a został dopisany jeszcze jeden więc zmieniło się z 2 na 3.
Najpierw zmiany zachodzą w pliku STYCZEŃ 2025 w kolumnie B, tam są zapisane i plik zamykany.
Potem odpalam plik ROZLICZENIA Z KLIENTAMI, tam po otwarciu aktualizują się wartości w komórkach. Jeżeli w pliku STYCZEŃ "Nowak" będzie 3x to w pliku ROZLICZENIA Z KLIENTAMI w danej komórce zamiast np. 0 będzie 3.
Chciałbym żeby oprócz tego, że po uruchomieniu pliku ROZLICZENIA Z KLIENTAMI zmieniała się wartość to żeby jeszcze mnie informowało gdzie się zmieniło coś, że na przykład Nowaków w kolumnie B było dwóch, a został dopisany jeszcze jeden więc zmieniło się z 2 na 3.
- Załączniki
-
- STYCZEŃ 2025.ods
- (15.51 KiB) Pobrany 14 razy
-
- ROZLICZENIA Z KLIENTAMI — kopia.ods
- (38.73 KiB) Pobrany 11 razy
Ostatnio zmieniony pt sty 10, 2025 3:50 pm przez divertalive, łącznie zmieniany 1 raz.
Libre Office 7.4 na Windows 10 PRO
-
- Posty: 13
- Rejestracja: śr sie 07, 2024 4:29 pm
Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek
U mnie w przypadku plików które wysłałem do testowania ścieżka do pliku styczeń 2025 to : =SUMA(JEŻELI(CZY.LICZBA(SZUKAJ.TEKST(M2;PODSTAW(PODSTAW(PODSTAW(PODSTAW(PODSTAW(PODSTAW(PODSTAW(PODSTAW(PODSTAW(LITERY.MAŁE('file:///C:/Users/Dell/Desktop/TEST/STYCZEŃ 2025.ods'#$Arkusz1.B$1:B$300);"ą";"a"); "ć";"c");"ę";"e");"ł";"l");"ń";"n");"ó";"o");"ś";"s");"ź";"z");"ż";"z"))); 1; 0))
Po tym jak to wkleje, wciskam (CTRL+SHIFT+ENTER)
Po tym jak to wkleje, wciskam (CTRL+SHIFT+ENTER)
Libre Office 7.4 na Windows 10 PRO
Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek
W tym problemie jest wiele wątków do rozwiązania. Wynikają one, jak sądzę, z nieprzemyślanego podejścia do tematu.
Jak chociażby hardcorowa formuła podmieniająca wszystkie polskie litery na łacińskie odpowiedniki. Chodziło zapewne o to, aby uniknąć błędnych obliczeń gdy ktoś jednak niechcący wpisze "s" zamiast "ś" i nazwisko nie zostanie rozpoznane.
Tutaj raczej należałoby zapewnić, że dane (nazwisko) klienta zawsze zostaną wprowadzone prawidłowo.
Zakładam, że plik "Rozliczenia z klientami" zawiera w kolumnie "Imię i nazwisko" identyfikacje jednego klienta. Czyli kolumna ta zawiera niepowtarzające się dane klientów. I nowego klienta najpierw wpisuje się do tego pliku.
Tu zresztą pojawia się kolejny problem. Nazwisko Nowak, jakie podałeś w przykładzie, jest akurat najczęściej występującym nazwiskiem w Polsce. Nietrudno zatem wyobrazić sobie, że wśród klientów pojawić się może kilku Nowaków, Jabłonowskich czy Kowalskich. Do wyszukiwania klienta służy wyłącznie nazwisko (na dodatek z podmienionymi polskimi literami). Jak zatem odróżnić od siebie osoby o nazwiskach np. Kopeć i Kopec, albo Jan Kopec i Paulina Kopec? Stąd wniosek, że należałoby identyfikować klienta także przez imię, które notabene także może się powtórzyć. Najlepiej byłoby jednak identyfikować klienta przez indywidualny identyfikator. Pomijając jednak ten fakt, jeśli plik rozliczeniowy zawiera pełny wykaz klientów, to dlaczego nie wprowadzić do pliku "Styczeń 2025" i dalszych mu odpowiadających, sprawdzania poprawności danych, poprzez możliwość wyboru klienta tylko z rozwijanej listy? Wówczas na pewno zostanie wprowadzony tylko tekst zgodny z oficjalnym wykazem. A to z kolei oznacza, że nie trzeba będzie wyodrębniać i przekształcać pojedynczego nazwiska.
Powiązania między plikami realizowane są poprzez formułę łącznikową w postaci 'file:///ścieżka dostępu/plik.ods'#Arkusz1.adres. Ten sposób oznacza, że dane są pobierane tylko w momencie otwierania pliku a później wyłącznie na żądanie. Z twego opisu wynika, że "Rozliczenia z klientami" będą otwierane dopiero po zamknięciu pliku "miesiąc rok". To oznacza, że potrzebne będzie tylko jednokrotne połączenie z danymi zewnętrznymi.
Taki scenariusz preferuje rozwiązanie zaproponowane w mojej drugiej propozycji.
Sama formuła obliczająca liczbę wystąpień klienta (w pliku "Rozliczenia...") jest dużo prostsza i może wyglądać tak:
=LICZ.JEŻELI('file:///ścieżka do pliku/STYCZEŃ 2025.ods'#$Arkusz1.$B$2:$B$277;C2). Zwróć uwagę na to, że możesz wyszukiwać pełne ciągi, bo w pliku "Styczeń 2025" nazwy klienta są na pewno zgodne z tymi zapisanymi w pliku "Rozliczenia...".
Zostawiam ci to pod rozwagę.
Piszesz, że używasz najnowszego LO, już od dawna jest w nim funkcja REGEX(), o której zamieściłem informacje na forum. By wyodrębnić nazwisko klienta, można skorzystać właśnie z niej. W taki sposób REGEX(C2;"\w+$"). Wrażenie regularne oznacza: wyodrebnij ostatni wyraz znajdujący się w komórce C2.
Jak chociażby hardcorowa formuła podmieniająca wszystkie polskie litery na łacińskie odpowiedniki. Chodziło zapewne o to, aby uniknąć błędnych obliczeń gdy ktoś jednak niechcący wpisze "s" zamiast "ś" i nazwisko nie zostanie rozpoznane.
Tutaj raczej należałoby zapewnić, że dane (nazwisko) klienta zawsze zostaną wprowadzone prawidłowo.
Zakładam, że plik "Rozliczenia z klientami" zawiera w kolumnie "Imię i nazwisko" identyfikacje jednego klienta. Czyli kolumna ta zawiera niepowtarzające się dane klientów. I nowego klienta najpierw wpisuje się do tego pliku.
Tu zresztą pojawia się kolejny problem. Nazwisko Nowak, jakie podałeś w przykładzie, jest akurat najczęściej występującym nazwiskiem w Polsce. Nietrudno zatem wyobrazić sobie, że wśród klientów pojawić się może kilku Nowaków, Jabłonowskich czy Kowalskich. Do wyszukiwania klienta służy wyłącznie nazwisko (na dodatek z podmienionymi polskimi literami). Jak zatem odróżnić od siebie osoby o nazwiskach np. Kopeć i Kopec, albo Jan Kopec i Paulina Kopec? Stąd wniosek, że należałoby identyfikować klienta także przez imię, które notabene także może się powtórzyć. Najlepiej byłoby jednak identyfikować klienta przez indywidualny identyfikator. Pomijając jednak ten fakt, jeśli plik rozliczeniowy zawiera pełny wykaz klientów, to dlaczego nie wprowadzić do pliku "Styczeń 2025" i dalszych mu odpowiadających, sprawdzania poprawności danych, poprzez możliwość wyboru klienta tylko z rozwijanej listy? Wówczas na pewno zostanie wprowadzony tylko tekst zgodny z oficjalnym wykazem. A to z kolei oznacza, że nie trzeba będzie wyodrębniać i przekształcać pojedynczego nazwiska.
Powiązania między plikami realizowane są poprzez formułę łącznikową w postaci 'file:///ścieżka dostępu/plik.ods'#Arkusz1.adres. Ten sposób oznacza, że dane są pobierane tylko w momencie otwierania pliku a później wyłącznie na żądanie. Z twego opisu wynika, że "Rozliczenia z klientami" będą otwierane dopiero po zamknięciu pliku "miesiąc rok". To oznacza, że potrzebne będzie tylko jednokrotne połączenie z danymi zewnętrznymi.
Taki scenariusz preferuje rozwiązanie zaproponowane w mojej drugiej propozycji.
Sama formuła obliczająca liczbę wystąpień klienta (w pliku "Rozliczenia...") jest dużo prostsza i może wyglądać tak:
=LICZ.JEŻELI('file:///ścieżka do pliku/STYCZEŃ 2025.ods'#$Arkusz1.$B$2:$B$277;C2). Zwróć uwagę na to, że możesz wyszukiwać pełne ciągi, bo w pliku "Styczeń 2025" nazwy klienta są na pewno zgodne z tymi zapisanymi w pliku "Rozliczenia...".
Zostawiam ci to pod rozwagę.
Piszesz, że używasz najnowszego LO, już od dawna jest w nim funkcja REGEX(), o której zamieściłem informacje na forum. By wyodrębnić nazwisko klienta, można skorzystać właśnie z niej. W taki sposób REGEX(C2;"\w+$"). Wrażenie regularne oznacza: wyodrebnij ostatni wyraz znajdujący się w komórce C2.
AOO 4.1.15, LO 24.8.5 (x64) na Windows 11 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
-
- Posty: 13
- Rejestracja: śr sie 07, 2024 4:29 pm
Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek
https://zapodaj.net/plik-kSmQRYfWpU
Po wpisaniu funkcji =LICZ.JEŻELI formuła nie zlicza ilość "Nowak" występujących w kolumnie B.
Po wpisaniu funkcji =LICZ.JEŻELI formuła nie zlicza ilość "Nowak" występujących w kolumnie B.
Libre Office 7.4 na Windows 10 PRO
Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek
Super;
pokazałbyś jeszcze czego szukasz (tzn. wartość komórki C2, bo akurat jej nie widać)
a także gdzie szukasz (tj. choćby fragment kolumny B z pliku "/Users/Dell/Desktop/TEST/STYCZEŃ 2025.ods")
Nieprawidłowe działanie tak prostej formuły jest możliwe, ale bardzo mało prawdopodobne. Raczej chodzi o niezrozumienie sposobu jej użycia.
Dodatkowo,
* załączniki w postaci obrazków w standardowych formatach lepiej jest wstawiać bezpośrednio do postu niż na zewnętrzne serwisy;
* lepiej jest unikać załączników graficznych na korzyść formatów dających możliwosć sprawdzenia przyczyn — w tym przypadku .ods.
pokazałbyś jeszcze czego szukasz (tzn. wartość komórki C2, bo akurat jej nie widać)
a także gdzie szukasz (tj. choćby fragment kolumny B z pliku "/Users/Dell/Desktop/TEST/STYCZEŃ 2025.ods")
Nieprawidłowe działanie tak prostej formuły jest możliwe, ale bardzo mało prawdopodobne. Raczej chodzi o niezrozumienie sposobu jej użycia.
Dodatkowo,
* załączniki w postaci obrazków w standardowych formatach lepiej jest wstawiać bezpośrednio do postu niż na zewnętrzne serwisy;
* lepiej jest unikać załączników graficznych na korzyść formatów dających możliwosć sprawdzenia przyczyn — w tym przypadku .ods.
JJ
LO (25.2|24.8) ∙ Python (3.12|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (25.2|24.8) ∙ Python (3.12|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek
Możesz użyć makra z `CellValueChanged` do porównania starej i nowej wartości. kod:divertalive pisze: ↑sob sty 04, 2025 10:34 am Witam,
kombinowałem, ale ciągle wyskakuje mi jakiś błąd... Czy ktoś mógłby pomóc w przygotowaniu makra jak w temacie? W pliku w komórkach N2:AE50 występują wartości liczbowe (1,2,3,4...), potrzebuję informacji w sytuacji, kiedy jakaś wartość liczbowa w komórce ulegnie zmianie np.
komórka N2 "wartość uległa zmianie; było 1, a jest 2"
W zdarzeniach dokumentu nie ma np. czegoś takiego jak "zmiana wartości".
Version: 24.8.4.2 (X86_64) / LibreOffice Community
Build ID: bb3cfa12c7b1bf994ecc5649a80400d06cd71002
CPU threads: 4; OS: Windows 10 X86_64 (10.0 build 19045); UI render: Skia/Raster; VCL: win
Locale: pl-PL (pl_PL); UI: pl-PL
Calc: CL threaded
```basic
Sub OnCellValueChanged(oEvent As Object)
Dim oCell As Object
oCell = oEvent.Source
If oCell.getValue() <> oCell.getOldValue() Then
MsgBox "Wartość w " & oCell.AbsoluteName & " zmieniła się: było " & oCell.getOldValue() & ", a jest " & oCell.getValue()
End If
End Sub
```
To porównuje wartości i wyświetla komunikat, gdy coś się zmieni.
OpenOffice 3.1 na Windows Vista