Generator liczb losowych z kolorowaniem tła komórek

Stronę tą wyświetlono już: 582 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:
Listing 1
  1. Function SetColor(k as double, w as double)
  2. Dim document as object
  3. Dim dispatcher as object
  4. document = ThisComponent.CurrentController.Frame
  5. dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
  6. Dim args2(0) as new com.sun.star.beans.PropertyValue
  7. args(0).Name = "BackgroundColor"
  8. args(0).Value = Int(255 * w / k) * 256 * 256 + Int(255 - 255 * w / k) * 256
  9. dispatcher.executeDispatch(document, ".uno:BackgroundColor","",0,args())
  10. End Function
  11. Sub Generator
  12. Dim document as object
  13. Dim dispatcher as object
  14. document = ThisComponent.CurrentController.Frame
  15. dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
  16. Dim args(0) as new com.sun.star.beans.PropertyValue
  17. args(0).Name = "ToPoint"
  18. args(0).Value = "$B$2"
  19. dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args())
  20. Dim i as integer
  21. Dim j as integer
  22. For j = 1 To 10
  23. For i = 1 To 10
  24. Dim str as string
  25. Dim w as double
  26. w = rnd()
  27. str = w
  28. args(0).Name = "StringName"
  29. args(0).Value = str
  30. dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args())
  31. SetColor(1, w)
  32. dispatcher.ExecuteDispatch(document, ".uno:GoDown", "" , 0 ,Array())
  33. Next i
  34. For i = 1 To 10
  35. dispatcher.ExecuteDispatch(document, ".uno:GoUp", "", 0, Array())
  36. Next i
  37. dispatcher.ExecuteDispatch(document, ".uno:GoRight", "", 0, Array())
  38. Next j
  39. 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:

Listing 2
  1. Sub generator2
  2. Redim liczby(99) as double
  3. Dim i as integer
  4. ' Wczytywanie maksymalnej wartości losowania'
  5. Dim maximum as double
  6. arkusz = thisComponent.currentController.getActiveSheet()
  7. maksimum = arkusz.getCellRangeByName("C16").Value
  8. If maksimum <= 0 Then ' Jeżeli maksimum jest mniejsze lub równe zero to'
  9. exit sub ' zakończ działanie makra'
  10. End If
  11. ' losowanie 100 liczb'
  12. For i = 0 To 99
  13. liczby(i) = rnd() * maksimum ' z zakresu od 0 do maksimum'
  14. Next i
  15. ' sortowanko liczb'
  16. Dim k as long
  17. Do
  18. k = 0
  19. For i = 0 To 98
  20. If (liczby(i) > liczby(i + 1)) Then
  21. Dim a as double
  22. a = liczby(i)
  23. liczby(i)= liczby(i + 1)
  24. liczby(i + 1) = a
  25. k = k + 1
  26. End If
  27. Next i
  28. Loop While(k > 0)
  29. ' koniec sortowanka liczb'
  30. ' Wpisywanie wylosowanych liczb w komórki arkusza'
  31. For i = 0 To 99
  32. arkusz.GetCellByPosition(1 + (i mod 10),1 + Int(i / 10)).Value = liczby(i)
  33. Next i
  34. ' Koniec wspisywania'
  35. ' Kolorowanie komórek według ich wartości'
  36. Dim j as integer
  37. Dim document as object
  38. Dim dispatcher as object
  39. document = ThisComponent.CurrentController.Frame
  40. dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
  41. Dim args(0) as new com.sun.star.beans.PropertyValue
  42. args(0).Name = "ToPoint"
  43. args(0).Value = "$B$2"
  44. dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args())
  45. For j = 1 To 10
  46. For i = 1 To 10
  47. SetColor(maksimum, liczby(j - 1 + (i - 1) * 10))
  48. dispatcher.ExecuteDispatch(document, ".uno:GoDown", "" , 0 ,Array())
  49. Next i
  50. For i = 1 To 10
  51. dispatcher.ExecuteDispatch(document, ".uno:GoUp", "", 0, Array())
  52. Next i
  53. dispatcher.ExecuteDispatch(document, ".uno:GoRight", "", 0, Array())
  54. Next j
  55. 'Koniec kolorowania'
  56. End Sub

Załączniki:

Makro

Komentarze