Strona 1 z 1

Konwersja makra z excela

PostNapisane: Pn lip 09, 2012 9:55 pm
przez 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   Rozszerz widokZwiń widok
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

PostNapisane: Wt lip 10, 2012 10:41 pm
przez 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   Rozszerz widokZwiń widok
  =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

PostNapisane: Śr lip 11, 2012 9:31 am
przez Jan_J
Jedzdzer napisał(a):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   Rozszerz widokZwiń widok
  =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   Rozszerz widokZwiń widok
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

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

PostNapisane: Pn sie 06, 2012 4:45 pm
przez Jan_J
Jakoś tak:
Kod: Zaznacz cały   Rozszerz widokZwiń widok
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

PostNapisane: Wt sie 07, 2012 11:31 am
przez Jan_J
Po zastosowaniu XModifyListener zamiast XChartDataChangeEventListener wszystko jest jak należy:
Kod: Zaznacz cały   Rozszerz widokZwiń widok
    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% ...