Bestandseigenschappen

Voorbeeldbestanden bij dit artikel:
  • Excel bestandseigenschappen
  • Inleiding

    Je kan Office bestanden (Excel, Word, Powerpoint, Access, Vision, …) eigenschappen meegeven. Zo kan bijvoorbeeld ingesteld worden wie de auteur is van een bestand, wat het onderwerp is, de titel, de datum dat het gemaakt werd, enz. Laten we ons in de rest van dit verhaal beperken tot Excel bestanden. Deze eigenschappen instellen is niet moeilijk: kies Bestand > Eigenschappen, en vul de tabbladen in. Maar het wordt anders als je dat voor vele bestanden ineens en/of regelmatig moet doen. Dan zal je blij zijn dat er VBA-oplossingen voorhanden zijn.

    Er zijn voor Excelbestanden zowel ingebouwde als aangepaste bestandseigenschappen. In het Engels spreekt men van builtin document properties en custom document properties. De ingebouwde bestandseigenschappen zijn read/write: VBA-code kan nagaan wat die eigenschappen zijn voor een bepaald bestand en VBA-code kan die eigenschappen ook wijzigen. Maar meer niet. Je kan er geen zelf gekozen eigenschappen aan toevoegen.

    VBA-code

    UPDATE: Maar vooraleer over te gaan tot de belangrijkste code op deze pagina, is er als opwarmertje mijn code om een lijst te genereren van alle ingebouwde en aangepaste celeigenschappen van een Excelbestand.

    Option Explicit
    
    
    Sub BestandseigenschappenBekijken()
    ' Wim Gielis ' http://www.wimgielis.com
    ''''' ' Custom module to read all builtin and custom properties ' of the current workbook and output to a new sheet ' 22/06/07 '''''
    Dim i As Integer Dim docprops As DocumentProperties Dim newSheet As Worksheet On Error Resume Next Application.DisplayAlerts = False Sheets("Uitgelezen eigenschappen").Delete Application.DisplayAlerts = True On Error GoTo 0 Set newSheet = ThisWorkbook.Sheets.Add (After:=Sheets(ThisWorkbook.Sheets.Count)) With newSheet.Range("A1") .Parent.Name = "Uitgelezen eigenschappen" .Resize(1, 4).EntireColumn.ClearContents .Font.Bold = True .Value = "Ingebouwde eigenschappen" .Offset(0, 2).Font.Bold = True .Offset(0, 2).Value = "Aangepaste eigenschappen" '1. ingebouwde eigenschappen Set docprops = .Parent.Parent.BuiltinDocumentProperties On Error Resume Next For i = 1 To docprops.Count .Offset(i, 0).Value = docprops(i).Name .Offset(i, 1).Value = docprops(i).Value Next On Error GoTo 0 If docprops.Count = 0 Then .Offset(1, 0).Value = "Geen" '2. aangepaste eigenschappen Set docprops = .Parent.Parent.CustomDocumentProperties On Error Resume Next For i = 1 To docprops.Count .Offset(i, 2).Value = docprops(i).Name .Offset(i, 3).Value = docprops(i).Value Next On Error GoTo 0 If docprops.Count = 0 Then .Offset(1, 2).Value = "Geen" .Resize(1, 4).EntireColumn.AutoFit End With
    End Sub

    Een aantal van de eigenschappen kan je trouwens met deze code niet uitlezen, bv. het tijdstip dat het bestand voor het laatst gelezen of beschreven werd. Zie daarvoor bij Chip Pearson.

    In wat volgt geef ik mijn code voor het instellen en verwijderen van bestandseigenschappen voor alle Excelbestanden in een map. Wat doet de code en hoe dien je ze te gebruiken? Zet alle bestanden waarvan de eigenschappen aangepast moeten worden, in dezelfde map. Geef het pad van die map op in de code, bovenaan. Als voorbeeld nam ik "C:\Wim", maar je kan dus zelf een andere map kiezen ook. De bestanden mogen geopend of gesloten zijn, maakt niet uit voor de code. Bekijk de code en lees na de code verder.

    Option Explicit
    
    
    Sub BestandseigenschappenInstellen()
    ' Wim Gielis ' http://www.wimgielis.com
    ''''' ' Custom module to access builtin and custom properties ' of all Excel workbooks in a folder ' 22/06/07 '''''
    Dim myPath As String Dim myFile As String Dim mySep As String Dim wbOpen As Workbook Dim DocProps As DocumentProperties myPath = "C:\Wim" mySep = Application.PathSeparator myFile = Dir(myPath & mySep & "*.xls", vbDirectory) Application.ScreenUpdating = False Do While myFile <> "" If myFile = ThisWorkbook.Name Then GoTo GaVerder: If Workbooks(myFile) Is Nothing Then Set wbOpen = Workbooks.Open(myPath & mySep & myFile) Else Set wbOpen = Workbooks(myFile) End If On Error Resume Next With wbOpen Application.StatusBar = .FullName '1. ingebouwde eigenschappen ''ik stel enkele ingebouwde eigenschappen in ''je kan de waarde van eigenschappen evt. ''afhankelijk maken van het bestand waarin ''je het instelt: dit vraag je op met .Name ''en je bouwt er een IF-clausule rond Set DocProps = .BuiltinDocumentProperties DocProps("Title").Value = .Name DocProps("Subject").Value = "Waarover gaat dit bestand?" DocProps("Author").Value = "Wim Gielis" DocProps("Manager").Value = "Wim Gielis" DocProps("Company").Value = "http://www.wimgielis.com" DocProps("Keywords").Value = "Excel, TM1, Voetbal, Muziek" DocProps("Creation date").Value = Date '2. aangepaste eigenschappen Set DocProps = .CustomDocumentProperties ''voorbeeldje 1: ''stel als een aangepaste eigenschap de ''site in waar dit bestand vandaan komt DocProps.Add Name:="Website", _ LinkToContent:=False, _ Type:=msoPropertyTypeString, _ Value:="" DocProps("Website").Value = "http://www.wimgielis.com" ''voorbeeldje 2: ''de gebruiker van het bestand wordt ''ingesteld op basis van de Username ''in de Excel applicatie DocProps.Add Name:="Gebruiker", _ LinkToContent:=False, _ Type:=msoPropertyTypeString, _ Value:="" DocProps("Gebruiker").Value = Application.UserName ''voorbeeldje 3: ''het aantal tabbladen uit het bestand ''wordt bijgehouden DocProps.Add Name:="Aantal tabbladen", _ LinkToContent:=False, _ Type:=msoPropertyTypeNumber, _ Value:=0 DocProps("Aantal tabbladen").Value = .Sheets.Count ''enz. .Close True End With Application.StatusBar = False On Error GoTo 0 GaVerder: myFile = Dir Loop Application.ScreenUpdating = True MsgBox "Klaar!", vbInformation
    End Sub

    Pas de code gerust eens toe op eigen bestanden. Verander de eigenschappen in waarden die je zelf kiest. Wees creatief en ontdek nog veel meer eigenschappen van Excel dan ik hier gezet heb.

    Om de ingebouwde en aangepaste bestandseigenschappen weer te verwijderen, kan je soortgelijke code gebruiken. Je neemt exact dezelfde code als hierboven, maar binnen de lus zet je:

                '1. ingebouwde eigenschappen
    
                    Set DocProps = .BuiltinDocumentProperties
    
                    For i = 1 To DocProps.Count
                        DocProps(i).Value = ""
                    Next
    
                '2. aangepaste eigenschappen
    
                    Set DocProps = .CustomDocumentProperties
    
                    For i = DocProps.Count To 1 Step -1
                        DocProps(i).Delete
                    Next
    

    Ik maak het jullie zoals altijd weer gemakkelijk; je kan nl. het bijgevoegde bestandje bovenaan de pagina downloaden en zo alle code bekijken.

    Je zal merken dat in het bestand nog meer code staat om bestandseigenschappen in te stellen. Dit is geadapteerde code van Chip Pearson. Die pagina bevat nog veel meer code. Het nuttigste van zijn code vind ik persoonlijk het instellen van eigenschappen van gesloten bestanden, en ook het instellen van eigenschappen van niet-Excel bestanden.

    Tip

    Tot slot nog een tip: je hoeft voor een eigenschap niet dezelfde waarde te nemen voor elk van de bestanden in de map. Bvb. de Keywords hoeven niet altijd "Excel, Voetbal, Muziek" te zijn voor elk bestand. Een ideetje is om mbv .Name de naam van het bestand op te vragen en dan met een IF-structuur de Keywords zo te differentiëren per bestand. Werken jullie dat maar uit, het is een goede oefening! Een andere oefening zou zo kunnen gaan. Stel je hebt allemaal gelijkaardige bestanden die enkel verschillen in de periode of het jaar waarop ze betrekking hebben. Dan kan je eens een aangepaste eigenschap Jaar aanmaken, en het jaar haal je op uit de bestandsnaam! Probeer maar.




    Over Wim

    Wim Gielis is Business Intelligence consultant en Excel expert

    Andere links