11 januari 2012

Filmpjes

Saaie presentaties?

Presentaties kunnen saai zijn als er alleen maar slides met tekst worden gebruikt. Ik gebruik zelf graag filmpjes of foto´s om specifieke onderwerpen te benadrukken. Dit zijn enkele voorbeelden, er zullen er in de loop van de tijd wel meer volgen.

De roltrap

Veel filmpjes die ik gebruik zijn van oorsprong reclame filmpjes uit America. Volgens mij komt deze uit een soort van Becel reclame. Ik gebruik hem om te benadrukken dat je out-of-the-box moet denken. Medewerkers die in een proces zitten, zien soms de meest voor de hand liggende oplossingen niet.


Monkey Business

Dit filmpje is er eentje uit een hele reeks van CarierBuilder. Allemaal geweldig! Enerzijds toont deze het belang van goede data, anderzijds van de juiste interpretatie ervan.


Terry Tate

Deze komt uit een reeks van Reebok commercials. Doet het geweldig als afsluiter; "vanaf nu gaan we het anders doen". Met een dikke knipoog.

8 december 2011

Regels verwijderen uit Excel

Wanneer ik een grote hoeveelheid rijen in Excel heb waarvan ik slechts een kleine selectie nodig heb, dan voeg ik meestal een kolom getiteld "Filter" toe waarin ik de rijen markeer die ik nodig heb. In die kolom zet ik dan deze formule:

    =IF(<conditie>;1;0)

Een bijkomend voordeel is dat, als je de hele kolom selecteert, je direct de som ziet van de rijen die in het filter zitten. Ook kan je "Autofilter" activeren via [Data]->[Filter]->[Autofilter], waarna je de kolomfilter via de dropdown op 1 zet en precies de gewenste dataset krijgt.

As je vervolgens de rijen wilt copy-pasten naar bijvoorbeeld MiniTab, dan lukt dit meestal door het autofilter er op te zetten volgens bovenstaande uitleg en de rijen te selecteren. Echter, wanneer de dataset te groot is dan kan je de melding "verwijzing te complex" (Engels: "Reference is too complex") krijgen. Hierna wordt alsnog(!) de gehele dataset naar het clipboard gestuurd. Dit kan erg irritant zijn.

Om toch de benodigde data te verkrijgen zou je de rijen kunnen verwijderen die uit het filter vallen. Op die manier houd je alleen de rijen over die je nodig hebt. Hiervoor heb ik een kleine macro geschreven die alle rijen verwijdert die de waarde 0 hebben staan in de eerste cel (dit is de kolom waarin ik eerder genoemd filter heb toegevoegd).

    Dim L as Long
    For L = Range("A65536").End(xlUp).Row To 2 Step -1
      If Cells(L, 1) = 0 Then
        Rows(L).Delete
      End If
    Next

De macro loopt van beneden naar boven in plaats van andersom omdat je anders steeds de rij overslaat die onmiddelijk na een te verwijderen rij komt. Wanneer je meer rijen hebt dan 65536 dan zal je hier de waarde van de laatste rij zelf even neer kunnen zetten.

In Excel2007/2010 kan de macro gemakkelijk toegevoegd worden door een button toe te voegen op de worksheet via [Developer]->[Insert]->[Button], waarna je [New] selecteert in de pop-up. Daarna voeg je bovenstaande code in. Voor oudere versies van Excel kan je de macro toevoegen via [Extra]->[Macro]->[Visual Basic Editor].

Als je alles goed hebt gedaan en je runt de macro dan kan het nog even duren voordat alle rijen verwijderd zijn. Maar het zal in elk geval stukken sneller gaan dan alles handmatig nalopen en verwijderen.

Let op! Als je de uitgefilterde rijen later nog nodig hebt, vergeet dan niet om de hele dataset separaat te saven vóórdat je de macro runt; er is namelijk geen weg terug!

29 november 2011

Weeknummers in Excel

Introduction

When you want to get the weeknumber from any given date, there is an Excel add-in package that provides the =WEEKNUM() function. Just go to [Tools]->[Addin] and select "Analysis Toolpack".

However, this function calculates weeknumbers according to the American standard. Which means that 1/1 always is the first day of week 1 and that week 2 starts on the first sunday or monday (depending on where you've defined your start of the week) after that. There are drawbacks here! The first week almost never has 7 days, while there are also a lot of incomplete weeks 53's or even 54's... Thus making comparison of weekresults unreliable.

Anyway I'm used to the European way to calculate weeknumbers (also known as "the ISO Week standard" ~ ISO8601:2000). In this definition thursdays play the key part. It says "all weeks begin on monday, week 1 starts on monday of the first week of the calendar year with a thursday"...

I like my weeks to start on a sunday though and furthermore I want the output to be like <YYYY><WW>. Because there is no function available in Excel that gives me the right results, I made it myself. The formula is a little complex, I'll try to explain how I came up with it. Here it goes.

Formula

When calculating the weeknumber for any given date, you always have to use the thursday in the week of that given date. Excel has a useful function for that: =WEEKDAY(). This function returns 1..7 for Sunday..Saturday (Hey! Weeks start on sunday by default). So, if my date is in A1, then this formula will allways give the thursday in the same week "THX":
"THX" = A1 - WEEKDAY(A1) + 5
This thursday becomes the actual date for which we want to calculate the desired <YYYY><WW>; output. We want to know in what year it falls to find the <YYYY> part. So our formula will be like:
= (100 * YEAR(A1 - WEEKDAY(A1) + 5)) + &lt;WW&gt;
Now we have to look into the <WW> part. All we have to do is find the first thursday "TH1" of the corresponding year, calculate the number of days between that thursday and the thursday "THX" we've initially calculated and divide this by 7: ("THX" - "TH1") / 7. Giving us the number of weeks between both thursdays.

How do we find the first thurday? Well, we try to find a date that is always in week 1 and then calculate the corresponding thursday. For this date we can't take 1/1 or 1/2 (january 1st and 2nd) because they might fall into the last week of the previous year. This happens when 12/31 (december 31st) is a thursday. Instead we take 1/3 (january 3rd) of which we know for sure it won't fall in the last week of the previous year and calculate the thursday "TH1" that belongs to it:
"TH1" = DATE(&lt;YYYY&gt;1;3) - WEEKDAY(DATE((&lt;YYYY&gt;1;3)) + 5
With this we can calculate the &lt;WW&gt; part as follows:
<WW> = 1 + (("THX" - "TH1") / 7)
Substituting all referenced formulas gives us:
<WW> = 1 + (((A1 - WEEKDAY(A1) + 5)- (DATE(YEAR(A1 - WEEKDAY(A1) + 5);1;3) - WEEKDAY(DATE((YEAR(A1 - WEEKDAY(A1) + 5);1;3)) + 5))/7)
Putting it all together:
= (100 * YEAR(A1 - WEEKDAY(A1) + 5)) + (1 + INTEGER(((A1 - WEEKDAY(A1) + 5)- (DATE(YEAR(A1 - WEEKDAY(A1) + 5);1;3) - WEEKDAY(DATE(YEAR(A1 - WEEKDAY(A1) + 5);1;3)) + 5))/7))
The dutch equivalent:
= (100 * JAAR(A1 - WEEKDAG(A1) + 5)) + (1 + INTEGER(((A1 - WEEKDAG(A1) + 5)- (DATUM(JAAR(A1 - WEEKDAG(A1) + 5);1;3) - WEEKDAG(DATUM(JAAR(A1 - WEEKDAG(A1) + 5);1;3)) + 5))/7))
Complex but working...