Strona 1 z 1

Konwersja makra z excela

: pn lip 09, 2012 9:55 pm
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

Re: Konwersja makra z excela

: wt lip 10, 2012 10:41 pm
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

Re: Konwersja makra z excela

: śr lip 11, 2012 9:31 am
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

Re: [SOLVED] Konwersja makra z excela

: czw lip 19, 2012 11:17 am
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

Re: Konwersja makra z excela

: pn sie 06, 2012 4:45 pm
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óż....

Re: Konwersja makra z excela

: wt sie 07, 2012 11:31 am
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% ...