Generator liczb losowych z kolorowaniem tła komórek

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 3806 razy

Czas najwyższy stworzyć pierwsze makro w OpenOffice Calc, które wygeneruje losowe liczby zmiennoprzecinkowe z zakresu od 0 do 1 i pokoloruje komórki, w których zostaną one zapisane. Makro i funkcje stworzone zostaną lokalnie (co to znaczy zostało omówione na stronie OpenOffice - własne funkcje).

W utworzonym lokalnym module należy zamieścić następujący kod:
Function SetColor(k as double, w as double) Dim document as object Dim dispatcher as object document = ThisComponent.CurrentController.Frame dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") Dim args2(0) as new com.sun.star.beans.PropertyValue args(0).Name = "BackgroundColor" args(0).Value = Int(255 * w / k) * 256 * 256 + Int(255 - 255 * w / k) * 256 dispatcher.executeDispatch(document, ".uno:BackgroundColor","",0,args()) End Function Sub Generator Dim document as object Dim dispatcher as object document = ThisComponent.CurrentController.Frame dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") Dim args(0) as new com.sun.star.beans.PropertyValue args(0).Name = "ToPoint" args(0).Value = "$B$2" dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args()) Dim i as integer Dim j as integer For j = 1 To 10 For i = 1 To 10 Dim str as string Dim w as double w = rnd() str = w args(0).Name = "StringName" args(0).Value = str dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args()) SetColor(1, w) dispatcher.ExecuteDispatch(document, ".uno:GoDown", "" , 0 ,Array()) Next i For i = 1 To 10 dispatcher.ExecuteDispatch(document, ".uno:GoUp", "", 0, Array()) Next i dispatcher.ExecuteDispatch(document, ".uno:GoRight", "", 0, Array()) Next j End Sub

a następnie zapisać dokument. Teraz w arkuszu kalkulacyjnym programu Calc należy wybrać z menu pozycję Widok->Paski narzędzi->Formanty. Na pasku narzędziowym Formanty jeżeli nie są aktywne ikonki formantów należy kliknąć ikonę Włącz/Wyłącz tryb projektu a następnie wybrać formant przycisku i narysować go w arkuszu kalkulacyjnym. Na przycisku kliknąć ppm i z menu podręcznego wybrać pozycję Formant. Pojawi się okno Właściwości: Przycisk w zakładce Ogólne zmienić należy  pole Etykieta na tekst np. Generuj liczby losowe. W zakładce Wydarzenia dla pozycji Zatwierdź działanie kliknąć przycisk z trzema kropkami, by wyświetliło się okno dialogowe Przypisz działanie zaznaczyć pozycję Zatwierdź działanie i kliknąć przycisk Makro... Teraz przypisać należy makro Generator znajdując po lewej stronie moduł, z którego ono pochodzi a po prawej z listy wybierając makro o tejże nazwie. Kliknąć należy OK i zamknąć pozostałe okna. Teraz na pasku formantów przełączyć tryb projektowania i już można sprawdzić, czy działa.

Rys. 1
Ilustracja końcowego efektu działania makra generującego liczby losowe i koloryzujące komórki według ich wartości.

P.S.

Na wszelki wypadek, co by nie było, że sknerą jestem w załączniku zamieszczam gotowy dokument z generatorem liczb losowych.

A może by tak jeszcze zrobić losowanie z sortowaniem? - a proszę bardzo, oto i ono:

Sub generator2 Redim liczby(99) as double Dim i as integer ' Wczytywanie maksymalnej wartości losowania' Dim maximum as double arkusz = thisComponent.currentController.getActiveSheet() maksimum = arkusz.getCellRangeByName("C16").Value If maksimum <= 0 Then ' Jeżeli maksimum jest mniejsze lub równe zero to' exit sub ' zakończ działanie makra' End If ' losowanie 100 liczb' For i = 0 To 99 liczby(i) = rnd() * maksimum ' z zakresu od 0 do maksimum' Next i ' sortowanko liczb' Dim k as long Do k = 0 For i = 0 To 98 If (liczby(i) > liczby(i + 1)) Then Dim a as double a = liczby(i) liczby(i)= liczby(i + 1) liczby(i + 1) = a k = k + 1 End If Next i Loop While(k > 0) ' koniec sortowanka liczb' ' Wpisywanie wylosowanych liczb w komórki arkusza' For i = 0 To 99 arkusz.GetCellByPosition(1 + (i mod 10),1 + Int(i / 10)).Value = liczby(i) Next i ' Koniec wspisywania' ' Kolorowanie komórek według ich wartości' Dim j as integer Dim document as object Dim dispatcher as object document = ThisComponent.CurrentController.Frame dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") Dim args(0) as new com.sun.star.beans.PropertyValue args(0).Name = "ToPoint" args(0).Value = "$B$2" dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args()) For j = 1 To 10 For i = 1 To 10 SetColor(maksimum, liczby(j - 1 + (i - 1) * 10)) dispatcher.ExecuteDispatch(document, ".uno:GoDown", "" , 0 ,Array()) Next i For i = 1 To 10 dispatcher.ExecuteDispatch(document, ".uno:GoUp", "", 0, Array()) Next i dispatcher.ExecuteDispatch(document, ".uno:GoRight", "", 0, Array()) Next j 'Koniec kolorowania' End Sub

Załączniki:

Makro