VBA verwijzingen

OneNote

Ook hier zal er een verwijzing gemaakt moet worden naar een bibliotheek, in dit geval die van OneNote. Naast deze verwijzing zal er ook een verwijzing moeten worden gemaakt naar Microsoft XML V6 omdat OneNote met XML componenten werkt.

Van alle bronnen is OneNote wellicht het minst efficiënt als het gaat om het beheren van contactpersonen.

Zoals in de bovenstaande afbeelding is te zien bestaat de hiërarchie van OneNote uit een notitieblok, secties (tabblad Contactpersonen) en pagina's. De paginatitels worden gebruikt voor de namen van de contactpersonen. In dit artikel worden deze objecten nader toegelicht.

De onderstaande klassenmodule maakt inzichtelijk hoe de bovenstaande hiërarchie werkt.

'-----------------------------------------------------------------------------------------------------------------------
' Auteur        : pascalterheege.nl
' Datum         : 31-3-2017
' Object        : clsOnenote
' Doel          : waarden laden, wijzigen en verwijderen uit OneNoteBestand
' Verwijzingen  : Microsoft OneNote X Object library
'                 Microsoft XML, v6,0
' Objecten      : 1. OneNote applicatie
'                 2. OneNote notitieboek
'                 3. OneNote sectie
'                 4. OneNote pagina
' Bronnen       : https://code.msdn.microsoft.com/office/OneNote-2010-Create-New-880f8ee3
' Opmerking     : conventie pagina titel: "1. ter Heege, Pascal"
'-----------------------------------------------------------------------------------------------------------------------

Option Explicit

Dim objOneNote As oneNote.Application   'OneNote

Dim notID As String                     'Notitieblok

Dim secID As String                     'Sectie
Dim secXML As String
Dim secDoc As MSXML2.DOMDocument
Dim secNode As MSXML2.IXMLDOMNode
Dim secNodes As MSXML2.IXMLDOMNodeList

Dim pageID As String                    'Pagina
Dim pageXML As String
Dim pageDoc As MSXML2.DOMDocument
Dim pageNode As MSXML2.IXMLDOMNode
Dim pageNodes As MSXML2.IXMLDOMNodeList

Private Sub Class_Initialize()
    
'   Initialisatie OneNote-objecten en sectie ID (secID) achterhalen van sectie Contacterpersonen
    
    Set objOneNote = New oneNote.Application
    
    Set secDoc = New MSXML2.DOMDocument
    Set pageDoc = New MSXML2.DOMDocument
    
    objOneNote.OpenHierarchy OneNoteLocatie, "", notID, cftNone
    objOneNote.GetHierarchy notID, hsSections, secXML
    
    If secDoc.LoadXML(secXML) Then
        
        Set secNodes = secDoc.DocumentElement.SelectNodes("//one:Section")

        If Not secNodes Is Nothing Then
        
            For Each secNode In secNodes
                If secNode.Attributes.getNamedItem("name").Text = "Contactpersonen" Then
                    secID = secNode.Attributes.getNamedItem("ID").Text
                    Exit For
                End If
            Next

        End If

    End If

End Sub

Public Sub Laden(lsb As ListBox)

'   Waarden uitlezen

    Dim i As Integer
    
    Dim strPaginaTitel As String
    
    objOneNote.GetHierarchy secID, hsPages, pageXML
 
    If pageDoc.LoadXML(pageXML) Then
        
        Set pageNodes = pageDoc.DocumentElement.SelectNodes("//one:Page")
        
        If Not pageNodes Is Nothing Then

            For Each pageNode In pageNodes
                
                strPaginaTitel = pageNode.Attributes.getNamedItem("name").Text
                
                With lsb
                    .AddItem
                    .List(i, 0) = Nummer(strPaginaTitel)
                    .List(i, 1) = Achternaam(strPaginaTitel)
                    .List(i, 2) = Voornaam(strPaginaTitel)
                End With
                
                i = i + 1
                
            Next
        
        End If
        
    End If
    
End Sub

Public Sub Toevoegen(strNummer As String, strVoornaam As String, strAchternaam As String, pageID As String)

'   Indien pageID leeg wordt de nieuwe pagina 'naamloos' aangemaakt
'   Indien pageID niet leeg wordt de pagina geladen met de betreffende pageID
'   De titel van de pagina wordt gewijzigd
            
    Dim titelNode As MSXML2.IXMLDOMNode
    Dim dataNode As MSXML2.IXMLDOMNode
    Dim outXML As String
            
    If pageID = "" Then objOneNote.CreateNewPage secID, pageID, npsDefault
    
    objOneNote.GetPageContent pageID, outXML, piAll, xs2013
    
    Set pageDoc = New MSXML2.DOMDocument
    
    If pageDoc.LoadXML(outXML) Then
       
        pageDoc.setProperty "SelectionLanguage", "XPath"
        pageDoc.setProperty "SelectionNamespaces", "xmlns:one='http://schemas.microsoft.com/office/onenote/2013/onenote'"
        
        Set pageNode = pageDoc.SelectSingleNode("//one:Page")
        Set titelNode = pageDoc.SelectSingleNode("//one:Page/one:Title/one:OE/one:T")
        Set dataNode = titelNode.SelectSingleNode("text()")
        
        dataNode.Text = strNummer & ". " & strAchternaam & ", " & strVoornaam
        objOneNote.UpdatePageContent (pageDoc.XML)
        
    End If

End Sub

Public Sub Wijzig(strNummer As String, strVoornaam As String, strAchternaam As String)

'   Aan de hand van nummer pagina titel wijzigen via procedure toevoegen

    Dim i As Integer
    Dim strPaginaTitel As String
    
    objOneNote.GetHierarchy secID, hsPages, pageXML
 
    If pageDoc.LoadXML(pageXML) Then
        
        Set pageNodes = pageDoc.DocumentElement.SelectNodes("//one:Page")
        
        If Not pageNodes Is Nothing Then

            For Each pageNode In pageNodes
                
                strPaginaTitel = pageNode.Attributes.getNamedItem("name").Text
                pageID = pageNode.Attributes.getNamedItem("ID").Text

                If Nummer(strPaginaTitel) = strNummer Then
                
                    Toevoegen strNummer, strVoornaam, strAchternaam, pageID
                
                End If
                
                i = i + 1
                
            Next
        
        End If
        
    End If

End Sub

Public Sub Verwijder(strNummer As String, blnAlles As Boolean)

'   Alle pagina's verwijderen of aan de hand van nummer

    Dim i As Integer
    
    Dim strPaginaTitel As String
    
    objOneNote.GetHierarchy secID, hsPages, pageXML
 
    If pageDoc.LoadXML(pageXML) Then
        
        Set pageNodes = pageDoc.DocumentElement.SelectNodes("//one:Page")
        
        If Not pageNodes Is Nothing Then

            For Each pageNode In pageNodes
                
                strPaginaTitel = pageNode.Attributes.getNamedItem("name").Text
                pageID = pageNode.Attributes.getNamedItem("ID").Text

                If blnAlles = True Then
                    objOneNote.DeleteHierarchy pageID
                Else
                    If Nummer(strPaginaTitel) = strNummer Then
                        objOneNote.DeleteHierarchy pageID
                    End If
                End If
                
                i = i + 1
                
            Next
        
        End If
        
    End If

End Sub

Private Function Nummer(strPagina As String)

'   Functie voor Nummer achterhalen: "1. ter Heege, Pascal"

    If Mid(strPagina, 2, 1) = "." Then
        Nummer = Left(strPagina, 1)
    Else
        Nummer = Left(strPagina, 2)
    End If

End Function

Private Function Voornaam(strPagina As String)

'   Functie voor Voornaam achterhalen: "1. ter Heege, Pascal"

    Dim arrNaam() As String

    arrNaam = Split(strPagina, ",")
    
    Voornaam = arrNaam(0)
    Voornaam = Trim(Replace(Voornaam, Nummer(strPagina) & ".", ""))

End Function

Private Function Achternaam(strPagina As String)

'   Functie voor Achternaam achterhalen: "1. ter Heege, Pascal"

    Dim arrNaam() As String

    arrNaam = Split(strPagina, ",")
    
    Achternaam = Trim(arrNaam(1))

End Function

Private Sub Class_Terminate()

'   Deinitialisatie Onenote-objecten

'   objOneNote.CloseNotebook notID, False (levert problemen op)

    Set pageDoc = Nothing
    Set pageNode = Nothing
    Set pageNodes = Nothing

    Set secDoc = Nothing
    Set secNode = Nothing
    Set secNodes = Nothing
    
    Set objOneNote = Nothing
    
End Sub