Makro na informację o zmianie wartości liczbowej w zakresie komórek

Dyskusje dotyczące tworzenia makropoleceń, pisania skryptów oraz programowania przy użyciu UNO
divertalive
Posty: 13
Rejestracja: śr sie 07, 2024 4:29 pm

Makro na informację o zmianie wartości liczbowej w zakresie komórek

Post autor: divertalive »

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
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.
Libre Office 7.4 na Windows 10 PRO
Awatar użytkownika
Jermor
Posty: 2433
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek

Post autor: Jermor »

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ś
divertalive pisze: sob sty 04, 2025 10:34 am kombinowałem, ale ciągle wyskakuje mi jakiś błąd...
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.
divertalive
Posty: 13
Rejestracja: śr sie 07, 2024 4:29 pm

Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek

Post autor: divertalive »

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.

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
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.
Ostatnio zmieniony wt sty 07, 2025 11:03 am przez Jan_J, łącznie zmieniany 1 raz.
Powód: Znaczniki [code] obejmujące kod programistyczny
Libre Office 7.4 na Windows 10 PRO
Awatar użytkownika
Jermor
Posty: 2433
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek

Post autor: Jermor »

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".
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.
Jan_J
Posty: 4617
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek

Post autor: Jan_J »

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.
JJ
LO (25.2|24.8) ∙ Python (3.12|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
divertalive
Posty: 13
Rejestracja: śr sie 07, 2024 4:29 pm

Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek

Post autor: divertalive »

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".
Bardzo dziękuję Ci za Twój poświęcony czas. Po uruchomieniu Listener, wyskakuje błąd:

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
divertalive
Posty: 13
Rejestracja: śr sie 07, 2024 4:29 pm

Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek

Post autor: divertalive »

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. ;/
Libre Office 7.4 na Windows 10 PRO
divertalive
Posty: 13
Rejestracja: śr sie 07, 2024 4:29 pm

Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek

Post autor: divertalive »

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
divertalive
Posty: 13
Rejestracja: śr sie 07, 2024 4:29 pm

Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek

Post autor: divertalive »

Jan_J pisze: śr sty 08, 2025 11:37 am 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.

Powyżej udostępniłem kod z próbą przypisania tych zdarzeń, ale dalej zong
Libre Office 7.4 na Windows 10 PRO
Awatar użytkownika
Jermor
Posty: 2433
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek

Post autor: Jermor »

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...".
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.
divertalive
Posty: 13
Rejestracja: śr sie 07, 2024 4:29 pm

Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek

Post autor: divertalive »

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...".
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.
Libre Office 7.4 na Windows 10 PRO
divertalive
Posty: 13
Rejestracja: śr sie 07, 2024 4:29 pm

Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek

Post autor: divertalive »

divertalive pisze: czw sty 09, 2025 3:12 pm
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...".
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.
Zaznaczyłem zakres komórek N2:AE50 i nazwałem to zaznaczenie "zakres".

https://zapodaj.net/plik-e8ddzZrvEm tak to wygląda u mnie
Libre Office 7.4 na Windows 10 PRO
divertalive
Posty: 13
Rejestracja: śr sie 07, 2024 4:29 pm

Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek

Post autor: divertalive »

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...".
U Ciebie w pliku działa to świetnie, tylko wartość zmienia się ręcznie przez zmianę wartości liczbowej mnożnika.

(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
Awatar użytkownika
Jermor
Posty: 2433
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek

Post autor: Jermor »

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.
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.
Jan_J
Posty: 4617
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek

Post autor: Jan_J »

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.
JJ
LO (25.2|24.8) ∙ Python (3.12|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
divertalive
Posty: 13
Rejestracja: śr sie 07, 2024 4:29 pm

Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek

Post autor: divertalive »

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.
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
divertalive
Posty: 13
Rejestracja: śr sie 07, 2024 4:29 pm

Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek

Post autor: divertalive »

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)
Libre Office 7.4 na Windows 10 PRO
Awatar użytkownika
Jermor
Posty: 2433
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek

Post autor: Jermor »

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.
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.
divertalive
Posty: 13
Rejestracja: śr sie 07, 2024 4:29 pm

Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek

Post autor: divertalive »

https://zapodaj.net/plik-kSmQRYfWpU

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
Jan_J
Posty: 4617
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek

Post autor: Jan_J »

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.
JJ
LO (25.2|24.8) ∙ Python (3.12|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Papas22
Posty: 1
Rejestracja: śr sty 29, 2025 4:28 pm

Re: Makro na informację o zmianie wartości liczbowej w zakresie komórek

Post autor: Papas22 »

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
Możesz użyć makra z `CellValueChanged` do porównania starej i nowej wartości. kod:

```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
ODPOWIEDZ