Konwersja makra z excela

Makropolecenia i funkcje w języku Basic
Jedzdzer
Posty: 3
Rejestracja: pn lip 09, 2012 4:09 pm

Konwersja makra z excela

Post autor: Jedzdzer »

Witam wszystkich
Mam dokument z makrem w excel który chciałbym używać w oo, natomiast makro nie działa a ja nie bardzo wiem jak je przekonwertować
Chodzi o to by samoczynnie wpisywała się aktualna data i godzina w momencie wpisana czegokolwiek w w kolumnie "G"

Makro z excela:

Kod: Zaznacz cały

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Count = 1 And Not Intersect(Target, Columns("G")) Is Nothing Then
    Cells(Target.Row, "B") = Date
    Cells(Target.Row, "C") = Format(Time, "hh:mm:ss")
  End If
End Sub
Z góry dziękuję za pomoc
Ostatnio zmieniony czw lip 19, 2012 11:17 am przez Jedzdzer, łącznie zmieniany 2 razy.
OpenOffice.org 3.3.0
Windows 7
Jedzdzer
Posty: 3
Rejestracja: pn lip 09, 2012 4:09 pm

Re: Konwersja makra z excela

Post autor: Jedzdzer »

Poradziłem sobie w inny sposób, za pomocą formuły którą gdzieś znalazłem, może się komuś przyda :
Wpisujemy w komórkę C1 :

Kod: Zaznacz cały

  =JEŻELI(A1="";"";JEŻELI(B1="";TERAZ();C1))
no i komórkę A1 trzeba sformatować jako datę, albo jak wolimy czas. Wtedy jeżeli coś wpiszemy w komórkę A1 w komórce C1 pojawi się aktualna data, bądź godzina
OpenOffice.org 3.3.0
Windows 7
Jan_J
Posty: 4557
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Konwersja makra z excela

Post autor: Jan_J »

Jedzdzer pisze:Poradziłem sobie w inny sposób, za pomocą formuły którą gdzieś znalazłem, może się komuś przyda :
Wpisujemy w komórkę C1 :

Kod: Zaznacz cały

  =JEŻELI(A1="";"";JEŻELI(B1="";TERAZ();C1))
no i komórkę A1 trzeba sformatować jako datę, albo jak wolimy czas. Wtedy jeżeli coś wpiszemy w komórkę A1 w komórce C1 pojawi się aktualna data, bądź godzina
Niedobrze.

1. W oryginale wstawiasz do komórki stałą równą bieżącemu stanowi zegara. W rozwiązaniu awaryjnym radzisz sobie za pomocą formuły, która w dowolnej chwili (np. podczas przeliczenia arkusza, jego załadowania, a nawet modyfikacji którejkolwiek komórki) może zostać zaktualizowana.

2. Działasz w komórce C1. Co się stanie, jeżeli warunki dot. A1 ani B1 nie będą spełnione? Moim zdaniem błąd 522: cykliczna referencja.

Chyba że masz włączone iteracje (Narzędzia→Opcje→Calc→Oblicz), ale to znaczy że integralność arkusza będzie zależeć od stanu konfiguracji środowiska, którą w każdym momencie da się zmienić. To jest dobra metoda do badania wariantów scenariuszy, ale niekoniecznie do tworzenia bazy danych.

Przetłumaczenie makra jest dość proste, choć wymaga podpięcia do obiektu typu Listener. Kilka wskazówek znajdziesz w http://www.oooforum.org/forum/viewtopic.phtml?t=12781.

Datę/czas z zegara wstawisz do komórki prawie tak jak w Excelu. Konkretnie

Kod: Zaznacz cały

a = thisComponent.currentController.getActiveSheet()
a.getCellByPosition(0,0).Value = Date               ' tylko data
a.getCellByPosition(0,1).String = Format(Date+Time, "yyyy.MM.dd hh:mm:ss") ' data i godzina
JJ
LO (7.6) ∙ AOO (4.1) ∙ Python (3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Jedzdzer
Posty: 3
Rejestracja: pn lip 09, 2012 4:09 pm

Re: [SOLVED] Konwersja makra z excela

Post autor: Jedzdzer »

Faktycznie posypało się :(, dziękuję za wskazówki, ale niestety z bacica i generalnie programowania jestem kompletnie zielony i nie jestem w stanie tego zrobić. Męczę się już drugi dzień, ale nie udało mi się. Jeżeli ktoś znalazł by rozwiązanie, bądź chciało by mu się pobawić makrem, będę wdzięczny za pomoc
OpenOffice.org 3.3.0
Windows 7
Jan_J
Posty: 4557
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Konwersja makra z excela

Post autor: Jan_J »

Jakoś tak:

Kod: Zaznacz cały

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

Sub my_chartDataChanged(oEvt)
    oSel = thisComponent.CurrentController.getSelection().RangeAddress
    oSheet = thisComponent.Sheets.getByIndex(oSel.Sheet)
    ' uwaga ???
    markRows(oSheet, oEvt.StartRow, oEvt.EndRow)
End Sub 

sub markRows(oSheet as object, startRow as integer, endRow as integer)
    dataczas = Format(Date, "yyyy.MM.dd ") & Time ' data i godzina
    for row = startRow to endRow
        oSheet.getCellByPosition(0, row).String = dataczas
    next row
end sub
Po otwarciu arkusza trzeba wywołać pierwszą procedurę. Albo zrobić to ręcznie, albo przypisać jej wykonanie zdarzeniu otwarcia dokumentu: Narzędzia→Dostosuj→Zdarzenia.

Jet jednak problem: jeżeli Listener jest zainstalowany dla zakresu komórek (np. dla kolumny), to przekazywana przez parametr oEvt informacja nie wskazuje, która komórka/komórki zostały zmodyfikowane. Na podstawie dokumentacji http://api.libreoffice.org/common/ref/c ... Event.html sądzę, że powinna być dostarczona. No cóż....
JJ
LO (7.6) ∙ AOO (4.1) ∙ Python (3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Jan_J
Posty: 4557
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Konwersja makra z excela

Post autor: Jan_J »

Po zastosowaniu XModifyListener zamiast XChartDataChangeEventListener wszystko jest jak należy:

Kod: Zaznacz cały

    sub StartListener()
        oSheet = thisComponent.Sheets.getByIndex(0)
        aRange = "G1:G20"
        oGroup=oSheet.getCellRangeByName(aRange)
        oListener = createUnoListener("my_","com.sun.star.util.XModifyListener")
        oGroup.addModifyListener(oListener)
    End Sub

    Sub my_Modified(oEvt)
        oSel = thisComponent.CurrentController.getSelection().RangeAddress
        oSheet = thisComponent.Sheets.getByIndex(oSel.Sheet)
        markRows(oSheet, oSel.StartRow, oSel.EndRow)
    End Sub

    sub markRows(oSheet as object, startRow as integer, endRow as integer)
        dateString = Format(Date, "yyyy.MM.dd ") & Time ' data i godzina
        for row = startRow to endRow
            oSheet.getCellByPosition(0, row).String = dateString
        next row
    end sub
Co nie znaczy, że rozumiem, dlaczego tamten nie chciał być posłuszny w 100% ...
JJ
LO (7.6) ∙ AOO (4.1) ∙ Python (3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
ODPOWIEDZ