Wyszukiwanie wartości i przepisywanie ich w inne miejsce.

Użytkowanie arkusza kalkulacyjnego
TheNaturat
Posty: 8
Rejestracja: wt paź 02, 2012 3:19 pm

Wyszukiwanie wartości i przepisywanie ich w inne miejsce.

Post autor: TheNaturat »

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

Re: Wyszukiwanie wartości i przepisywanie ich w inne miejsce

Post autor: Jan_J »

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.
JJ
LO (25.2|24.8) ∙ Python (3.12|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
TheNaturat
Posty: 8
Rejestracja: wt paź 02, 2012 3:19 pm

Re: Wyszukiwanie wartości i przepisywanie ich w inne miejsce

Post autor: TheNaturat »

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:

Kod: Zaznacz cały

=ZASTĄP(H11;SZUKAJ.TEKST(T1;H11);1;"")
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 :D
Gdyby ktoś potrzebował to:

Kod: Zaznacz cały

=PODSTAW(A1;".";",")
i

Kod: Zaznacz cały

=PODSTAW(PODSTAW(A1;".";",");"%";"")
OpenOffice 3.1 na Windows Vista
Jan_J
Posty: 4617
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Wyszukiwanie wartości i przepisywanie ich w inne miejsce

Post autor: Jan_J »

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

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)

(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.
JJ
LO (25.2|24.8) ∙ Python (3.12|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
TheNaturat
Posty: 8
Rejestracja: wt paź 02, 2012 3:19 pm

Re: Wyszukiwanie wartości i przepisywanie ich w inne miejsce

Post autor: TheNaturat »

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?
4. Makropolecenie w Pythonie pisze się dużo prościej niż funkcję dla Calca.
Dla osoby,która nie ma pojęcia o Calcu - niekoniecznie :)
OpenOffice 3.1 na Windows Vista
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Wyszukiwanie wartości i przepisywanie ich w inne miejsce

Post autor: belstar »

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

Re: Wyszukiwanie wartości i przepisywanie ich w inne miejsce

Post autor: Jan_J »

TheNaturat pisze:[...]looknąłem do Excela i tam wszystko działa hm.[...]
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.
I co teraz?
Zrób z tekstu liczbę za pomocą funkcji value() -- po polsku wartość().
4. Makropolecenie w Pythonie pisze się dużo prościej niż funkcję dla Calca.
Dla osoby,która nie ma pojęcia o Calcu - niekoniecznie :)
Makro w Pythonie dla Calca pisze się mimo wszystko o niebo łatwiej niż funkcję w Pythonie do użycia w Calcu.

@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)
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Wyszukiwanie wartości i przepisywanie ich w inne miejsce

Post autor: belstar »

Podczas dalszych zabaw z twoim problemem stworzyłem bardzo prostą funkcje użytkownika (to taka co działa jak funkcje wbudowane w arkusz).

Kod: Zaznacz cały

Function Zmien(tekst As String) As Double
	Zmien = val(tekst)
End Function
Do wywołania funkcji w komórce wpisz np.

Kod: Zaznacz cały

Zmien(A1)
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:

Kod: Zaznacz cały

2.55 ---> 2,55
2.55% --->2,55
2.55abc--->2,55
2qwe45--->2
Kiedy argument będzie liczbą, funkcja potraktuje go dziwnie, usunie przecinek i połączy liczby(coś jak liczba * 100)

Kod: Zaznacz cały

124,55--->12455
Nie mam pojęcia jak zamuli program przy bardzo dużej ilości danych (zmienna Double).
LibreOffice 5.1.2.2 Ubuntu 16 LTS
TheNaturat
Posty: 8
Rejestracja: wt paź 02, 2012 3:19 pm

Re: Wyszukiwanie wartości i przepisywanie ich w inne miejsce

Post autor: TheNaturat »

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.
OpenOffice 3.1 na Windows Vista
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Wyszukiwanie wartości i przepisywanie ich w inne miejsce

Post autor: belstar »

Witam
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 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:

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
TheNaturat
Posty: 8
Rejestracja: wt paź 02, 2012 3:19 pm

Re: Wyszukiwanie wartości i przepisywanie ich w inne miejsce

Post autor: TheNaturat »

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?
OpenOffice 3.1 na Windows Vista
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Wyszukiwanie wartości i przepisywanie ich w inne miejsce

Post autor: belstar »

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ą:

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
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.
LibreOffice 5.1.2.2 Ubuntu 16 LTS
tomasss87
Posty: 5
Rejestracja: czw lis 26, 2015 1:31 pm

Re: Wyszukiwanie wartości i przepisywanie ich w inne miejsce

Post autor: tomasss87 »

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
?
OpenOffice 4.1.3.2 na Windows 7
ODPOWIEDZ