[SOLVED] Potrzebuje pomocy przy stworzeniu makra

Użytkowanie arkusza kalkulacyjnego
someone89
Posty: 10
Rejestracja: śr sie 14, 2019 7:10 pm

[SOLVED] Potrzebuje pomocy przy stworzeniu makra

Post autor: someone89 »

Witam.

Mam pewien pomysł który chce przelać na arkusz kalkulacyjny i kombinuje jak to zrobić i za bardzo mi nie wychodzi.

Wydaje mi się, że będą mi potrzebne dwie rzeczy:
1. Makro
2. Przycisk wykonujący makro ( wiem jak stworzyć przycisk z przypisanym makro )

Całość ma działać mniej więcej tak:

W kolumnie A w poszczególnych wierszach będą znajdować się jakieś liczby. Gdzieś z boku w arkuszu będzie przycisk który wywoła makro. Makro ma działać tak, że do wartości zaznaczonej komórki dodaje liczbę 1. Zaznaczam sobie odpowiednie wiersze, klikam na przycisk i w zaznaczonych komórkach wartości zwiększyły się o 1.

Kompletnie nie wiem jak do tego się zabrać. Jeżeli ktoś byłby tak miły i podrzucił mi pomysł jak takie makro stworzyć byłbym wdzięczny.
Ostatnio zmieniony śr sie 21, 2019 6:41 pm przez someone89, łącznie zmieniany 1 raz.
LibreOffice 6.0 na Windows 10
someone89
Posty: 10
Rejestracja: śr sie 14, 2019 7:10 pm

Re: Potrzebuje pomocy przy stworzeniu makra

Post autor: someone89 »

O dobry pomysł tylko mimo przypisania makra do podwójnego kliku jak klikam w dany wiersz z liczbą 2 razy to wchodzi do edycji wiersza.
LibreOffice 6.0 na Windows 10
Awatar użytkownika
Rafkus
Posty: 515
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Potrzebuje pomocy przy stworzeniu makra

Post autor: Rafkus »

Przez przypadek skasowałem moją poprzednią odpowiedź, więc dam ją jeszcze raz:

Kod: Zaznacz cały

Sub Aktywna_komorka
 Dim Aktywny As New com.sun.star.table.CellAddress
 Dim Arkusz, komorka  As Variant
   Aktywny = ThisComponent.CurrentSelection.cellAddress
   Arkusz = ThisComponent.getSheets().getByIndex(Aktywny.Sheet)
   komorka = Arkusz.getCellByPosition(Aktywny.Column , Aktywny.Row )
   komorka.value = komorka.value + 1
End Sub 
Makro to można przypisać do zdarzenia arkusza (należy kliknąć prawym przyciskiem myszy na nazwie arkusza i wybrać Zdarzenie arkusza... i do wybranej akcji przypisać makro)
++++++++++
Po kolejnym przeczytaniu posta @someone89 zorientowałem się że chciał makro zmieniające wartości w jakimś zaznaczonym zakresie, a powyższe makro działa tyko na 1 komórce. Na zakresie danych będzie działało następujące makro:

Kod: Zaznacz cały

Sub aktywny_zakres  
 Dim zakres As New com.sun.star.table.CellRangeAddress
 Dim arkusz, komorka  As Variant
 
  zakres = ThisComponent.CurrentSelection.RangeAddress
  arkusz = ThisComponent.Sheets.getByIndex(zakres.Sheet)
  
  for i = zakres.StartColumn to zakres.EndColumn
    for j =  zakres.StartRow to zakres.EndRow
      komorka = arkusz.getCellByPosition(i , j )
      komorka.value = komorka.value + 1
    next j
  next i
End Sub
Uwaga: Makro działa tylko na pojedynczym zakresie tzn. działa jeśli są zaznaczone komórki np. B5:C10, nie będzie działać w przypadku jednoczesnego zaznaczenia np. A1:A8 oraz B3:B5
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Awatar użytkownika
Jermor
Posty: 2254
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Potrzebuje pomocy przy stworzeniu makra

Post autor: Jermor »

Jeśli pozwolisz @Rafkus to wtrącę jeszcze swoje trzy grosze.
Można wykorzystać tylko zakres zaznaczonego obszaru i makro może wówczas przyjąć taka postać

Kod: Zaznacz cały

Sub aktywny_zakres1 (optional przyrost as double)  
REM To makro modyfikuje tylko pierwszą kolumnę obszaru, bo chyba o to chodziło @someone89
REM wywołując je z parametrem można wskazać dowolny przyrost
If ismissing(przyrost) then przyrost=1
 ozakres = ThisComponent.CurrentSelection
REM ilekolumn=ozakres.columns.count 'wiersz będzie potrzebny gdy modyfikować trzeba wszystkie komórki zakresu.
 ilewierszy=ozakres.rows.count
 for i=0 to ilewierszy-1
    ozakres.getcellbyposition(0,i).value=ozakres.getcellbyposition(0,i).value+przyrost
 next i
End Sub
Co do innych uwag, już do @someone89. Jeśli umieścisz przycisk gdzieś z boku, to może on ci zniknąć gdy arkusz będzie przewijany. Lepiej więc przypisać makro do skrótu klawiaturowego albo (a może i) dodać swoją ikonkę do paska narzędziowego i jej także przypisać makro.
Jeśli jednak opcja "przycisk" jest ważna, to warto zablokować przynajmniej pierwszy wiersz arkusza i w tej zablokowanej części umieścić przycisk.
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 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.
someone89
Posty: 10
Rejestracja: śr sie 14, 2019 7:10 pm

Re: Potrzebuje pomocy przy stworzeniu makra

Post autor: someone89 »

Jermor poszedłem za twoim pomysłem i zablokowałem wiersze u góry tak jak radziłeś oraz przypisałem twoje makro do przycisku. Niestety po zaznaczeniu czy to jednego wiersza w kolumnie A czy kilku efekt zastosowania przycisku jest taki sam wywalając błąd: "Błąd uruchomieniowy języka BASIC. Nieprawidłowa wartość właściwości."
LibreOffice 6.0 na Windows 10
Awatar użytkownika
Jermor
Posty: 2254
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Potrzebuje pomocy przy stworzeniu makra

Post autor: Jermor »

Makro należy skopiować do kontenera makr. Jednak to nie to makro należy wywołać. Trzeba napisać sobie co najmniej jednolinijkowe makro np. takie

Kod: Zaznacz cały

Sub przycisk
aktywny_zakres1()
End Sub
I to własnie makro przypisać do przycisku.
Jeśli podprogram ma zdefiniowane parametry, to musi być wywołany z zewnętrznego modułu, w którym, wywołując podprogram, poda się także jego konkretne parametry. Przy wywołaniu można w nawiasach wpisać np 7 i o taką wartość nastąpią zmiany. Podprogram zapisem parametru z poprzedzającym Optional informuje, że podczas wywołania podprogramu można parametr pominąć.
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 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.
someone89
Posty: 10
Rejestracja: śr sie 14, 2019 7:10 pm

Re: Potrzebuje pomocy przy stworzeniu makra

Post autor: someone89 »

Dalej coś mi nie działa. Co prawda nie wywala błędu, ale też nie zmienia wartości. Załączyłem arkusz jakbyś mógł zobaczyć co robię źle i wytłumaczyć byłbym wdzięczny.

Z tego co napisałeś to zrozumiałem to tak, że najpierw tworzę makro, które ma wykonać daną czynność (w moim przypadku zmianę wartości) a następnie tworzę kolejne makro docelowe do przypisania pod przycisk w którym zamieszczam jakby odwołanie do pierwotnego makra podając jego nazwę. Nie wiem czy dobrze zrozumiałem co chciałeś mi przekazać.
Załączniki
Bez tytułu 1.ods
Arkusz z makrem
(12.43 KiB) Pobrany 136 razy
LibreOffice 6.0 na Windows 10
Awatar użytkownika
Jermor
Posty: 2254
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Potrzebuje pomocy przy stworzeniu makra

Post autor: Jermor »

U mnie wszystko działa. Prawdopodobnie w opcjach masz wyłączoną możliwość uruchamiania makr.
Proponuję przeczytanie tego opracowania https://yestok.pl/ooo/y58.php
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 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.
someone89
Posty: 10
Rejestracja: śr sie 14, 2019 7:10 pm

Re: Potrzebuje pomocy przy stworzeniu makra

Post autor: someone89 »

No faktycznie na pojedynczym wierszu działa jednak jak zaznaczę kilka to już wywala błąd jeżyka basic

Poprawka działa na pojedynczym i kilku z kolei pod rząd ale jak zostawię przerwę to już nie tzn A4 / A5 / A6 zadziała ale np. A4 / A6 już nie.
LibreOffice 6.0 na Windows 10
Awatar użytkownika
Jermor
Posty: 2254
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Potrzebuje pomocy przy stworzeniu makra

Post autor: Jermor »

Konsekwentnie piszesz o zaznaczaniu wierszy, podczas gdy zaznaczasz komórki. To po pierwsze.
Po drugie, już @Rafkus w swoim poście napisał, że makro działa tylko na pojedynczym zaznaczonym obszarze. I tu się nic nie zmieniło. Jeśli zostaną zaznaczone dwa rozdzielone obszary wystąpi błąd języka. Ja, jak na razie nie wiem, jak obsłużyć kilka rozłącznych obszarów.
Na naszym forum może Belstar albo Jan_J.
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 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.
Awatar użytkownika
Jermor
Posty: 2254
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Potrzebuje pomocy przy stworzeniu makra

Post autor: Jermor »

No dobrze, poprawiłem to makro i zadziała ci na różnych obszarach.
Makro zawierało błąd. Poprawione jest w dalszym poście
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 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.
someone89
Posty: 10
Rejestracja: śr sie 14, 2019 7:10 pm

Re: Potrzebuje pomocy przy stworzeniu makra

Post autor: someone89 »

Dzięki wielkie! Działa tylko teraz jest tak że muszą być różne pod rząd nie zadziała hehe czyli widzę te makra nie są aż na tyle zaawansowane albo działa to tak albo tak... Nie da się by jedno i drugie było w jednym ale rozwiązałem to dwoma makrami i dwoma przyciskami i w zależności co będzie mi potrzebne tego przycisku użyje :)

Myślę, że to by było na tyle. Jakby coś to odkopie najwyżej temat :)

Dzięki jeszcze raz za pomoc.

A nie zauważyłem, że dałeś 2 odpowiedzi jedną pod drugą no ok.
LibreOffice 6.0 na Windows 10
Awatar użytkownika
Jermor
Posty: 2254
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Potrzebuje pomocy przy stworzeniu makra

Post autor: Jermor »

Poprawiony podprogram

Kod: Zaznacz cały

Sub aktywny_zakres1 (optional przyrost as double)  
REM To makro modyfikuje tylko pierwszą kolumnę obszaru, bo chyba o to chodziło @someone89
REM wywołując je z parametrem można wskazać dowolny przyrost
If ismissing(przyrost) then przyrost=1
ozakres = ThisComponent.CurrentSelection
If ozakres.supportsService("com.sun.star.sheet.SheetCellRanges") then
	ilezakresow=ozakres.getCount()
	For j=0 to ilezakresow-1
		owybor=ozakres.getByIndex(j)
		REM ilekolumn=owybor.columns.count 'wiersz będzie potrzebny gdy modyfikować trzeba wszystkie komórki zakresu.
		ilewierszy=owybor.rows.count
		for i=0 to ilewierszy-1
		    owybor.getcellbyposition(0,i).value=owybor.getcellbyposition(0,i).value+przyrost
		next i
	next j
Else
	REM ilekolumn=ozakres.columns.count 'wiersz będzie potrzebny gdy modyfikować trzeba wszystkie komórki zakresu.
	ilewierszy=ozakres.rows.count
	for i=0 to ilewierszy-1
	    ozakres.getcellbyposition(0,i).value=ozakres.getcellbyposition(0,i).value+przyrost
	next i
End If
End Sub
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 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.
someone89
Posty: 10
Rejestracja: śr sie 14, 2019 7:10 pm

Re: Potrzebuje pomocy przy stworzeniu makra

Post autor: someone89 »

Działa! Dzięki wielkie!

A teraz jeszcze takie pytanie.

Bo rozumiem, że takich makr może być wiele i mogą robić jednocześnie wiele operacji... a czy jedno może robić kilka rzeczy na raz? Czyli tak jak teraz klikam i dodaje mi konkretną wartość w zaznaczonych wierszach w kolumnie A... a czy jednocześnie mogłoby brać wartość z konkretnych wierszy w kolumnie F i ją kopiować tak by następnie dodać do wartości w kolumnie I?

Nie wiem może jest jakaś łatwiejsza opcja?

Ja wymyśliłem coś takiego poprzez funkcje zarejestruj makro (nie znam basic)

Do kolumny F wprowadziłem wartość przykładową 300. W kolumnie I jest 0. Jeżeli dam wykonaj makro z narzędzi wszystko działa prawidłowo dodaje aktualnie wpisaną kwotę w F do już istniejącej wartości w I. Problem zrobił się po przypisaniu tego do przycisku. Działa ale tylko z pierwotnie wpisaną kwotą w kolumnie F. Jak zmienię na inną to i tak dodaje taką jaka była poprzednio. Dziwne trochę to. No i działa tylko z jednym wierszem.

Jak to poprawić? I przypisać pod ten pierwotny przycisk by w pełni to zautomatyzować?

W dodatku za 1 razem przycisk nie działa nic nie wkleja dopiero jak ręcznie uruchomię makro to za kolejnym razem działa.

Moduł nazwałem sprzedaż a makro main

Kod: Zaznacz cały

REM  *****  BASIC  *****


sub Main
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$F$4"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

rem ----------------------------------------------------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ToPoint"
args3(0).Value = "$I$4"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args3())

rem ----------------------------------------------------------------------
dim args4(5) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Flags"
args4(0).Value = "V"
args4(1).Name = "FormulaCommand"
args4(1).Value = 1
args4(2).Name = "SkipEmptyCells"
args4(2).Value = false
args4(3).Name = "Transpose"
args4(3).Value = false
args4(4).Name = "AsLink"
args4(4).Value = false
args4(5).Name = "MoveMode"
args4(5).Value = 4

dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args4())


end sub
Załączniki
Bez tytułu 1.ods
(13.44 KiB) Pobrany 105 razy
LibreOffice 6.0 na Windows 10
Awatar użytkownika
Rafkus
Posty: 515
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Potrzebuje pomocy przy stworzeniu makra

Post autor: Rafkus »

someone89 pisze:
...a czy jedno może robić kilka rzeczy na raz? Czyli tak jak teraz klikam i dodaje mi konkretną wartość w zaznaczonych wierszach w kolumnie A... a czy jednocześnie mogłoby brać wartość z konkretnych wierszy w kolumnie F i ją kopiować tak by następnie dodać do wartości w kolumnie I?
Jest możliwe, poprawione makro @Jermora

Kod: Zaznacz cały

Sub aktywny_zakres1 (optional przyrost as double)  
REM To makro modyfikuje tylko pierwszą kolumnę obszaru, bo chyba o to chodziło @someone89
REM wywołując je z parametrem można wskazać dowolny przyrost
If ismissing(przyrost) then przyrost=1
owybor = ThisComponent.CurrentSelection
If owybor.supportsService("com.sun.star.sheet.SheetCellRanges") then
   ilezakresow=owybor.getCount()-1
Else ilezakresow = 0
End If

For j=0 to ilezakresow
   if ilezakresow>0 then ozakres=owybor.getByIndex(j)else ozakres=owybor
   REM ilekolumn=ozakres.columns.count 'wiersz będzie potrzebny gdy modyfikować trzeba wszystkie komórki zakresu.
   ilewierszy=ozakres.rows.count
   for i=0 to ilewierszy-1
       ozakres.getcellbyposition(0,i).value=ozakres.getcellbyposition(0,i).value+przyrost
       ozakres.getcellbyposition(8,i).value=ozakres.getcellbyposition(5,i).value+ozakres.getcellbyposition(8,i).value
   next i
next j
End Sub
Tylko że teraz musisz zaznaczać całe wiersze (lub zakres kolumn od A do I)
Albo kolejne udoskonalanie makra o możliwość rozszerzenia zaznaczonego zakresu....
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
someone89
Posty: 10
Rejestracja: śr sie 14, 2019 7:10 pm

Re: Potrzebuje pomocy przy stworzeniu makra

Post autor: someone89 »

@Rafkus dziękuje za kod jednakże coś nie działa. Coś robię chyba źle lub może nie zrozumiale napisałem co bym chciał osiągnąć wywołując te makro.

Po podmienieniu kodu makra na te zaproponowane przez Ciebie i zaznaczeniu przykładowo A4 I4 oraz F4 wyskakuje konsola z edycją makra i następującym błędem "Błąd uruchomieniowy języka BASIC.
Wystąpił wyjątek
Type: com.sun.star.lang.IndexOutOfBoundsException
Message: ."

Po wyjściu z konsoli co prawda do pozycji A4 dodał jeden, ale nie skopiował wartości wpisanej w I4 i nie dodał do wartości w F4.

Ogólnie zamysł jest tego taki. Klikam 1 przycisk wywołujący makro który dodaje zawsze wartość 1 do istniejącej wartości w zaznaczonym wierszu kolumny A lub też kilku wierszy w kolumnie A. Jednocześnie sprawdza te same wiersze w kolumnie I w której sobie ręcznie wpisuje aktualną cenę usługi/produktu/materiału whatever. Mając skopiowaną już tą wartość następnie sprawdza te same wiersze/wiersz w kolumnie F w celu dodania wartości z I do aktualnej wartości w F. Dzięki temu uzyskam konkretną sumę jaką wygenerowała dana usługa/produkt/materiał w całej historii sprzedaży.

Łatwo byłoby po prostu robić na zasadzie: w kolumnie F w wierszach wpisać przykładowo dla F1 "=(A1*I1)" w F2 "=(A2*I2)" itd i to by działało świetnie pod jednym warunkiem - gdyby cena wpisana do I była stała, a niestety będzie zmienna.

Jeżeli coś jest nie jasne mogę doprecyzować. Jeżeli nie da się tego zrobić w BASIC to trudno rozumiem, że każdy język ma swoje ograniczenia.

Można też rozpisać to na dwa osobne makra przypisane do osobnych przycisków. Jedno te zmieniające wartość w kolumnie A a drugie wykonujące działanie dodawania na wierszach z kolumny I i F. Nawet dwa przyciski będą większym udogodnieniem niż ręcznie to obliczać bo zwyczajnie mógłbym dodać przyciskiem ilość zapomnieć obliczyć wartości i już byłaby wpadka w obliczeniach.

Największym problemem jest to, że nie znam kompletnie BASIC... kod mi przekazujecie jest kompletnie mi nie zrozumiały i nie potrafię wyłapać w czym jest problem i konkretnie wam podać :(
Załączniki
Bez tytułu 1.ods
(13.87 KiB) Pobrany 102 razy
LibreOffice 6.0 na Windows 10
Awatar użytkownika
Rafkus
Posty: 515
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Potrzebuje pomocy przy stworzeniu makra

Post autor: Rafkus »

someone89 pisze:
Po wyjściu z konsoli co prawda do pozycji A4 dodał jeden, ale nie skopiował wartości wpisanej w I4 i nie dodał do wartości w F4.
someone89 pisze:Czyli tak jak teraz klikam i dodaje mi konkretną wartość w zaznaczonych wierszach w kolumnie A... a czy jednocześnie mogłoby brać wartość z konkretnych wierszy w kolumnie F i ją kopiować tak by następnie dodać do wartości w kolumnie I?
Zdecyduj się w końcu ;)
Popatrz na linijki kodu:

Kod: Zaznacz cały

ozakres.getcellbyposition(0,i).value=ozakres.getcellbyposition(0,i).value + przyrost
ozakres.getcellbyposition(8,i).value=ozakres.getcellbyposition(5,i).value+ozakres.getcellbyposition(8,i).value
Ich znaczenie:
ozakres.getcellbyposition(0,i).value - z zaznaczonego zakresu wybierz komórkę z kolumny 0 (czyli A) o numerze wiersza i (i to kolejne numery: 0, 1, 2...)
= - przypisz jej nową wartość równą
ozakres.getcellbyposition(0,i).value - tutaj poprzednią wartość
+przyrost - zwiększoną o przyrost (czyli dodaj 1)
czyli np.: jeżeli masz zaznaczony obszar A4 : J9 to uzyskasz wyniki od A4 = A4 + 1 do A9 = A9 + 1
Druga linijka:
ozakres.getcellbyposition(8,i).value= - z zaznaczonego zakresu wybierz komórkę z kolumny 8 (czyli I) o numerze wiersza i (i to kolejne numery: 0, 1, 2...) i nadaj jej wartość
ozakres.getcellbyposition(5,i).value + - z zaznaczonego zakresu pobierz wartość z kolumny 5 (czyli F) o numerze wiersza i (i to kolejne numery: 0, 1, 2...) i dodaj do niej
ozakres.getcellbyposition(8,i).value= - tutaj poprzednia wartość z kolumny 8 (czyli I) o numerze wiersza w zakresie i (i to kolejne numery: 0, 1, 2...)
czyli np jeżeli masz zaznaczony obszar A4 : J9 to uzyskasz wyniki od I4 = F4 + I4 do I9 = F9 + I9

Pobrałem twój nowy plik i u mnie działa.....
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Awatar użytkownika
Jermor
Posty: 2254
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Potrzebuje pomocy przy stworzeniu makra

Post autor: Jermor »

Tak jak napisał ci @Rafkus w przedostatnim zdaniu. Musisz teraz zaznaczać całe fragmenty od A do I, czyli np A3:I6 oraz A9:I9 i np. A11:I23.
Wszystko o czym piszesz jest do zaprogramowania. Tylko, że to forum jest po to, aby pomagać a ty chciałbyś aby to za ciebie napisać.
Jednak zmodyfikowałem poprawioną przez @Rafkusa wersję i teraz będzie ci to makro dodawać także zawartość komórki z odpowiedniego wiersza w kolumnie F do bieżącej zawartości komórki w tym samym wierszu, lecz w kolumnie I. Dla tego makra wystarczy, że zaznaczysz tylko niezbędne komórki w kolumnie A.
a oto kod:

Kod: Zaznacz cały

Sub aktywny_zakres1 (optional przyrost as double)  
REM To makro modyfikuje tylko pierwszą kolumnę obszaru, bo chyba o to chodziło @someone89
REM wywołując je z parametrem można wskazać dowolny przyrost
If ismissing(przyrost) then przyrost=1
owybor = ThisComponent.CurrentSelection
If owybor.supportsService("com.sun.star.sheet.SheetCellRanges") then
   ilezakresow=owybor.getCount()-1
Else ilezakresow = 0
End If

For j=0 to ilezakresow
   if ilezakresow>0 then ozakres=owybor.getByIndex(j) else ozakres=owybor
   oadr=ozakres.rangeAddress
   oark=ThisComponent.sheets.getbyIndex(oadr.sheet)
   n=oadr.startRow
   REM ilekolumn=ozakres.columns.count 'wiersz będzie potrzebny gdy modyfikować trzeba wszystkie komórki zakresu.
   ilewierszy=ozakres.rows.count
   for i=0 to ilewierszy-1
       ozakres.getcellbyposition(0,i).value=ozakres.getcellbyposition(0,i).value+przyrost
       oark.getcellbyposition(8,i+n).value=oark.getcellbyposition(5,i+n).value+oark.getcellbyposition(8,i+n).value
   next i
next j
End Sub
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 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.
someone89
Posty: 10
Rejestracja: śr sie 14, 2019 7:10 pm

Re: Potrzebuje pomocy przy stworzeniu makra

Post autor: someone89 »

Popatrz na linijki kodu:

Kod: Zaznacz cały

ozakres.getcellbyposition(0,i).value=ozakres.getcellbyposition(0,i).value + przyrost
ozakres.getcellbyposition(8,i).value=ozakres.getcellbyposition(5,i).value+ozakres.getcellbyposition(8,i).value
Ich znaczenie:
ozakres.getcellbyposition(0,i).value - z zaznaczonego zakresu wybierz komórkę z kolumny 0 (czyli A) o numerze wiersza i (i to kolejne numery: 0, 1, 2...)
= - przypisz jej nową wartość równą
ozakres.getcellbyposition(0,i).value - tutaj poprzednią wartość
+przyrost - zwiększoną o przyrost (czyli dodaj 1)
czyli np.: jeżeli masz zaznaczony obszar A4 : J9 to uzyskasz wyniki od A4 = A4 + 1 do A9 = A9 + 1
Druga linijka:
ozakres.getcellbyposition(8,i).value= - z zaznaczonego zakresu wybierz komórkę z kolumny 8 (czyli I) o numerze wiersza i (i to kolejne numery: 0, 1, 2...) i nadaj jej wartość
ozakres.getcellbyposition(5,i).value + - z zaznaczonego zakresu pobierz wartość z kolumny 5 (czyli F) o numerze wiersza i (i to kolejne numery: 0, 1, 2...) i dodaj do niej
ozakres.getcellbyposition(8,i).value= - tutaj poprzednia wartość z kolumny 8 (czyli I) o numerze wiersza w zakresie i (i to kolejne numery: 0, 1, 2...)
czyli np jeżeli masz zaznaczony obszar A4 : J9 to uzyskasz wyniki od I4 = F4 + I4 do I9 = F9 + I9

Pobrałem twój nowy plik i u mnie działa.....
No i dzięki za wytłumaczenie! o to chodziło. O ile rozumiałem getcell czy value z angielskiego to za chiny nie rozumiałem wartości w nawiasach. Jakie 8? jakie i?. Teraz już wiem co to oznacza i jak są liczone kolumny (swoją drogą jakby nie mogło być literami wtedy i laik by się domyślił. Chociaż na znaczenie "i" to bym niegdy nie wpadł). Jeżeli i oznacza kolejne numery to jak się oznacza konkretny wiersz? Też liczy kolejność jego i wpisuje liczbę?

O ile pisać makr w basic nie umiem dalej to chociaż rozumiem co piszecie w tym konkretnym kodzie :)


Jermor pisze:Tak jak napisał ci @Rafkus w przedostatnim zdaniu. Musisz teraz zaznaczać całe fragmenty od A do I, czyli np A3:I6 oraz A9:I9 i np. A11:I23.
Tak masz rację, faktycznie działało. Mój błąd polegał na tym, że nie zrozumiałem co próbował mi przekazać i zamiast zaznaczać cały wiersz jak wspominasz, zaznaczałem tylko wybrane wiersze w tych 3 kolumnach. Aż mi głupio :oops:
Jermor pisze:Wszystko o czym piszesz jest do zaprogramowania. Tylko, że to forum jest po to, aby pomagać a ty chciałbyś aby to za ciebie napisać.
Masz rację. Mimo wszystko dziękuje, że to zrobiłeś, a jeszcze bardziej, że ostatecznie zechciałeś również mi wytłumaczyć znaczenie kodu makra co pozwoliło mi zrozumieć go.

Jermor pisze: Jednak zmodyfikowałem poprawioną przez @Rafkusa wersję i teraz będzie ci to makro dodawać także zawartość komórki z odpowiedniego wiersza w kolumnie F do bieżącej zawartości komórki w tym samym wierszu, lecz w kolumnie I. Dla tego makra wystarczy, że zaznaczysz tylko niezbędne komórki w kolumnie A.
Oczywiście działa tak jak mówisz. Zaznaczam A klikam przycisk i wszystko się robi samo.

Dziękuje Jermor, dziękuje Rafakus za pomoc i napisanie makra.

Temat oznacze jako SOLVED.
LibreOffice 6.0 na Windows 10
Awatar użytkownika
Rafkus
Posty: 515
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Potrzebuje pomocy przy stworzeniu makra

Post autor: Rafkus »

someone89 pisze:Jeżeli i oznacza kolejne numery to jak się oznacza konkretny wiersz? Też liczy kolejność jego i wpisuje liczbę?
Tak jest z tym, że sposób liczenia wierszy/kolumn zależy głównie od sposobu zdefiniowanego zakresu danych.Spróbuję to wyjaśnić na podstawie fragmentu zbudowanego makra, w nim właśnie operacje na danych są zrobione na 2 sposoby:

Kod: Zaznacz cały

n=oadr.startRow
   REM ilekolumn=ozakres.columns.count 'wiersz będzie potrzebny gdy modyfikować trzeba wszystkie komórki zakresu.
   ilewierszy=ozakres.rows.count
   for i=0 to ilewierszy-1
       ozakres.getcellbyposition(0,i).value=ozakres.getcellbyposition(0,i).value+przyrost
       oark.getcellbyposition(8,i+n).value=oark.getcellbyposition(5,i+n).value+oark.getcellbyposition(8,i+n).value
   next i
getcellbyposition(Kolumna, Wiersz) - polecenie to oznacza adres komórki, jak pewnie wywnioskowałeś z wcześniejszego posta indeksowanie zaczyna się zawsze od lewego górnego rogu i przypadają jej wartości (0, 0) do prawego dolnego rogu w którym współrzędne będą miały wartości (liczba kolumn - 1, liczba wierszy - 1).
W zależności do tego co zostało zdefiniowane przed tym poleceniem jednakowym współrzędnym będą odpowiadać różne komórki, i tak dla:
ozakres - w tym przypadku pod tą zmienną zdefiniowany jest wybrany przez Ciebie jakiś zakres komórek. Załóżmy że wybrałeś komórki B2 : C4. Makro wie gdzie ten zakres leży, ale nie interesuje go nic, co leży poza zakresem. Wewnątrz zakresu komórce B2 przypada pozycja (0,0), C2 = (1,0), B3 = (0,1), C3 = (1,1), B4 = (0,2), C4 = (1,2). Przy wpisaniu innych wartości w adresie - makro zgłosi błąd.
oark - w tym przypadku ta zmienna reprezentuje cały arkusz. Dla niej kolumnie A przypada liczba 0, B = 1, C = 2 itd, natomiast Wierszowi 1 przypada liczba 0, Wiersz 2 = 1, Wiersz 3 = 2, itd... ; czyli komórce A1 w arkuszu odpowiada adres w makrze (0, 0), B2 = (1, 1), C2 = (2, 1),...
ilewierszy=ozakres.rows.count - tu chyba jest wszystko jasne: przykładowy zakres B2 : C4 ma 3 wiersze
n=oadr.startRow - wybrany zakres B2 : C4 rozpoczyna się w wierszu arkusza = 1 .
i - to kolejne numery wiersza w zakresie, jej wartość jest ustalana przy pomocy pętli FOR...TO... NEXT
i+n - Wartość ta pozwala określić rzeczywisty numer wiersza w arkuszu


PS. Pisałeś wcześniej
someone89 pisze: nie skopiował wartości wpisanej w I4 i nie dodał do wartości w F4.
A jeszcze wcześniej pisałeś odwrotnie (skopiować pozycję w z kolumny F i dodać tą wartość do kolumny I), w każdym razie musisz w pewnej linijce kodu zmienić pierwsze wystąpienie 8 zamienić na 5

Kod: Zaznacz cały

popraw tą linijkę:
oark.getcellbyposition(8,i+n).value=oark.getcellbyposition(5,i+n).value+oark.getcellbyposition(8,i+n).value
do takiej postaci: 
oark.getcellbyposition(5,i+n).value=oark.getcellbyposition(5,i+n).value+oark.getcellbyposition(8,i+n).value
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
someone89
Posty: 10
Rejestracja: śr sie 14, 2019 7:10 pm

Re: [SOLVED] Potrzebuje pomocy przy stworzeniu makra

Post autor: someone89 »

Dzięki @Rafkus za wyjaśnienie. Na pierwszy rzut oka wygląda jak magia, ale jak się zna język to jest to łatwe... liczy kolumny i wiersze liczbami i to wyjaśnia wartości w nawiasach, a dla mnie jako laika wydawało się, że odsyłanie do konkretnej komórki/wiersza to jej konkretny adres np. B6. Teraz już jest jasne dla mnie skąd makro wie o do których komórek jest odesłanie.

Możesz polecić jakieś dość proste opracowanie dla tego języka programowania makr? albo jakiś kurs online? tak bym się trochę z nim oswajał bo mi się to przyda w przyszłości.
LibreOffice 6.0 na Windows 10
ODPOWIEDZ