Viser opslag med etiketten Kalender. Vis alle opslag
Viser opslag med etiketten Kalender. Vis alle opslag

søndag den 15. september 2019

Registrering af arbejdstid

I 2016 lavede jeg en evighedskalender, som jeg vil minde om. Der er tale om et regneark med en indbygget makro.

Du kan læse om kalenderen her: http://libreofficedk.blogspot.dk/2016/10/regneark-i-calc-arskalender.html
Du kan downloade regnearket her: https://www.dropbox.com/s/v6vi1pbbdmo0oz2/Kalender.ods?dl=0

Senest har jeg lavet en evighedskalender til registrering af arbejdstid.

På første fane vælger du årstal og indtaster din normale arbejdstid.

Herefter kan du måned for måned registrere hvornår du kommer og går. Efterhånden du udfylder dagene, kan du se resultatet i oversigten på første fane.

 

I kolonnen "Start" indtaster du hvornår du startede, fx 07:30, og i kolonnen "Slut" skriver du hvornår du gik igen, fx 16:00.

Hvis du selv betaler din frokostpause kan du korrigere for det ved at forøge den daglige arbejdstid med 30 minutter eller ved at skrive -00:30 i kolonnen "Ekstra". Den kolonne kan du også bruge, hvis du fx bliver kontaktet af din arbejdsplads uden for din normale arbejdstid, eller hvis du har taget noget arbejde med hjem.




Du kan downloade regnearket her: https://www.dropbox.com/s/ynuahdxua46jsbr/Tidsregistrering.ods?dl=1

Regnearket er udviklet i skrivebordsversionen, men kan sagtens bruges i LibreOffice Online.



Regnearket var egentlig ikke svært at lave, men der var dog et par små "knaster". Den første knast var at håndtere 29. februar som jo ikke skal anvendes med mindre det er skudår. Knasten endte med at løses ved at skifte til engelsk, fordi funktionen ISLEAPYEAR er oversat forkert til dansk (jeg har rettet det for fremtiden) og formlen virker fint i den danske version.

Den anden knast var at trække to klokkeslæt fra hinanden. Det går meget godt, men er resultatet en negativt tidangivelse, gik det galt. 07:30 minus 08:00 giver som udgangspunkt 23:30. Det betyder at 8 timer tidligere end 7:30 var klokken 23:30. Problemet blev løst ved manuelt at ændre formatet fra TT:MM til [TT]:MM.




torsdag den 28. december 2017

Mere Kalender

Jeg skrev tidligere i december og erindrede om den evighedskalender jeg lavede med makroprogrammering sidste år. Det kan du læse om her: http://libreofficedk.blogspot.dk/2017/12/kalender-2018.html

Som tidligere år har Eliane Domingos de Sousa fra Brazilian LIbreOffice Community designet en flot LibreOffice kalender, som jeg har oversat.

Den kan du downloade her:

Draw: https://www.dropbox.com/s/h2l646q8caacxj5/KALENDER-LIBREOFFICE-2018-DA.odg?dl=0
PDF: https://www.dropbox.com/s/cthpslaq5cvn74e/KALENDER-LIBREOFFICE-2018-DA.pdf?dl=0

lørdag den 2. december 2017

Kalender 2018

Når året er ved at rinde ud, kigger vi ofte med spænding hen imod det nye år der kommer. Hvad vil året bringe? Lykke, rigdom eller spændende oplevelser?

Det er tid at planlægge ferierne næste år, og til det skal vi bruge en kalender.

Sidste år udviklede jeg en evighedskalender, som jeg vil minde om. Der er tale om et regneark med en indbygget makro.

Du kan læse om kalenderen her: http://libreofficedk.blogspot.dk/2016/10/regneark-i-calc-arskalender.html
Du kan downloade regnearket her: https://www.dropbox.com/s/v6vi1pbbdmo0oz2/Kalender.ods?dl=0

lørdag den 7. januar 2017

Mest læst i 2016

I november og december 2016 skrev jeg en række artikler om makroprogrammering i regneark, hvilket var ret populært. Hver artikel blev læst 3-400 gange.

Den mest læste artikel i 2016 var uden sammenligning artiklen om programmering af en årskalender i regneark, som blev læst 482 gange.

Fik du ikke læst artiklen, kan du finde den her: http://libreofficedk.blogspot.dk/2016/10/regneark-i-calc-arskalender.html.

Til de af jer der endnu ikke selv har fået lavet en kalender, kan I downloade et regneark her, hvor makroen er indbygget: https://dl.dropboxusercontent.com/u/9348527/Kalender.ods

 God fornøjelse.

fredag den 30. december 2016

Årskalender 2017

Godt nytår til alle læsere af nyhedsbrevet.

Igen i år har Eliane Domingos fra det brasilianske fællesskab lavet en rigtig flot kalender. Jeg har oversat den til dansk og du er velkommen til at downloade og udskrive kalenderen.

Det er også meningen at den skal bruges til at dele ud reklame for LibreOffice.


https://dl.dropboxusercontent.com/u/9348527/Kalender2017.odg
https://dl.dropboxusercontent.com/u/9348527/Kalender2017.pdf
https://dl.dropboxusercontent.com/u/9348527/Kalender2017.gif

tirsdag den 25. oktober 2016

Regneark i Calc (Årskalender)

Efter at vi tidligere har gennemgået en række dato-funktioner i Calc regneark, vil jeg vise et praktisk eksempel. Makroen herunder danner en to-sidet kalender med helligdage, med seks måneder på hver side. Der er forklarende kommentarer i koden.

Eksempel:




REM  *****  BASIC  *****

Sub Main

this_year = InputBox ("Indtast årstal mellem 1583 og 3000", "Vælg årstal", year(date))

'Kontroller at årstallet brugbart
If (1583 > val(this_year) OR val(this_year) > 3000) then
MsgBox("Årstallet skal være mellem 1583 og 3000", 48, "Fejl")
Stop
End If

Cal_name="Kalender " & this_year

'Kontroller at dokumentet er et regneark
my_doc = ThisComponent
If not my_doc.SupportsService("com.sun.star.sheet.SpreadsheetDocument") then
MsgBox("Dokumentet skal være et regneark", 48, "Fejl")
Stop
End if

my_sheets = my_doc.Sheets
antal=my_sheets.count

If NOT my_sheets.hasbyName(Cal_name) Then

my_sheets.insertNewByName(Cal_name, antal)

End If

the_sheet = my_sheets.getByName(Cal_name)

'Formatér siden
oStyles = my_doc.StyleFamilies.getByName("PageStyles")
    oPstyle = oStyles.getByName(the_sheet.PageStyle)
    oPstyle.FooterIsOn = False
    oPstyle.FooterIsOn = False
    oPstyle.TopMargin=500

'Første linje   
  oRange = the_sheet.getCellRangeByName("A1:L1")
  oRange.merge(True)
  oCell= the_sheet.getCellByPosition(0, 0)
  oCell.String = Cal_name
  FormatDark(oCell)

  oRange = the_sheet.getCellRangeByName("M1:X1")
  oRange.merge(True)
  oCell= the_sheet.getCellByPosition(12, 0)
  oCell.String = Cal_name
  FormatDark(oCell)
 
'Nederste linje    
  oRange = the_sheet.getCellRangeByName("A34:X34")
  oRange.merge(True)
  oCell = the_sheet.getCellRangeByName("A34")
  FormatDark(oCell)

For m = 1 to 12
'Overskriften

  oRange = the_sheet.getCellRangeByPosition(m*2-1-1,1,m*2-1,1)
  oRange.merge(True)
  the_cell = the_sheet.getCellByPosition(m*2-1-1, 1)
  the_cell.String=TheMonthName(m)
  the_cell.HoriJustify = 2
  the_cell.CellBackColor=rgb(150,150,150)
  the_cell.CharColor=rgb(255,255,255)

'Justerer kolonnebredder
  Column= the_sheet.Columns(m*2-1-1)
  Column.Width=550
  Column= the_sheet.Columns(m*2-1)
  Column.Width=4000

Next m 

'For hver måned...
For m = 1 to 12

'Dag for dag...
For d= 1 to Day(LastDayOfMonth(DateValue("1-" & m & "-" & this_year))
the_date=DateValue(d & "-" & m & "-" & this_year)

'Skriv datoen i første kolonne
the_cell = the_sheet.getCellByPosition(m*2-1-1, d + 1)
the_cell.Value=the_date
the_cell.NumberFormat=109
'Formatter cellen
FormatLight(the_cell)

'Skriv ugedagens bogstav i anden kolonne
the_Othercell = the_sheet.getCellByPosition(m*2-1, d + 1)

'Lørdag og søndag formateres
    Select Case WeekDay(the_date)
    Case 1
        FormatLight(the_Othercell)
        the_Othercell.String="S"
    Case 2
        the_Othercell.String="M"
    Case 3
        the_Othercell.String="T"
    Case 4
        the_Othercell.String="O"
    Case 5
        the_Othercell.String="T"                       
    Case 6
        the_Othercell.String="F"
    Case 7
        FormatLight(the_Othercell)
        the_Othercell.String="L"               
End Select

'Tilføj helligdage
generic_date= left(STR(the_date),5)
oFA = createUnoService( "com.sun.star.sheet.FunctionAccess" )

'Faste helligdage
Select Case generic_date

case "01-01"
        FormatLight(the_Othercell)
        the_Othercell.String=the_Othercell.String & " Nytårsdag"
case "05-06"
        FormatLight(the_Othercell)
        the_Othercell.String=the_Othercell.String &" Grundlovsdag"
case "24-12"
        FormatLight(the_Othercell)
        the_Othercell.String=the_Othercell.String &" Juleaften"
case "25-12"
        FormatLight(the_Othercell)
        the_Othercell.String=the_Othercell.String &" Juledag"
case "26-12"
        FormatLight(the_Othercell)
        the_Othercell.String=the_Othercell.String &" 2. Juledag"               

'Skæve helligdage
'Der findes ingen påske-beregning i Basic, men vi kan eksekvere regnearksfunktionen =Påskedag)
        the_Othercell.String=the_Othercell.String &" Påskedag"
case Left(STR(CDate(oFA.callFunction( "EASTERSUNDAY", array( this_year ) )+1 ) ),5)
        FormatLight(the_Othercell)
        the_Othercell.String=the_Othercell.String &" 2. Påskedag"     
case Left(STR(CDate(oFA.callFunction( "EASTERSUNDAY", array( this_year ) )-2 ) ),5)
        FormatLight(the_Othercell)
        the_Othercell.String=the_Othercell.String &" Langfredag"              
case Left(STR(CDate(oFA.callFunction( "EASTERSUNDAY", array( this_year ) )-3 ) ),5)
        FormatLight(the_Othercell)
        the_Othercell.String=the_Othercell.String &" Skærtorsdag"
case Left(STR(CDate(oFA.callFunction( "EASTERSUNDAY", array( this_year ) )+49 ) ),5)
        FormatLight(the_Othercell)
        the_Othercell.String=the_Othercell.String &" Pinsedag"      
case Left(STR(CDate(oFA.callFunction( "EASTERSUNDAY", array( this_year ) )+50 ) ),5)
        FormatLight(the_Othercell)
        the_Othercell.String=the_Othercell.String &" 2. Pinsedag"   
case Left(STR(CDate(oFA.callFunction( "EASTERSUNDAY", array( this_year ) )+26 ) ),5)
        FormatLight(the_Othercell)
        the_Othercell.String=the_Othercell.String &" St. Bededag"   
        case Left(STR(CDate(oFA.callFunction( "EASTERSUNDAY", array( this_year ) )+39 ) ),5)
        FormatLight(the_Othercell)
        the_Othercell.String=the_Othercell.String &" Kr. Himmelfartsdag"            
End Select

Next d    'Dags-loopet slutter
Next m    'Måneds-loopet slutter

End Sub

Function LastDayOfMonth(d As Date) As Date
'Beregn hvor mange dage i måneden
  Dim nYear As Integer
  Dim nMonth As Integer
  nYear = Year(d)        'Current year
  nMonth = Month(d) + 1  'Next month, unless it was December.
  If nMonth > 12 Then    'If it is December then nMonth is now 13
    nMonth = 1           'Roll the month back to 1
    nYear = nYear + 1    'but increment the year
  End If
  LastDayOfMonth = CDate(DateSerial(nYear, nMonth, 1)-1)
End Function

Function TheMonthName(m)
'Omsætter månedstal til månedsnavn
CompatibilityMode(True)
TheMonthName=MonthName(m)
End Function

Sub FormatLight(oCell)
'Formatér lys grå
        oCell.CellBackColor=rgb(200,200,200)
        oCell.CharColor=rgb(255,255,255)
End Sub

Sub FormatDark(oCell)
'Formatér overskrift
  oCell.CharHeight=18
  oCell.HoriJustify = 2
  oCell.CellBackColor=rgb(100,100,100)
  oCell.CharColor=rgb(255,255,255)
End Sub 

mandag den 25. januar 2016

TIPS: Ugenumre

Meget dag-til-dag planlægning foregår med datoer, men de fleste af os har på et eller andet tidspunkt været ude for at skulle planlægge et eller andet, f.eks. ferie ud fra ugenumre. Specielt når du skal udveksle informationer, f.eks. bestille en rejse hos et rejsebureau, er det vigtigt at du og rejsebureauet er enige om, hvilket datoformat I benytter. I skal have et fælles sprog, en fælles standard.

Hvor datoerne er ret faste i den Gregorianske kalender[1], er der desværre ikke helt enighed om ugenumre [2].

Sådan meget overordnet set, er der tre systemer: Det europæiske, det amerikanske, og så er der Excel 2003. i Europa, herunder i Danmark, benytter vi normalt ISO-8601 standarden, som giver at det i dag (25/1 2016) er uge 4. Spørger du en amerikaner om ugenummeret, ja så vil han sandsynligvis svare uge 5. Det samme gør Excel 2003.

I et regneark skal du være meget opmærksom på problemstillingen, idet lokalitetsindstillingen desværre ikke tager højde for dette, på samme måde som tidszoner og datoformater.

Hvis du skriver =KALENDERUGE(25-01-2016) får du resultatet 5, hvilket er forkert. Skriver du derimod =KALENDERUGE(25-01-2016, 21), så får du det korrekte resultat, nemlig 4. Samme resultat kunne du opnå ved at skrive =ISOUGENUM(25-01-2016).



På grund af en fejl i Excel 2003, er mange regneark udstyret med en fejlagtig beregningsmetode, hvilket har betydning for beregninger, også i LibreOffice. Excel-regneark som åbnes med LibreOffice Calc, vil derfor benytte funktionen =UGENUMMER_EXCEL2003() for at sikre samme resultat, som i Excel. Den fejl som tidligere har været i Excel og som fortsat lever videre i visse regneark, er en antagelse om at år 1900 var skudår (hvilket det ikke var). Det betyder at alle datoer (og mange ugenumre) før 1900 er beregnet forkert.

Der har tilsvarende været en fejl i OpenOffice.org Calc, som også har fået sin egen kompatibilitetsfunktion, nemlig WEEKNUM_OOO. Denne funktion kan ikke indtastes, men vil optræde, hvis du åbner et regneark med det pågældende problem.

Funktionsnavnene i denne artikel henviser til LibreOffice 5.1.


Der er ingen der har lovet at det skal være let. Pas i øvrigt også på med at benytte ugenumre i Google Spreadsheet, da standard-ugerne i Google er amerikansk.

1: https://da.wikipedia.org/wiki/Gregorianske_kalender
2: https://da.wikipedia.org/wiki/Uge



søndag den 27. december 2015

Kalender 2016

Her ved årsskiftet skal de fleste have udskiftet kalenderen. En af mine gode venner fra Brasilien, Eliane Domingos de Sousa, har lavet en årskalender i LibreOffice. Den findes som Calc regneark og som Draw tegning.

Den er til fri afbenyttelse her: https://owncloud.documentfoundation.org/public.php?service=files&t=256b12883bb2f6c315a55f3ba0016b0d