Odpowiednik makra z excela na OO/LO

Użytkowanie arkusza kalkulacyjnego
toomas08
Posty: 10
Rejestracja: pt lut 08, 2013 12:54 pm

Odpowiednik makra z excela na OO/LO

Post autor: toomas08 »

Witam.
W pierwszych słowach witam serdecznie wszystkich. To jest mój pierwszy post choć z OO a teraz z LO mam już długo styczność to dzisiaj pojawił się problem na który szukam odpowiedzi.

Mam w starym pliku Excela makro:

"Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$C$9" Then ActiveSheet.Name = Cells(9, 3).Value

End Sub"

Zmienia mi ono nazwę arkusza na taką jaką zdefiniuje w komórce. Chciałbym taka funkcjonalność osiągnąć w OO lub LO. jak to zrobić?

Pozdrawiam
Tomek
LibreOffice 5 na Windows 10
Jan_J
Posty: 4641
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Odpowiednik makra z excela na OO/LO

Post autor: Jan_J »

Kod: Zaznacz cały

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$C$9" Then ActiveSheet.Name = Cells(9, 3).Value

End Sub
Odpowiednik dla AOO/LO

Kod: Zaznacz cały

Sub Worksheet_Change(ByVal Target As Range)

  activeSheet = thisComponent.currentController.getActiveSheet()
  If Target.CellAddress.Row = 8 and Target.CellAddress.Column = 2 Then 
     activeSheet.setName(Target.getString())
  end if

End Sub
co łatwo przetestować

Kod: Zaznacz cały

sub test
  Worksheet_change(thisComponent.currentController.getActiveSheet().getCellByPosition(2,8))
end sub
ale sądzę, że istota leży w automatyzmie wywołań tej prostej procedury, tak by zawartość komórki C9 wpływała na tytuł arkusza.

Excel ma wbudowane powiązania między nazwami makr i wywoływaniem ich w określonych zdarzeniach.
W AOO/LO automatyczne wywołanie po zdarzeniu uzyskuje się na jeden z dwóch sposobów:
  • albo przez interfejs użytkownika: Narzędzia/Dostosuj/Zdarzenia
  • albo przez ustawienie programowe interfejsu XUNOListener -- kilka przykładów już jest na forum, warto przejrzeć.
Trzeba by nieco zmienić formę wywołania. Makro obsługujące zdarzenie ma w nagłówku parametr typu Event, prze który przekazuje się mu dane o tym co się stało -- co konkretnie, to zależy od zdarzenia. Wstawienie nasłuch może dotyczyć nawet zmiany pojedynczej komórki, np. C9. Wtedy sprawdzanie if then nie będzie potrzebne, trzeba by jedynie wydłubać adres komórki z opisu zdarzenia.
JJ
LO (25.2) ∙ Python (3.13|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Jan_J
Posty: 4641
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Odpowiednik makra z excela na OO/LO

Post autor: Jan_J »

Więcej: patrz http://forum.openoffice.org/pl/forum/vi ... ener#p5868
Wersja robocza listenera

Kod: Zaznacz cały

sub StartListener()
    oSheet = thisComponent.Sheets.getByIndex(0)
    aRange = "C9"
    oGroup=oSheet.getCellRangeByName(aRange)
    oListener = createUnoListener("my_","com.sun.star.chart.XChartDataChangeEventListener")
    oGroup.addChartDataChangeEventListener(oListener)
End Sub

Sub my_chartDataChanged(oEvt)
    arkusz = thisComponent.Sheets.getByIndex(oEvt.Source.CellAddress.Sheet)
    k = oEvt.Source.CellAddress.Column
    w = oEvt.Source.CellAddress.Row
    kom = arkusz.getCellByPosition(k,w)
    arkusz.setName(kom.getString())
End Sub
StartListener przypisz do zdarzenia otwarcia tego skoroszytu, w którym to wszystko ma się odbywać.
JJ
LO (25.2) ∙ Python (3.13|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
toomas08
Posty: 10
Rejestracja: pt lut 08, 2013 12:54 pm

Re: Odpowiednik makra z excela na OO/LO

Post autor: toomas08 »

Dzięki za pomoc.
Będę starał się to wszystko uruchomić choć widzę, że w OO/LO jest to jakoś bardziej skomplikowane niż w excelu.

Jeszcze raz wielkie dzięki.
LibreOffice 5 na Windows 10
ODPOWIEDZ