Konwersja makra z excela

Makropolecenia i funkcje w języku Basic

Konwersja makra z excela

Postprzez Jedzdzer » Pn lip 09, 2012 9:55 pm

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
Ostatnio edytowano Cz lip 19, 2012 11:17 am przez Jedzdzer, łącznie edytowano 2 razy
OpenOffice.org 3.3.0
Windows 7
Jedzdzer
 
Posty: 3
Dołączył(a): Pn lip 09, 2012 4:09 pm

Re: Konwersja makra z excela

Postprzez Jedzdzer » Wt lip 10, 2012 10:41 pm

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
OpenOffice.org 3.3.0
Windows 7
Jedzdzer
 
Posty: 3
Dołączył(a): Pn lip 09, 2012 4:09 pm

Re: Konwersja makra z excela

Postprzez Jan_J » Śr lip 11, 2012 9:31 am

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
JJ
LO Still (6.2) ∙ AOO 4.1.7 ∙ Python (3.7|2.7) ∙ Unicode 12 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3967
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: [SOLVED] Konwersja makra z excela

Postprzez Jedzdzer » Cz lip 19, 2012 11:17 am

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
Jedzdzer
 
Posty: 3
Dołączył(a): Pn lip 09, 2012 4:09 pm

Re: Konwersja makra z excela

Postprzez Jan_J » Pn sie 06, 2012 4:45 pm

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óż....
JJ
LO Still (6.2) ∙ AOO 4.1.7 ∙ Python (3.7|2.7) ∙ Unicode 12 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3967
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Konwersja makra z excela

Postprzez Jan_J » Wt sie 07, 2012 11:31 am

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% ...
JJ
LO Still (6.2) ∙ AOO 4.1.7 ∙ Python (3.7|2.7) ∙ Unicode 12 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3967
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław


Powrót do Basic

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość