Tagarchief: Tijd

Urenregistratie

prikklokHoewel een echte  prikklok niet vaak meer wordt gebruikt, wordt bij veel bedrijven nog steeds gebruik gemaakt van een bepaalde manier van tijdregistratie.
Dit kan nodig zijn om binnen het bedrijf een kostenallocatiemodel te voeden of om als externe inhuur verantwoording af te leggen over de in rekening gebrachte uren, enzovoort.

Daarom in dit artikel aandacht voor Excel als hulpmiddel voor urenregistratie; inclusief wat VBA om het gebruik wat makkelijker te maken.

Basis

Het is een goede gewoonte om bij de opbouw van een Excel-systeem een scheiding aan te brengen tussen de diverse onderdelen; in dit geval hebben we dan ook de invoer van de gemaakte uren en de rapportage daarover in aparte tabbladen opgenomen.

In het Voorbeeldbestand is dit verder uitgewerkt.
De registratie en rapportage zijn geen complexe items, maar we kunnen wel diverse handige Excel-trucjes gebruiken om het systeem flexibeler en fraaier te maken.

uren1

Laten we de kolommen in het tabblad Invoer eens langs lopen:

  1. in kolom A komt de datum: in cel A4 staat de eerste datum waarop de registratie is begonnen; in A5 staat de formule =A4+1; in A6 de formule =A5+1 etc.
    Het voordeel hiervan is, dat als we met een nieuwe registratie willen beginnen, we alleen de datum in cel A4 hoeven te wijzigen
  2. voor een snel inzicht tonen we in kolom B de dag van de week; niet via een Excel-functie Weekdag (die geeft alleen het volgnummer in de week) maar door opmaak.
    De formule in B4 is =A4.
    NB De invoer is als tabel in Excel opgezet; dat houdt onder andere in, dat als je zo’n formule in B4 intypt deze automatisch in de rest van de kolom wordt overgenomen (maar wel met een verwijzing naar A5, A6 etc).
    Via de celeigenschappen hebben de cellen in kolom B een speciale datumopmaak meegekregen, namelijk dddd. Deze zorgt er voor, dat de datum als volledige weekdag wordt weergegeven.
    NB experimenteer met het aantal d’s en kijk wat dit voor invloed heeft op de opmaak.
  3. in kolom C wordt per dag de begintijd ingevoerd
  4. we gaan er van uit, dat een dag uit 2 blokken bestaat; in D komt dan de eindtijd van blok1, in E een eventueel begin van blok2  en in F een eventueel einde.
    De opmaak van de kolommen C, D, E en F is u:mm (dus minstens 1 positie voor het uur en altijd 2 voor de minuten).
  5. uren2dan wordt het spannender: in kolom G komt een formule, die de gewerkte tijd (nou ja, de aanwezigheid) berekent. Dit gebeurt in 2 gedeeltes: in de eerste Als berekenen we het verschil tussen begin- en eindtijd van het eerste blok (als er nog geen eindtijd is (D4=””) dan maken we dat verschil gelijk aan 0); en we tellen daar het resultaat van de tweede Als bij op, die een eventueel verschil van blok2 bepaalt.
    Ook deze kolom krijgt als opmaak u:mm, omdat we natuurlijk het resultaat in uren en minuten willen weten.
    Wanneer het resultaat nul is (in het weekend of op andere (nog) niet gewerkte dagen), willen we in kolom G niets zien: de opmaak is dan ook uitgebreid met een extra voorwaarde: uren3
  6. Kolom H bevat ook het aantal uren, maar nu uitgedrukt als een decimaal getal. Om de gehanteerde formule in die kolom te begrijpen, moet je weten, dat Excel een tijd als een deel van een gehele dag opslaat: 24 uur is het getal 1, 12 uur is 1/2, 6 uur wordt vastgelegd als 1/4 etc.
    Andersom: willen we de tijd uit kolom G (die dus als fractie van een hele dag is opgeslagen) weergeven als uren, dan moeten we die tijd met 24 vermenigvuldigen. Aangezien we met een Excel-tabel werken, wordt dit via een zogenaamde gestructureerde verwijzing in de formule weergegeven: uren4
    (Op tabellen en gestructureerde verwijzingen zal ik een andere keer terugkomen)
  7. in kolom I kunnen (relevante) opmerkingen, die de registratie verduidelijken, worden opgenomen.

Rapportage

De maandrapportage van de tijdsbesteding is in het Voorbeeldbestand in het tabblad MndOvz opgenomen.
Door de datum van de eerste van een maand op te geven, worden op deze pagina de bij die maand behorende gegevens uit de database opgehaald. Hierbij wordt een alternatief voor verticaal zoeken gebruikt.

uren5

  1. van de bovenste 6 rijen is alleen cel D5 echt van belang: deze geeft aan van welke maand de gegevens worden weergegeven (de eerste van de maand moet worden ingetikt; de opmaak laat alleen maar maand en jaar zien).
    De rest is verfraaiing/toelichting.
  2. in kolom B staan vanaf regel 11 de dagen van de betreffende maand weergegeven; althans het volgnummer van de dagen.
  3. in kolom C staat de werkelijke dag, via de formule =$D$5+B11-1 (dus bij de eerste van de maand (D5) wordt het volgnummer opgeteld; omdat we dan altijd 1 dag te ver uitkomen trekken we er nog 1 vanaf).
    NB1 Kolom C is niet verborgen, maar via groepering ‘dichtgeklapt’. Klik op het +-teken boven D om kolom C zichtbaar te maken. Groeperen zit in de menutab Gegevens, in het blok Overzicht.
    NB2 aangezien we natuurlijk alleen maar datums uit de betreffende maand willen zien (en bijvoorbeeld geen 31 april) is de formule vanaf C12 iets ingewikkelder.
  4. laten we dan eens kijken wat de formule in D11 doet:
    =ALS.FOUT(INDEX(Uren;VERGELIJKEN($C11;Uren[Datum];0);D$10);””)
    Uren is de naam van de tabel uit het invoerblad.
    Uren[Datum] is de datum-kolom in die tabel.
    VERGELIJKEN($C11;Uren[Datum];0) kijkt op welke plaats de waarde uit C11 (in dit geval dus 1 april) in die kolom staat; de 0 zorgt er voor, dat Excel de waarde zoekt, onafhankelijk in welke volgorde die ook zouden staan (een exacte match dus).
    INDEX(Uren; ‘plaats van datum’ ;D$10) geeft de waarde van díe cel in de tabel Uren, die in de rij ‘plaats van datum’ staat en in de kolom, die overeenkomt met de waarde in cel D10.
    ALS.FOUT geeft een lege waarde (“”) als één van de formules INDEX of VERGELIJKEN een fout oplevert (bijvoorbeeld als de datum uit C11 niet in de tabel Uren voorkomt).
    NB in het overzicht staat ook een dichtgeklapte rij 10; daar staat in welke kolom Index moet zoeken.
  5. de overige cellen in het overzicht zijn op eenzelfde manier opgezet
  6. onderaan staat nog een totaaltelling: in cel I42 worden de ‘decimale’ uren opgeteld. In H42 de ‘normale’ uren en minuten; wanneer het aantal uren boven de 24 komt, zal Excel standaard weer opnieuw bij 0 beginnen. Willen we die uren boven de 24 zichtbaar maken dan dienen we de betreffende cel een andere opmaak mee te geven: uren6. Let op de vierkante haken!

VBA

Om het gebruik van het spreadsheet wat te vergemakkelijken is nog een VBA-routine toegevoegd.
De bedoeling van de routine is om bij het openen van het bestand de cursor op de juiste plaats te hebben staan om snel nieuwe invoer te kunnen doen.

De VBA-routine gaat automatisch naar het Invoer-blad en zoekt de regel op net onder de laatste invoer.
uren7
VBA-routines worden veelal opgeslagen in zogenaamde Modules; omdat deze routine direct actief moet worden wanneer de werkmap (in het Engels Workbook) wordt geopend staat deze routine in de map ThisWorkbook en heeft de naam Workbook_Open gekregen.

Laten we de routine even stapsgewijs doorlopen:

  1. open het Voorbeeldbestand
  2. ga naar Visual Basic (bijvoorbeeld via de toetscombinatie Alt-F11)
  3. dubbelklik op de map ThisWorkbook
  4. de routine begint met wat toelichtende commentaarregels (de groene regels na de apostrof)
  5. uren8dan worden 2 variabelen gedeclareerd, die we hierna nodig hebben (strGebrNaam en strDagDeel)
  6. de 2 variabelen worden gevuld; de bedoeling lijkt me duidelijk
  7. en dan het ‘echte’ werk:
    uren9
    Eerst selecteren we het tabblad (de sheet) Invoer; dan selecteren we in de kop (Header) van de tabel Uren de cel met het woord Datum.
    Vervolgens wordt de toets-combinatie Ctrl-Pijl-naar-beneden nagebootst en dus de onderste gevulde datum geselecteerd.
    Dan 2 kolommen naar rechts om in de kolom Begin1 te komen, waar we via Ctrl-Pijl-naar-boven de laatst gevulde cel zoeken.
    Die is al gevuld, dus selecteren we de cel daaronder.
    Als laatste wordt een pop-up op het scherm getoond.
    NB vbCrLf is de code, die er voor zorgt dat de volgende tekst, die via het &-teken aan het voorgaande wordt ‘geplakt’, 1 regel lager zal komen (een zogenaamde harde-return). Zie Teksten samenvoegen voor uitleg.

Als de VBA-routine niet duidelijk is, laat dan commentaar of een vraag achter op de website.


GPX? XML! dus Excel

StravaVorige week heb ik een fietstocht georganiseerd voor een groep collega’s; mooi weer, wat heuvels, prachtige omgeving, gezellige mensen: wat wil een mens nog meer?
Nou, wat minder discussie over het aantal gefietste kilometers en de geklommen hoogtemeters zou prettig zijn!

Zeker nu steeds meer fietsers gebruik maken van een GPS (al dan niet op de smartphone) en de kilometers op Strava worden gezet, eindigt een fietstocht vaak in een langdurige twist over de exacte cijfers van de geleverde prestatie.
Trouwens niet alleen bij het fietsen gebeurt dit; ik ken een fanatieke groep wandelaars waar na een tocht flink wordt overlegd welk aantal kilometers aan het thuisfront kan worden gemeld (het hoogste natuurlijk!).

GPX

Om te onderzoeken waar de verschillen door worden veroorzaakt, kwam ik er al snel achter, dat dit inherent is aan het gebruik van een GPS. De verbinding met de satellieten is niet altijd optimaal, waardoor verstoringen kunnen optreden. Zeker wanneer het gaat over het meten van de hoogte, laat menige GPS nog wel eens een steek vallen. Of ineens is de ontvangst beter en geeft de GPS een stijging (of daling) aan terwijl je stil staat!

Om de resultaten beter te kunnen vergelijken heb ik de tocht, die ik op Strava had gezet, geëxporteerd naar een GPX-bestand. Dit type bestand wordt bij navigatie-software meestal als standaard voor uitwisseling gebruikt. Soms is een dergelijk bestand direct van de GPS of smartphone te downloaden; anders kun je het omzetten met behulp van een programma als bijvoorbeeld Basecamp.

Nader onderzoek (met het alom gewaardeerde hulpmiddel Kladblok) leverde op, dat het eigenlijk een XML-bestand is.

XML

XML begint de Haarlemmermeerolie voor bestandsuitwisseling te worden. Deze standaard wordt door steeds meer pakketten ondersteund, waaronder zeker ook al jaren door Excel!

Waarom ik als titel voor deze blog “GPX? XML! dus Excel” heb gebruikt mag nu duidelijk zijn.

GPX importeren in Excel

Het voert te ver om hier alles rond XML uit de doeken te doen, dus ik geef een verkorte handleiding hoe de GPX-file in te lezen in Excel:

  1. Open Excel, zorg dat er geen bestand geopend is
  2. download een GPX-bestand (van Strava, GPS, internet)
  3. sleep het GPX-bestand naar het Excel-symbool op de werkbalk, Excel klapt dan open, sleep het GPX-bestand nu in Excel (de cursor krijgt dan een plusje) en laat de muis-button los
  4. Excel geeft een foutmelding, maar die negeren we gewoon, dus op JXMLa klikken
  5. in het volgende dialoogscherm kies je de eerste optie (Als een XML-tabel)
  6. 2 keer waarschuwingen negeren door OK te klikken en daar is onze route!

XML2

Excel maakt er direct een zogenaamde tabel van; in latere verwijzingen zie je de naam Tabel2 terugkomen. Binnenkort toch eens wat vertellen over de (nieuwe) mogelijkheden van tabellen!

Niet alle kolommen zijn voor ons interessant, maar E en F leveren de coördinaten (lat=latitude/breedtegraad, lon=longitude/lengtegraad), G de hoogte (ele=elevation), H een samengepakte vorm van de dag en het bijbehorende tijdstip en I de temperatuur op dat moment.

GPX-analyse

We gaan dit bestandje nu verder analyseren: download het Voorbeeldbestand.

In het eerste werkblad staan de gegevens van Strava. Ik heb een tweede werkblad aangemaakt (Berek), waarin we diverse berekende kolommen zien:

  1. in kolom A ‘knippen’ we het tijdstipXML3 los van de datum door een DEEL er van te pakken. Aangezien dit dan een tekst is, maken we er via TIJDWAARDE een echte tijd van.
  2. in B3 staat de formule
    =AFRONDEN(6370973,27862*((2*BOOGSIN(WORTEL((SIN((RADIALEN(Strava!E2)-RADIALEN(Strava!E3))/2)^2)+COS(RADIALEN(Strava!E2))*COS(RADIALEN(Strava!E3))*(SIN((RADIALEN(Strava!F2)-RADIALEN(Strava!F3))/2)^2)))));0)
    Het voert te ver om deze door te spitten, maar uit de coördinaten van het tijdstip uit regel 3 en die van de vorige regel, wordt de afstand daartussen bepaald (in meters).
  3. in C gaan we die meters gecumuleerd volgen (als kilometers)
  4. D bevat de verstreken tijd tussen twee metingen en E de gecumuleerde tijd
  5. en in F staat de snelheid: B gedeeld door D.
    Wel even opletten: we willen de snelheid in km/uur, dus de getallen in B moeten gedeeld worden door 1.000; aangezien in Excel een tijd intern als fractie van een dag wordt vastgelegd (dus 6 uur wordt in Excel 0,25 etc) vermenigvuldigen we de getallen in D nog met 24 om er uren van te maken.

Bestudering van de resultaten verklaart al wat van de vreemde snelheidsgrafieken in Strava en andere software: tussen veel metingen zitten soms maar enkele seconden en slechts luttele meters (toch eens harder gaan fietsen!). Aangezien we hier dan met relatief grote afrondingen zitten, kan het resultaat (de snelheid) ook behoorlijk variëren.

Om dit effect te verkleinen heb ik nog wat kolommen toegevoegd, waarin ik de snelheid niet tussen 2 opeenvolgende metingen bepaal, maar de intervallen vergroot. Hierdoor wordt het afrondingsprobleem voor een gedeelte uitgemiddeld.

Google Maps

Om makkelijk te kunnen analyseren waarom de snelheid op sommige stukken zo hoog (of laag) is heb ik in kolom K nog een hyperlink naar Google-maps toegevoegd:
=HYPERLINK(“http://maps.google.nl/maps?q=”&SUBSTITUEREN(Tabel2[@lat];”,”;”.”)&”,”&SUBSTITUEREN(Tabel2[@lon];”,”;”.”))

Meestal zoek je in Google-maps via een plaatsnaam en/of adres, maar je kunt ook coördinaten opgeven.
Aangezien Google een punt als decimaal scheidingsteken verwacht (de 2 coördinaten worden door een komma gescheiden), voeren we op de lat en lon een substitutie uit. Het resultaat kan er dan als volgend uitzien:
http://maps.google.nl/maps?q=50.867841,5.99487

Grafieken

XML-grafiekOmdat zoveel detail-informatie zoals weergegeven in het werkblad Berek zich uitstekend leent om grafisch weer te geven, heb ik een werkblad Grafieken toegevoegd.

De bovenste grafiek komt uit Strava; in de tweede is duidelijk te zien, dat de berekende snelheid (met een interval van 4 metingen) heel goed aansluit bij Strava!

In de derde grafiek zijn de hoogte en de snelheid niet tegen de afstand maar tegen de tijd uitgezet. XML5
Dan valt direct een vreemd stuk op in de grafiek. Bij de afstand-grafiek liep de lijn door; bij de tijd zit een onderbreking??

Hier is goed te zien hoe slecht de (mijn?) GPS met hoogtes omgaat: na de pauze waren we echt niet gestegen (alleen koffie gedronken!).

LET OP: bij het maken van dergelijke grafieken (waar de gegevens voor de x-as niet gelijkmatig zijn verdeeld; de ene keer 1 sec, dan weer 5 sec), kun je geen gewone Lijn-grafiek nemen; kies dan Spreiding als grafiektype.