vrijdag 12 augustus 2016

Friesland: Oude grafzerken uit Driesum tevoorschijn

De kerk van Driesum wordt momenteel gerestaureerd. Ook de vloer wordt vervangen. De huidige vloer is momenteel verwijderd en daarmee zijn de eeuwenoude grafzerken weer tevoorschijn gekomen. Tijd voor de Grêfskfriftekommisje om een kijkje te nemen. De teksten zijn nog onder voorbehoud. Alle foto's zijn van Melle Koopmans.

Grafzerk 1


Anno 1581 de 20 [marty] sterf de edele erentfeste heerschap Tjepke van Goslinga

Anno 1582 den 5 ivly sterf de edele eerbare juffrou Anna van Liaukama sijn huisfrou

De steen is sterk beschadigd. Alleen delen van de tekst zijn nog leesbaar. Wel zijn alle familiewapens nog goed zichtbaar. We tonen hier de wapens GOSLINGA - LIAUCKEMA


Een tak van de familie GOSLINGA was enige geslachten lang woonachtig in Driesum. De familie woonde op Jarichsma State. Deze state was net als de Canter State gelegen op de Driesumer terp (zie grafzerk 2). Deze terp is in de tweede wereldoorlog afgegraven.

Tjepke van Goslinga maakte deel uit van het Verbond der Edelen en werd als zodanig in 1568 door Aylva gedagvaard te Antwerpen. Wikipedia: Het Verbond der Edelen (ook Compromis) was een verbond van de lagere adel, voornamelijk uit de Zuidelijke Nederlanden, dat de opheffing vroeg van de Inquisitie en de verzachting van de vervolgingen van de protestanten met maatregelen tegen de ketters (november 1565). Het maakte deel uit van de aanloop naar de Tachtigjarige Oorlog.

Voor een overzicht van de deelnemers aan het Verbond der Edelen, zie Leden Verbond.

Van Anna van Liauckama is een testament bewaard gebleven. In dit testament laat ze de state na aan Tjepke van Aylva, de kleinzoon van schoonzuster Frouck van GoslingaWillem Hansma is dit nog aan het bestuderen.

Onder deze steen bevindt zich een grafkelder waarvan we een foto hebben:

Foto: Syb Eldering

Grafzerk 2


Anno 1630 den 7 september is gestorven den eersamen Iacob Canter van Oosten out 68 iaer ende leyt alhier begraven

Anno 1710 den 26 september is in den heere ontslapen den ... erentvesten ... Ericus van Haersma in leven raad ter admiraliteyt in Frisland en burgermeester der stede Harlingen out synde 63 iaren en vyf maanden ende leyt alhier begraven

De Canters waren de bewoners van de Canter State, zie hiervoor
http://www.stinseninfriesland.nl/CanterStateDriesum.htm

Van de Canter State is niets meer terug te vinden. De plek is wel bekend. Vlak boven de Strobossertrekvaart aan de Terpwei:


Ericus van Haersma was de echtgenoot van Anna Clara van Canter (zie grafzerk 3). Hij was de eigenaar van de Haersma State te Oostermeer.

Grafzerk 3


Anno 1633 den 6 january is gestorven de eerbare Machel Vos de huisvrouw van Jacob Canter van Oosten oud 64 jaar en lyt alhier begraven

Anno 1724 den 26 ianuarius is in den heere gerust vrouw Anne Clare Canter wed: wyl: ... Ericus van Haersma in leven raed ter admiraliteit in Friesland en burgemeester der stede Harlingen oud 69 iaren 4 maanden en 23 dagen en leit alhier begraven

Anna van Canter gaat na de dood van haar echtgenoot definitief op de Canter State wonen.

Grafzerk 4


Anno 1719 den 5 dec stierf vrouwe Sjoerdie van Haersma in leven huisvrouw van Arnold van Idsinga secretaris der [stede Harlingen] ...

Sjoerdje van Haersma was een dochter van Erik Meierts van Haersma en Anna Clara Franses Canter (zie grafzerk 2 en 3).

Grafzerk 5


...[Arnold] van Idsinga den iaere 1711 tot 1738 wegens deze grietenije gecommitteerde staet ... [17]39 oud ... daegen

Arnold van Idsinga was de echtgenoot van Sjoerdje van Haersma (zie grafzerk 4)

Grafzerk 6


[Iuffer] Sioertie van Idsinga geboren den 13 december 1730 overleden den 16 november 1741

Sjoerdje van Idsinga was de dochter van Frans Canter van Idsinga en Saapke Poutsma

Grafzerk 7


...br heer ir F.D. van Sytzama anno 1745

De Van Sytzama's bewoonden lange tijd de Rinsma State. Ir is hier de afkorting van jonker.

Grafzerk 8


Vrouw Geertruid van Haersma weduwe van de heere Titus Sloterdyk in leeven raad ordinaris in den hove van Friesland gestorwen den 16 iuni 1762 oud bynae 84 iaeren rust hier in verwagting van een beeter leeven

Geertruida van Haersma was een dochter van Erik Meierts van Haersma en Anna Clara Franses Canter (zie grafzerk 2 en 3).

Grafzerk 9


Vrouwe Syoertie van Idsinga in leeven egtgenoote van dr P:I: Poutsma secretarius van Dantumadeel overleeden den 23ste juny 1768 oudt in't 49ste iaar legt hier begraven

Sjoerdje van Idsinga was de dochter van Arnold van Idsinga en Sjoerdje van Haersma (zie grafzerk 4 en 5)

Grafzerk 10


Petrus Johannes Poutsma in leven secretaris en ontvanger der boelgoederen van Dantumadeel overleden den 20 sepbr 1780 out 55 jaar en ligt alhier begraven

Petrus Johannes Poutsma was de echtgenoot van Sjoerdje van Idsinga (zie grafzerk 9).

Grafzerk 11


De hoogedel gestrenge heer mr. Adrianus Canter Visscher grietman over Dantumadeel en gecomiteerde staten landts dage e.e. overleden den 19 en begraven den 26 july 1782

Het famiewapen is van de familie CANTER VISSCHER. Over Adrianus Canter Visscher is een artikel geschreven door Bauke van der Pol: Van koopman naar grietman.

Grafzerk 12


Canter

Onduidelijk is op welk lid van de familie Canter deze steen betrekking heeft.

Grafzerk 13


... ir F.D. van [Sytzama] 6 anno 1745

Grafzerk 14


... Goslinga ...

Gezien de grootte van de zerk zou het wel eens om een kinderzerk kunnen gaan. De wapens zijn GOSLINGA - AGGAMA. Het moet hier dan wel om een kind van het echtpaar Feye van Goslinga en Ynts van Aggama gaan. Van dit echtpaar zijn tot nu toe geen kinderen bekend.

Feye van Goslinga was de oudere broer van Tjepke van Goslinga van zerk 1. Van Feye en Ynts zijn verder geen gegevens bekend, alleen dat Ynts naderhand getrouwd was met Worp van Tjaerda. Feye staat ook niet te boek als lid van het Verbond der Edelen; Ynts broer Alef van Aggema wel.

----------------------------------------------------------------------------------------------------------------

Voor een totaal overzicht van memorabilia uit Driesum: http://www.walmar.nl/inscripties.asp

Voor een overzicht van de familiewapens: http://www.walmar.nl/inscripties.asp

vrijdag 17 juni 2016

Excel: lastige berekening gewogen percentage opgelost met matrix functies

Gewogen percentage

Een ogenschijnlijk simpele vraag leidt tot het nodige denkwerk.


Een collega kwam met het volgende simpele tabelletje:

Categorie # Items # Incidenten
a 1 1
b 1 1
c 5 1
d 1 1
e 1 1
f 1 3
g 1 1
h 1 1
i 3 1
j 1 1

De vraag was hoe het gewogen percentage te berekenen per categorie. Het heeft enige hoofdbrekens gekost maar uiteindelijk hebben we de oplossing.

In dit geval weegt het aantal incidenten zwaarder naarmate er minder items zijn. Zijn er minder items zijn, dan geldt het omgekeerde. Dit betekent dat we het aantal incidenten moeten delen op het aantal items.

Dit leidt in kolom D tot een simpele formule:

=C2/B2

Deze formule kunnen we dan doortrekken naar beneden. Om nu tot een gewogen percentage te komen moeten we de uitkomst delen door de som van alle delingen:

=SOM($C$2:$C$11/$B$2:$B$11)

Voor de juiste berekening moeten we hier een matrix formule van maken. Dat wil zeggen dat we de functie moeten bevestigen door op CTRL SHIFT + ENTER te drukken (in plaats van gewoon op ENTER)

De uiteindelijke formule wordt dan:

{=C2/B2/(SOM($C$2:$C$11/$B$2:$B$11))}

Deze kunnen we weer doortrekken naar beneden. Het uiteindelijk resultaat wordt dan:

Categorie # Items # Incidenten gewogen per categorie in %
a 1 1 9,49%
b 1 1 9,49%
c 5 1 1,90%
d 1 1 9,49%
e 1 1 9,49%
f 1 3 28,48%
g 1 1 9,49%
h 1 1 9,49%
i 3 1 3,16%
j 1 1 9,49%

Matrix berekening

Het verschil tussen een matrix berekening en een gewone berekening is duidelijk te zien in het volgende voorbeeld:

Categorie # Items # Incidenten gewogen per categorie in % Matrix Normaal
a 1 1 9,49% 10,53333 1
b 1 1 9,49% 10,53333 1
c 5 1 1,90% 10,53333 0,2
d 1 1 9,49% 10,53333 1
e 1 1 9,49% 10,53333 1
f 1 3 28,48% 10,53333 3
g 1 1 9,49% 10,53333 1
h 1 1 9,49% 10,53333 1
i 3 1 3,16% 10,53333 0,333333
j 1 1 9,49% 10,53333 1

In de voorlaatste kolom staat de formule:

{=(SOM($C$2:$C$11/$B$2:$B$11))}

Daar wordt het totaal berekend van alle delingen per rij.

In de laatste kolom staat de formule:

=(SOM($C$2:$C$11/$B$2:$B$11))

Daar wordt het totaal van de deling per rij. De functie SOM is daar in feite overbodig. We hadden er ook kunnen neerzetten:

=($C$2:$C$11/$B$2:$B$11)

of gewoon:

=C2/B2

en dan die formule doortrekken.

Bijbehorende bestand ExcelGewogenPercentage.xlsx is te downloaden via:

donderdag 16 juni 2016

VBA: script om internet explorer pagina's geautomatiseerd om te zetten in PDF's

De aanleiding voor dit script is de behoefte om geautomatiseerd een aantal rapporten van Reporting Services om te zetten naar PDF formaat.

Het onderstaande VBA script is algemeen te gebruiken om een willekeurige internet pagina om te zetten naar PDF. Het kan aangeroepen worden vanuit elk Office pakket. Zelf heb ik het gemaakt in Access.

Voor het omzetten van de internet pagina naar PDF heb ik gebruik gemaakt van de PDFCreator. Dit kan gratis worden gedownload: http://www.pdfforge.org/

De PDFCreator kan als printer worden aangeroepen met VBA. Binnen dit programma kunnen we een aantal zaken instellen zoals de map waarin we de PDF's willen opslaan.


Het VBA script:

'functie nodig om de standaard printer aan te passen
Private Declare Function SetDefaultPrinter Lib "winspool.drv" Alias "SetDefaultPrinterA" (ByVal pszPrinter As String) As Long

Sub printURL()
    Dim objExplorer As Object
    Dim lngQuery As Long 'geef waarde QueryStatusWB
    Dim intTeller As Integer
    Dim sglTime As Single
    Dim prtDefault As Printer
    Dim strURL As String

    'URL instellen
    strURL = "http://www.google.nl"

    'Internet Explorer starten, zichtbaar maken en van een pagina voorzien
    Set objExplorer = CreateObject("InternetExplorer.Application")
    objExplorer.Visible = True
    objExplorer.Navigate strURL

    'startprinter vastleggen
    Set prtDefault = Application.Printer 'huidige printer vastleggen
    'MsgBox prtDefault.DeviceName

    'printer instellen door functie aan te roepen; download PDFcreator
    SetDefaultPrinter ("PDFCreator")

Herhaal:
        'Wacht 5 seconden zodat IE de pagina kan laden
        sglTime = Timer
        Do While sglTime > Timer - 5
            DoEvents
            'The DoEvents function surrenders execution of the macro so that the operating system can process other events.
            'The DoEvents function passes control from the application to the operating system.
        Loop
        lngQuery = objExplorer.QueryStatusWB(6)  'command status van de printer

        If lngQuery And 2 Then
            objExplorer.ExecWB 6, 2, "", ""   'Ok om af te drukken? Voer het Printcommando uit (6) zonder print venster te tonen (2)
            '1 toont print venster wel
            'wacht 5 seconden zodat IE kan afdrukken
            sglTime = Timer
            Do While sglTime > Timer - 5
                DoEvents
            Loop
        Else
            GoTo Herhaal
        End If

    'internet explorer sluiten en object verwijderen
    objExplorer.Quit
    Set objExplorer = Nothing

    'oorspronkelijke printer terugzetten
    SetDefaultPrinter (prtDefault.DeviceName)
End Sub

vrijdag 3 juni 2016

Excel: VBA script om wachtwoord te verwijderen

Af en toe krijg ik een vraag om een wachtwoord van een Excel blad te halen. Doodsimpel met VBA. Hier een script dat ik gebruik:

Sub WachtwoordCrack()
    Dim a As Integer, b As Integer, c As Integer, d As Integer, _
    e As Integer, f As Integer, g As Integer, h As Integer, _ 
I As Integer, j As Integer, k, m As Integer
    Dim begin As Date, eind As Date
    Dim duur As String
    Dim objSheet As Worksheet
    begin = TimeValue(Time)
    On Error Resume Next
    For Each objSheet In Application.Worksheets
        For a = 65 To 66: For b = 65 To 66: For c = 65 To 66
            For d = 65 To 66: For e = 65 To 66: For f = 65 To 66
                For g = 65 To 66: For h = 65 To 66: For I = 65 To 66
                    For j = 65 To 66: For k = 65 To 66: For m = 32 To 126
                        ActiveSheet.Unprotect Chr(a) & Chr(b) & _ 
 Chr(c) & Chr(d) & Chr(e) & Chr(f) & _ 
 Chr(g) & Chr(h) & Chr(I) & Chr(j) & Chr(k) & Chr(m)
                        If ActiveSheet.ProtectContents = False Then
                            eind = TimeValue(Time)
                            duur = Format(eind - begin, "hh:mm:ss")
                                MsgBox "Werkblad is wachtwoord-vrij." _
                                & Chr(10) & "in: " & Chr(10) & Chr(10) & duur, vbInformation, "Kraker"
                            Exit Sub
                        End If
                    Next: Next: Next
                Next: Next: Next
            Next: Next: Next
        Next: Next: Next
    Next
End Sub

Even kopiëren naar een Excel VBA module en draaien maar.

Het script verwijdert geen wachtwoorden die op de VBA code zijn gezet.

dinsdag 31 mei 2016

Excel: VBA en het zoeken en plaatsen van plaatjes bij producten

Laatste tijd een aantal keren mensen gezien die in Excel werken met een productenlijst met plaatjes. Die plaatjes plakken ze er dan zelf bij. Wat een werk! Met VBA is zoiets simpel te regelen. Plaatjes worden automatisch bij het artikelnummer gezocht en eventueel vernieuwd. Uiteraard moet er wel een map met plaatjes zijn en moeten de namen van de plaatjes gerelateerd zijn aan het artikelnummer.

In het onderstaande voorbeeld heb ik dit uitgewerkt.


Het Excel voorbeeld bestaat uit twee bladen. De eerste heet Plaatjes en bevat de artikelnummers en een knop. Bij een druk op deze knop zoekt het VBA script het juiste plaatje erbij. Wordt dit niet gevonden dan plaatst het een blauwe cirkel met een kruis. De regelhoogte en de grootte van het plaatje worden automatisch ingesteld aan de hand van variabelen uit het tweede blad.

 Het tweede blad heet Constanten. Hierin worden een aantal instellingen gedefinieerd:

Naam Inhoud
Pad D:\walmar domino\images\
Extensie .jpg
Afstand links 100
Breedte 70
Hoogte 70

Het VBA script ziet er als volgt uit:

Sub plaatjestoevoegen()
    'definiëren variabelen
    Dim shpPlaatje As Shape
    Dim intLinks As Integer, intTop As Integer, intBreedte As Integer, intHoogte As Integer
    Dim intRows As Integer
    Dim rngCel As Range
    Dim strPad As String, strExtensie As String
    
    'vullen variabelen
    'kunnen ook uit een constantenblad komen
    strPad = Worksheets("constanten").Range("b2")
    strExtensie = Worksheets("constanten").Range("b3")
    intLinks = Worksheets("constanten").Range("b4")
    intBreedte = Worksheets("constanten").Range("b5")
    intHoogte = Worksheets("constanten").Range("b6")
    
    intTop = Rows("1:1").RowHeight
    intRows = ActiveSheet.UsedRange.Rows.Count
    
    'juiste blad activeren
    Worksheets("plaatjes").Activate
    
    'rijhoogte instellen voor het gebied met plaatjes
    ActiveSheet.Rows("2:" & intRows).RowHeight = 15
    ActiveSheet.Rows("2:" & intRows).RowHeight = intHoogte
    
    'wissen aanwezige plaatjes, behalve button; vervangen lukt niet met VBA
    For Each shpPlaatje In ActiveSheet.Shapes
        If shpPlaatje.Name <> "Button 3" Then
            shpPlaatje.Delete
        End If
    Next
    
    'plaatsen plaatjes
    For Each rngCel In ActiveSheet.UsedRange.Columns(1).Cells
        If rngCel.Address <> "$A$1" Then
            'testen of plaatje bestaat
            If Dir(strPad & rngCel.Value & strExtensie) <> "" Then
                ActiveSheet.Shapes.AddPicture strPad & rngCel.Value & strExtensie, _
                True, True, intLinks, intTop, intBreedte, intHoogte
            Else
                ActiveSheet.Shapes.AddShape(msoShapeFlowchartSummingJunction, intLinks, _                       intTop, intBreedte, intHoogte).Select
            End If
            intTop = intTop + intHoogte
        End If
    Next

    'A1 selecteren
    ActiveSheet.Cells(1, 1).Select
End Sub


donderdag 19 mei 2016

Report Builder: Trouble With Multivalue Parameters With Too Many Values

The other day I ran in to a problem with Report Builder. I had a number of multi value parameters with a lot of values. And there was a single value parameter for selecting items too. The report rendered fine in design mode. But as soon as I published it, it was no longer rendering properly.

The mutli value parameters also contained values which would not give any result at all given a certain item number. But then again, in design node no problem.

The solution I finally came up with was to interrelate the multi value parameters to the single value parameter by using a SQL  subquery.


Let's look at this example I created based on the NorthWind database. My main dataset:

SELECT        Customers.CustomerID, Customers.CompanyName, [Order Details].OrderID, [Order Details].ProductID, [Order Details].UnitPrice, [Order Details].Quantity, [Order Details].Discount, 
                         Orders.OrderDate, Products.ProductName
FROM            Orders INNER JOIN
                         [Order Details] ON Orders.OrderID = [Order Details].OrderID INNER JOIN
                         Customers ON Orders.CustomerID = Customers.CustomerID INNER JOIN
                         Products ON [Order Details].ProductID = Products.ProductID

Two more datastes for the multi value parameters:

Parameter: parProduct
select ProductID, ProductName from Products
where ProductID in
(
select ProductID  from vwOrdersCustomers
where OrderId = @parOrder)

Parameter:  parCustomer
select CustomerID, CompanyName from Customers
where CustomerID in
(
select CustomerID from vwOrdersCustomers
where OrderId = @parOrder)

And a single value parameter: parOrder.

woensdag 18 mei 2016

Excel: validatie op basis van een benoemde kolom binnen een Excel Tabel

Er zijn in Excel een aantal manieren op een cel te valideren met een lijst. Ik loop ze hier langs.

A. Met een gewoon bereik:


Probleem: als er waarden worden toegevoegd, breidt het gekozen bereik zich niet automatisch uit.

B. Met een formule

Op de plek van Bron zetten we bijvoorbeeld:

=VERSCHUIVING(lijsten!$C$2;0;0;AANTALARG(lijsten!$C:$C)-1;1)

Dit heeft als voordeel dat het gekozen bereik zich automatisch uitbreidt. Komt er een element bij, dan wordt deze ook in de lijst getoond. Nadeel is dat de formule enigszins bewerkelijk is.

C. Met een naam

Op de plek van Bron zetten we dan bijvoorbeeld:

=Lijst_met_functie_Index

Een dergelijke naam verwijst dan naar een formule. In dit geval hebben we een aantal mogelijkheden:

=VERSCHUIVING(lijsten!$C$2;0;0;AANTALARG(lijsten!$C:$C)-1;1)

of bijvoorbeeld:

=INDEX(lijsten!$C:$C;2;1):INDEX(lijsten!$C:$C;AANTALARG(lijsten!$C:$C);1)

Namen met zulke formules hebben als voordeel dat het gekozen bereik zich automatisch uitbreidt. Komt er een element bij, dan wordt deze ook in de lijst getoond. Nadeel is dat de formules enigszins bewerkelijk zijn.

D: Met een naam binnen een tabel
We maken dan van een reeks eerst een tabel:


De naam van de tabel passen we vervolgens aan: 


Binnen deze tabel selecteren we de kolom A2:A7 en geven die een naam:


Deze naam ziet er dan enigszins eigenaardig uit:

=LijstMetEenTabel[[#Alles];[Lijst met een tabel]]

Het laatste stuk verwijst naar de kolomnaam. Als we dan bij gegevensvalidatie de bron aanpassen in:

=Lijst_met_een_tabel

Dan  verwijst deze naar een dynamisch bereik. Komen er waarden bij, dan breidt het bereik zich uit.

Dergelijke namen gebaseerd op een kolom binnen een tabel, kunnen we ook binnen een grafiek gebruiken. Deze beweegt dan ook mee met de tabel.

E. Met de functie INDIRECT verwijzen naar een kolom binnen een tabel

Bij Bron vullen we dan in:

=INDIRECT("LijstMetEenTabel[Lijst met een tabel]")