Wyszukiwanie wartości i przepisywanie ich w inne miejsce.
-
- Posty: 8
- Rejestracja: wt paź 02, 2012 3:19 pm
Wyszukiwanie wartości i przepisywanie ich w inne miejsce.
Witam
Chciałbym aby Calc znalazł mi wartości (a w zasadzie jedną wartość bo tylko tyle tam będzie) <> 0 w komórkach A1-A5 oraz przepisał znalezioną wartość bądź jej adres w inne miejsce.
Czy będzie problemem jeśli wartości A1-A5 nie będą cyframi?
Próbowałem już wielu kombinacji z ZNAJDŹ, WYSZUKAJ,JEŻELI,INDEKS...i już skończyły mi się pomysły
Dziękuję za pomoc.
Chciałbym aby Calc znalazł mi wartości (a w zasadzie jedną wartość bo tylko tyle tam będzie) <> 0 w komórkach A1-A5 oraz przepisał znalezioną wartość bądź jej adres w inne miejsce.
Czy będzie problemem jeśli wartości A1-A5 nie będą cyframi?
Próbowałem już wielu kombinacji z ZNAJDŹ, WYSZUKAJ,JEŻELI,INDEKS...i już skończyły mi się pomysły
Dziękuję za pomoc.
OpenOffice 3.1 na Windows Vista
Re: Wyszukiwanie wartości i przepisywanie ich w inne miejsce
Jeżeli będą dodatnie, to wystarczy =max(obszar)
Jeżeli nie, to ja bym wyszukiwał coś <> 0. Pomogą mi wyrażenia regularne.
=wyszukaj.pionowo(wzorzec;obszar;1;0)
gdzie wzorzec: wyrażenie regularne opisujące wzorzec zawierający coś innego niż 0;
obszar: adres kolumny lub kolumn danych;
1: numer kolumny z której należy wybierać;
0: informacja że kolumna jest nieuporządkowana.
Jako wzorzec podałbym "^.*[^0].*$" co oznacza “dowolne znaki, wśród których jest coś innego niż 0”. Takiemu wzorcowi będzie wszystko jedno, czy chodzi o liczbę, czy o tekst.
Jeżeli nie, to ja bym wyszukiwał coś <> 0. Pomogą mi wyrażenia regularne.
=wyszukaj.pionowo(wzorzec;obszar;1;0)
gdzie wzorzec: wyrażenie regularne opisujące wzorzec zawierający coś innego niż 0;
obszar: adres kolumny lub kolumn danych;
1: numer kolumny z której należy wybierać;
0: informacja że kolumna jest nieuporządkowana.
Jako wzorzec podałbym "^.*[^0].*$" co oznacza “dowolne znaki, wśród których jest coś innego niż 0”. Takiemu wzorcowi będzie wszystko jedno, czy chodzi o liczbę, czy o tekst.
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: 8
- Rejestracja: wt paź 02, 2012 3:19 pm
Re: Wyszukiwanie wartości i przepisywanie ich w inne miejsce
Dziękuję za pomoc.
Mam teraz kolejny problem.
Dane w moim Calcu są automatycznie wstawiane z pliku index.htm Są tam podane ilości procentowe w formie "24.56%" i mój problem polega na tym że żeby dokonywać dalszych obliczeń muszę pozbyć się znaku "%"
Zrobiłem coś takiego:
gdzie H11 to wartość 24.56%
T1 to znak, który ma zostać znaleziony w tym wypadku jest to "%".
Przy dużej ilości danych jest to bardzo pracochłonne ale działa. Piszę o tym nie bez powodu gdyż wiąże się to z kolejnym problemem.
Kolejny problem to kropka oddzielająca części dzisiętne. Próbowałem już wielu kombinacji jednak żadna nie przynosi skutku.
Czy da się coś zrobic aby Calc jednocześnie usuwał znak "%" i zamieniał "." na "," ?
Jest to o tyle dla mnie trudne bo wartości procentowe nie mają takiej samej ilości znaków (1,2% - 24,43% - 8,12%)
Czyli jeśli w komórce A1 podany jest procent w formie 24.56% to chciałbym aby w komórce np. D1 było to już 24,56.
Dziękuję z góry za odpowiedź.
edit. Mimo że kompletnie nie znam się na Calc'u ale jakoś udało mi się rozwiązać problem
Gdyby ktoś potrzebował to:
i
Mam teraz kolejny problem.
Dane w moim Calcu są automatycznie wstawiane z pliku index.htm Są tam podane ilości procentowe w formie "24.56%" i mój problem polega na tym że żeby dokonywać dalszych obliczeń muszę pozbyć się znaku "%"
Zrobiłem coś takiego:
Kod: Zaznacz cały
=ZASTĄP(H11;SZUKAJ.TEKST(T1;H11);1;"")
T1 to znak, który ma zostać znaleziony w tym wypadku jest to "%".
Przy dużej ilości danych jest to bardzo pracochłonne ale działa. Piszę o tym nie bez powodu gdyż wiąże się to z kolejnym problemem.
Kolejny problem to kropka oddzielająca części dzisiętne. Próbowałem już wielu kombinacji jednak żadna nie przynosi skutku.
Czy da się coś zrobic aby Calc jednocześnie usuwał znak "%" i zamieniał "." na "," ?
Jest to o tyle dla mnie trudne bo wartości procentowe nie mają takiej samej ilości znaków (1,2% - 24,43% - 8,12%)
Czyli jeśli w komórce A1 podany jest procent w formie 24.56% to chciałbym aby w komórce np. D1 było to już 24,56.
Dziękuję z góry za odpowiedź.
edit. Mimo że kompletnie nie znam się na Calc'u ale jakoś udało mi się rozwiązać problem

Gdyby ktoś potrzebował to:
Kod: Zaznacz cały
=PODSTAW(A1;".";",")
Kod: Zaznacz cały
=PODSTAW(PODSTAW(A1;".";",");"%";"")
OpenOffice 3.1 na Windows Vista
Re: Wyszukiwanie wartości i przepisywanie ich w inne miejsce
Tak, jeżeli % i . występują tylko w liczbach, to masz rację. Ale takie podejście może pokiereszować inne dane. Miejmy nadzieję, że w twoim przypadku taki problem nie występuje.
Ogólniejsze rozwiązanie można uzyskać przy pomocy wyrażeń regularnych (RE) na kilka sposobów:
1. Zamiana przy użyciu RE (znajdź i zamień/ [x] wyr. regularne): ([0-9]+)\.([0-9]+)% → $1,$2
2? Funkcje Calca -- chyba nie ma takiej, która by to zrobiła równie łatwo. W funkcjach wyszukujących i zliczających da się użyć składni RE, ale nie w zastąp().
3. Można by se taką funkcję napisać, ale nie w Basicu, bo on nie ma biblioteki do wyrażeń regularnych. W Pythonie jest to sprawa banalna(pomijając sprawę, że tak otrzymana wynikowa wartość będzie tekstem zamiast liczbą), jednak trzeba by ją obudować dodatkowym kodem, by mogła służyć jako funkcja w formułach Calca.
4. Makropolecenie w Pythonie pisze się dużo prościej niż funkcję dla Calca.
Ogólniejsze rozwiązanie można uzyskać przy pomocy wyrażeń regularnych (RE) na kilka sposobów:
1. Zamiana przy użyciu RE (znajdź i zamień/ [x] wyr. regularne): ([0-9]+)\.([0-9]+)% → $1,$2
2? Funkcje Calca -- chyba nie ma takiej, która by to zrobiła równie łatwo. W funkcjach wyszukujących i zliczających da się użyć składni RE, ale nie w zastąp().
3. Można by se taką funkcję napisać, ale nie w Basicu, bo on nie ma biblioteki do wyrażeń regularnych. W Pythonie jest to sprawa banalna
Kod: Zaznacz cały
import re
wzorzec = re.compile("\\w([0-9]+)\\.([0-9]+)%\\w")
wynik = '\\1,\\2'
def zamien(tekst):
return re.sub(wzorzec, wynik, tekst)
4. Makropolecenie w Pythonie pisze się dużo prościej niż funkcję dla Calca.
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: 8
- Rejestracja: wt paź 02, 2012 3:19 pm
Re: Wyszukiwanie wartości i przepisywanie ich w inne miejsce
No i wykrakałeś, po tym jak pododawałem wszędzie PODSTAW to nie mogę nic z tymi danymi zrobić,ani pomnożyć ani dodać...looknąłem do Excela i tam wszystko działa hm.
I co teraz?

I co teraz?
Dla osoby,która nie ma pojęcia o Calcu - niekoniecznie4. Makropolecenie w Pythonie pisze się dużo prościej niż funkcję dla Calca.

OpenOffice 3.1 na Windows Vista
Re: Wyszukiwanie wartości i przepisywanie ich w inne miejsce
Może to makro ci pomoże, dostosuj je do swoich potrzeb. Zmianie ulegną dane w kolumnie D, czyli potrzeba przed uruchomieniem makra skopiować dane do kolumny D.
Kod: Zaznacz cały
Sub Znajdz_Zmien
Dim Doc As Object
Dim Zeszyt As Object
Dim Zmien as object
Dim Kolumna As Object
Doc = ThisComponent
Zeszyt = Doc.Sheets(0)'Pierwszy arkusz
Kolumna = Zeszyt.Columns(3)'Kolumna D
Zmien = kolumna.createReplaceDescriptor
Zmien.SearchRegularExpression = True
Zmien.SearchString = "\%"'Poszukiwany znak procentu
Zmien.ReplaceString = ""
Kolumna.replaceAll(Zmien)'Usuwany procent
Zmien.SearchString = "\."'Szukana kropka
Zmien.ReplaceString = ","''zmiana na przecinek
Kolumna.replaceAll(Zmien)'Zmiana
End Sub
LibreOffice 5.1.2.2 Ubuntu 16 LTS
Re: Wyszukiwanie wartości i przepisywanie ich w inne miejsce
Bo Excel ma (dość ohydny) zwyczaj traktowania tekstu wyglądającego jak liczba jako liczbę. Calc niestety nie jest konsekwentny, ale bardziej rygorystyczny niż Excel.TheNaturat pisze:[...]looknąłem do Excela i tam wszystko działa hm.[...]
Zrób z tekstu liczbę za pomocą funkcji value() -- po polsku wartość().I co teraz?
Makro w Pythonie dla Calca pisze się mimo wszystko o niebo łatwiej niż funkcję w Pythonie do użycia w Calcu.Dla osoby,która nie ma pojęcia o Calcu - niekoniecznie4. Makropolecenie w Pythonie pisze się dużo prościej niż funkcję dla Calca.
@belstar
co prawda Basic nie wspiera RE na poziome biblioteki standardowej, ale pokazałeś, jak ich użyć w API OpenOffice'a. Dzięki za sugestię. (Chociaż ten sposób też wymaga napisania makra; w funkcji nadającej się do użycia w formułach tak się nie da.)
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: Wyszukiwanie wartości i przepisywanie ich w inne miejsce
Podczas dalszych zabaw z twoim problemem stworzyłem bardzo prostą funkcje użytkownika (to taka co działa jak funkcje wbudowane w arkusz).
Do wywołania funkcji w komórce wpisz np.
Argument (tu "A1") musi być tekstem, czyli 2.55% lub 2.55abc. Usunie znaki z końca (procent lub inne litery) i zamieni kropkę w przecinek, Ograniczeniem jest to że znaki reprezentujące liczby muszą być na początku tekstu.
Przykłady:
Kiedy argument będzie liczbą, funkcja potraktuje go dziwnie, usunie przecinek i połączy liczby(coś jak liczba * 100)
Nie mam pojęcia jak zamuli program przy bardzo dużej ilości danych (zmienna Double).
Kod: Zaznacz cały
Function Zmien(tekst As String) As Double
Zmien = val(tekst)
End Function
Kod: Zaznacz cały
Zmien(A1)
Przykłady:
Kod: Zaznacz cały
2.55 ---> 2,55
2.55% --->2,55
2.55abc--->2,55
2qwe45--->2
Kod: Zaznacz cały
124,55--->12455
LibreOffice 5.1.2.2 Ubuntu 16 LTS
-
- Posty: 8
- Rejestracja: wt paź 02, 2012 3:19 pm
Re: Wyszukiwanie wartości i przepisywanie ich w inne miejsce
Uklony Panowie za pomoc.
Ale mam jeszcze jedno i chyba juz ostatnie wyzwanie.
Zalozmy ze:
W komorke A1 wklejam jakies dane z internetu.
Komorka B1 jest wynikiem tych danych.
Natomiast w komorce B2 chcialbym aby Calc wpisywal dane poprzednich obliczen, czyli jaki byl wynik zanim dane w A1 zostaly zaktualizowane.
Czyli w momencie kiedy wklejam nowe dane do A1, calc je oblicza, przenosi B1 do B2 i wstawia nowy wynik do B1.
Dziekuje za odpowiedzi.
Ale mam jeszcze jedno i chyba juz ostatnie wyzwanie.
Zalozmy ze:
W komorke A1 wklejam jakies dane z internetu.
Komorka B1 jest wynikiem tych danych.
Natomiast w komorce B2 chcialbym aby Calc wpisywal dane poprzednich obliczen, czyli jaki byl wynik zanim dane w A1 zostaly zaktualizowane.
Czyli w momencie kiedy wklejam nowe dane do A1, calc je oblicza, przenosi B1 do B2 i wstawia nowy wynik do B1.
Dziekuje za odpowiedzi.
OpenOffice 3.1 na Windows Vista
Re: Wyszukiwanie wartości i przepisywanie ich w inne miejsce
Witam
Wykorzystaj poniższe makra
Makro addlistener włącza ono nasłuch na komórkę A1, po zmianie jej zawartości nasłuch uruchamia makro MyApp_Modified().
Makro addlistener musisz uruchomić przy każdorazowym otwieraniu dokumentu do edycji (Tylko raz – bardzo ważne, najlepiej przypisz makro do zdarzeń dokumentu).
Występuje tutaj jeden problem bo ty potrzebujesz makra, które by zaczęło działać przed zmianą zawartości komórki B1 (pobrać starą zawartość i wkleić ją do komórki B2), a to działa po wystąpieniu zdarzeniu. Rozwiązaniem tego może być zrezygnowanie z obliczeń za pomocą formuł z komórki B1 i przeniesienie tychże do makra na przykład tak:
ThisComponent.Sheets(0) – pierwszy arkusz
getCellByPosition(0, 0).value – zawartość liczbowa z komórki A1
Pozdrawiam
Wykorzystaj poniższe makra
Kod: Zaznacz cały
Global oListener As Object
Global ocell as object
Sub Remove_Listener
thiscomponent.sheets(0).getcellrangebyname("A1").removemodifyListener(oListener)
End Sub
Sub addlistener
ocell=thiscomponent.sheets(0).getcellrangebyname("A1")
oListener = CreateUnoListener( "MyApp_", "com.sun.star.util.XModifyListener" )
ocell.addmodifylistener(olistener)
End Sub
Sub MyApp_disposing(oEvent)
msgbox "disposing of the listener"
End Sub
Sub MyApp_Modified(oEvent)
'tu wpisz swoje instrukcje
End Sub
Makro addlistener musisz uruchomić przy każdorazowym otwieraniu dokumentu do edycji (Tylko raz – bardzo ważne, najlepiej przypisz makro do zdarzeń dokumentu).
Występuje tutaj jeden problem bo ty potrzebujesz makra, które by zaczęło działać przed zmianą zawartości komórki B1 (pobrać starą zawartość i wkleić ją do komórki B2), a to działa po wystąpieniu zdarzeniu. Rozwiązaniem tego może być zrezygnowanie z obliczeń za pomocą formuł z komórki B1 i przeniesienie tychże do makra na przykład tak:
Kod: Zaznacz cały
Sub MyApp_Modified(oEvent)
Dim Twoja_Formula As String
Dim Stare_Dane
Stare_Dane = ThisComponent.Sheets(0).getCellByPosition(1,0).string
Twoja_Formula = "=PODSTAW(A1;""."";"","")"
ThisComponent.Sheets(0).getCellByPosition(1,0).FormulaLocal =Twoja_Formula
ThisComponent.Sheets(0).getCellByPosition(1,0).string = _
ThisComponent.Sheets(0).getCellByPosition(1,0).string
'Kopiuje wartości tekstowe
ThisComponent.Sheets(0).getCellByPosition(1,1).string = Stare_Dane
'Kopiuje wartości liczbowe
' ThisComponent.Sheets(0).getCellByPosition(1,1).value = _
' ThisComponent.Sheets(0).getCellByPosition(1,0).value
End Sub
ThisComponent.Sheets(0) – pierwszy arkusz
getCellByPosition(0, 0).value – zawartość liczbowa z komórki A1
Pozdrawiam
LibreOffice 5.1.2.2 Ubuntu 16 LTS
-
- Posty: 8
- Rejestracja: wt paź 02, 2012 3:19 pm
Re: Wyszukiwanie wartości i przepisywanie ich w inne miejsce
Wszystko dziala
A co jesli chce aby przenosil bezposrednio z danej komorki?
Dane w A1 a w A2 poprzedni wynik?
I jeszcze jedno, przeniesiony wynik nie jest liczba, wyglada to tak " '54"
Na poczatku jest zawsze ten " ' ". Mozna to jakos usunac?

A co jesli chce aby przenosil bezposrednio z danej komorki?
Dane w A1 a w A2 poprzedni wynik?
I jeszcze jedno, przeniesiony wynik nie jest liczba, wyglada to tak " '54"
Na poczatku jest zawsze ten " ' ". Mozna to jakos usunac?
OpenOffice 3.1 na Windows Vista
Re: Wyszukiwanie wartości i przepisywanie ich w inne miejsce
Był to tylko szkic makra, by zachęcić cię do nauki Basica, wszystkie potrzebne informacje zostały podane.
Zamień procedurę MyApp_Modified() na poniższą:
Jest to odpowiedź na drugą część pytania, co do pierwszej przeanalizuj podany kod i spróbuj sam to wykombinować. Jedyne co trzeba zrobić to manipulować argumentami getCellByPosition(Kolumna,Wiersz) i typem danych String - Tekst, Value - Liczba. W razie gdybyś poległ na tym zadaniu, napisz.
Wspomniany przez ciebie apostrof reprezentuje dane tekstowe.
Zamień procedurę MyApp_Modified() na poniższą:
Kod: Zaznacz cały
Sub MyApp_Modified(oEvent)
Dim Stare_Dane_B
Dim Nowe_Dane_A
Stare_Dane_B = ThisComponent.Sheets(0).getCellByPosition(1,0).Value
ThisComponent.Sheets(0).getCellByPosition(1,1).value = Stare_Dane_B
Nowe_Dane_A = ThisComponent.Sheets(0).getCellByPosition(0,0).string
Nowe_Dane_A = val(Nowe_Dane_A)
ThisComponent.Sheets(0).getCellByPosition(1,0).value = Nowe_Dane_A
End Sub
Wspomniany przez ciebie apostrof reprezentuje dane tekstowe.
LibreOffice 5.1.2.2 Ubuntu 16 LTS
Re: Wyszukiwanie wartości i przepisywanie ich w inne miejsce
Da się przerobić to makro by działało na liście z arkusza tak jak te:
https://forum.openoffice.org/pl/forum/v ... =32&t=3438
?
https://forum.openoffice.org/pl/forum/v ... =32&t=3438
?
OpenOffice 4.1.3.2 na Windows 7