Most Valuable Professional


View Jan Karel Pieterse's profile on LinkedIn subscribe to rss feed
Subscribe in a reader

Subscribe to our mailing list

* indicates required

Audit !!!

Probeer onze RefTreeAnalyser
de beste Excel formule auditing tool.

Cursussen

Excel VBA Masterclass (Engels)
Excel VBA voor Financials

Third party tools

Speed up your file

FastExcel
The best tool to optimise your Excel model!

Repair your file

Stellar Phoenix Excel Repair
Best tool to repair corrupt Excel sheets and objects
Home > Nederlandse site > Artikelen > Invoegtoepassing bouwen > Basisfunctionaliteit
This page in English

Bouwen van een invoegtoepassing voor Excel, basisfunctionaliteit

Ervaring leert, dat invoegtoepassingen voor Excel iets gemeen hebben. De tijd die je tijdens het bouwen besteedt aan de kernfunctionaliteit is vaak slechts een klein deel van de tijd die nodig is om het project tot een goed einde te brengen. Dit is iets dat overigens voor heel veel softwareprojecten geldt.

De werkmap maken

Een invoegtoepassing voor Excel is niets meer of minder dan een gewone werkmap, die is opgeslagen als een invoegtoepassing. Je kan natuurlijk de invoegtoepassing zelf bewerken en opslaan, zoals ieder ander Excel bestand, maar ik persoonlijk bewerk liever een "normale" werkmap en sla die op als invoegtoepassing als ik klaar ben.

Dus, open een nieuw, leeg Excel bestand (Ik heb hier de VBA editor naast het venster van Excel gezet, met slechts de projectverkenner open):
A new Excel workbook and its VBA project in the project explorer

Net de geur van een nieuwe auto vind je niet?

Kernfunctionaliteit

Een module invoegen

De basis van de invoegtoepassing wordt een werkblad genaamd ToC. Omdat ik ervoor gekozen heb om een commentaar bij ieder werkblad mogelijk te maken, moeten deze commentaren tijdens het vernieuwen van de lijst tijdelijk worden opgeslagen en na het vernieuwen weer naast hun bijbehorende werkbladen worden teruggeplaatst.

Laten we dus eerst een module invoegen:

Inserting a module

En verander de naam van die module in het eigenschappen venster:

The Name property of the module

Het VBA project moet er nu zo uitzien:

The VBAProject with one module

Dubbel-klik op modTOC om het bijbehorende codevenster te openen.

De basiscode

Zonder verder uitgebreid uit de doeken te doen hoe de code werkt (het commentaar geeft al een flinke zet in de goede richting); is hier de code:

'-------------------------------------------------------------------------
' Module    : modMain
' Company   : JKP Application Development Services (c)
' Author    : Jan Karel Pieterse (www.jkp-ads.com)
' Created   : 30-4-2015
' Purpose   : De hoofdroutinesvan de tool
'-------------------------------------------------------------------------
Option Explicit

Public Sub UpdateTOC()
'-------------------------------------------------------------------------
' Procedure : UpdateTOC
' Company   : JKP Application Development Services (c)
' Author    : Jan Karel Pieterse (www.jkp-ads.com)
' Created   : 30-4-2015
' Purpose   : Maakt werkblad met inhoudsopgave (of werkt deze bij)
'-------------------------------------------------------------------------
    Dim oSh As Object
    Dim oToc As Worksheet
    Dim vRemarks As Variant
    Dim lCt As Long
    Dim lRow As Long
    Dim lCalc As Long
    Dim bUpdate As Boolean
    bUpdate = Application.ScreenUpdating
    Application.ScreenUpdating = False
    lCalc = Application.Calculation
    Application.Calculation = xlCalculationManual

    'Controleer of er al een werkblad ToC is, Zo niet, voeg er een toe:
    If Not IsIn(Worksheets, "ToC") Then
        With Worksheets.Add(Worksheets(1))
            .Name = "ToC"
        End With
        Set oToc = Worksheets("ToC")
        ActiveWindow.DisplayGridlines = False
        ActiveWindow.DisplayHeadings = False
    Else
        Set oToc = Worksheets("ToC")
        'We hebben een bestaand ToC blad, Sla de tabel met de inhoudsopgave op
        'zodat we de commentaren na vernieuwen terug kunnen zetten
        vRemarks = oToc.ListObjects(1).DataBodyRange
    End If
    'Controleer of er een tabel staat op het ToC werkblad, zo niet, toevoegen
    If oToc.ListObjects.Count = 0 Then
        oToc.Range("C2").Value = "Werkblad"
        oToc.Range("D2").Value = "Snelkoppeling"
        oToc.Range("E2").Value = "Opmerkingen"
        oToc.ListObjects.Add xlSrcRange, oToc.Range("C2:E2"), , xlYes
    End If
    On Error Resume Next
    'Tabel leegmaken
    'Fouten negeren voor het geval de tabel al leeg is

    oToc.ListObjects(1).DataBodyRange.Rows.Delete
    For Each oSh In Sheets
        If oSh.Visible = xlSheetVisible Then
            lRow = lRow + 1
            oToc.Range("C2").Offset(lRow).Value = oSh.Name
            oToc.Range("C2").Offset(lRow, 1).FormulaR1C1 = _
                "=HYPERLINK(""#'""&RC[-1]&""'!A1"",RC[-1])"
            oToc.Range("C2").Offset(lRow, 2).Value = ""
            'Bestaand commentaar voor dit werkblad invoegen
            For lCt = LBound(vRemarks, 1) To UBound(vRemarks, 1)
                If vRemarks(lCt, 1) = oSh.Name Then
                    oToc.Range("C2").Offset(lRow, 2).Value = vRemarks(lCt, 3)
                    Exit For
                End If
            Next
        End If
    Next
    oToc.ListObjects(1).Range.EntireColumn.AutoFit
    Application.Calculation = lCalc
    Application.ScreenUpdating = bUpdate
End Sub

Wellicht heb je al opgemerkt dat deze code een compileerfout geeft als je ze probeert uit te voeren:

Compile error, something's missing

Dit komt omdat er een functieaanroep in staat naar de functie "IsIn" die nog moet worden ingevoerd. IsIn is een functie die ik ooit van mijn collega Excel MVP Bill Manville heb gekregen.

Functies module

Omdat we misschien nog meer algemene functies nodig hebben, voeg ik een module toe die ik modFunctions noem. Daarin staat nu slechts deze functie:

Option Explicit

Function IsIn(vCollection As Variant, ByVal sName As String) As Boolean
'-------------------------------------------------------------------------
' Procedure : IsIn Created by Jan Karel Pieterse
' Company   : JKP Application Development Services (c) 2005
' Author    : Jan Karel Pieterse
' Created   : 28-12-2005
' Purpose   : Bepaalt of een object deel uitmaakt van een collectie
'-------------------------------------------------------------------------
    Dim oObj As Object
    On Error Resume Next
    Set oObj = vCollection(sName)
    If oObj Is Nothing Then
        IsIn = False
    Else
        IsIn = True
    End If
    If IsIn = False Then
        sName = Application.Substitute(sName, "'", "")
        Set oObj = vCollection(sName)
        If oObj Is Nothing Then
            IsIn = False
        Else
            IsIn = True
        End If
    End If
End Function

Nu zou de routine UpdateTOC moeten werken!

Volgende: Het Lint maken


 


Vragen, suggesties en opmerkingen

Heeft u vragen, suggesties of opmerkingen? Gebruik dan dit formulier.

Mocht uw vraag niet direct relevant zijn voor deze pagina, maar een algemene Excel vraag betreffen, dan adviseer ik om deze hier te stellen: www.eileenslounge.com.

Uw naam (verplicht veld):

Uw e-mail adres (Niet verplicht, dit adres wordt niet getoond)

Uw verzoek of commentaar:

Als u VBA code in uw commentaar plaatst, gebruik dan [VB] tags: [VB]Uw code[/VB].