Publicatie:Bestanden in bulk verplaatsen naar één of verschillende doelmappen met Visual Basic for Applications (VBA)

Uit Cultureel Erfgoed Standaardentoolbox
Naar navigatie springen Naar zoeken springen


Samenvatting

Dit is een korte handleiding om grote hoeveelheden bestanden (ongeacht bestandstype) in bulk te verplaatsen naar één of verschillende doelmappen aan de hand van Excel en Visual Basic for Applications (VBA).


Referentie
Titel Bestanden in bulk verplaatsen naar verschillende doelmappen met Visual Basic for Applications (VBA) (Voorkeurstitel)
Locatie
Uitgever
Jaar van uitgave 2022
Rechten CC-BY-SA
Persistent ID


Auteur

Wouter De Witte

Context van het probleem

Het MMP1917 heeft voor elke persoon waarvan het museum objecten of gegevens bewaart een aparte map op de server. Deze mappen bevatten allerhande informatie in uiteenlopende bestanden (afbeeldingen, tekstbestanden, etc.). Tijdens het subsidieproject Inhaalbeweging Digitale Collectiedata worden alle personalia (= objecten met een directe relatie tot een persoon) gescand of gefotografeerd. Deze digitale moederbestanden (.tiff) worden bewaard in een specifieke map op de server.

Het is echter praktischer om de gebruiksbestanden (.jpg) in de mappen van hun gerelateerde personen te bewaren. Wanneer een publieksmedewerker of onderzoeker een foto nodig heeft, kan hij of zij deze bestanden in de map van deze persoon terugvinden. Het MMP1917 heeft één hoofdmap met de naam “personalia” op de server. Deze hoofdmap bevat submappen met een vaste naamgeving, namelijk “AchternaamVoornaam”. Vóór de start van deze oefening werden de TIF-bestanden via FastStone Image Viewer gekopieerd en getransformeerd naar JPG-bestanden.

Omschrijving van het probleem:

Het is mogelijk om alle afbeeldingen of bestanden gerelateerd aan een specifieke persoon manueel op te zoeken en te verplaatsen via Windows Verkenner. Je zoekt eerst de juiste doelmap op en verplaatst vervolgens de bestanden naar deze locatie.

Deze methode is echter onpraktisch en inefficiënt wanneer het om duizenden bestanden gaat.

De vraag is dus: hoe verplaats je duizenden bestanden automatisch naar verschillende doelmappen?

Er zijn verschillende oplossingen mogelijk. Het MMP1917 beschikt echter over een Excel-bestand met metadata over bestanden, hun huidige bewaarmappen en hun doelmappen. Deze metadata is voornamelijk afkomstig uit een DROID-scan (Exiftool werkt ook) en een Axiell export.

Oplossing

Voorbereiden van het Excel bestand.

Om te beginnen bevat het Excel-bestand bevat vijf basiskolommen.

  • Kolom “A”: bestandsnaam (bv. “Afb_00001”)
  • Kolom “B”: bestandsformaat (bv. “.tiff”, “.jpg”, etc.)
  • Kolom “C”: bronmap (het pad naar de huidige map)
  • Kolom “D”: bestemmingsmap (het pad naar de bestemmingsmap)
  • Kolom “E”: de correcte submap in de bestemmingsmap

Aan de hand van deze informatie kunnen de volledige start- en eindbestandspaden gegenereerd worden.

  • In kolom “F” plaatsen we het volledige pad naar het bestand in de bronmap. In cel E1 schrijf je de volgende functie: “=TEKST.SAMENV(C1;"\";A1;B1)”. Met andere woorden: bronmap, “\”, bestandsnaam en bestandstype.
    • bv. C:\Users\WouterDeWitte\Bronmap\Afb_00001.jpg
  • In kolom “G” plaatsen we het volledige pad naar het bestand in de bestemmingsmap. In cel F1 schrijf je de volgende functie: “=TEKST.SAMENV(D1;"\";E1;"\";A1;B1)”. Met andere woorden: bestemmingsmap, “\”, submap, “\”, bestandsnaam en bestandstype.
    • bv. C:\Users\WouterDeWitte\Bestemmingsmap\Submap\Afb_00001.jpg

De VBA-code

Voor we verder gaan moet de “Ontwikkelaars-tab” aangezet worden in je Excel-document. Klik hiervoor op “Bestand” > “Opties” > “Lint aanpassen” > “Hoofdtabbladen” > “Ontwikkelaars” of bekijk dit filmpje. Eens dit voltooit is, verschijnt een nieuw tabblad “Ontwikkelaars” in je werklint. Om VBA-code in te voeren klik je op dit tabblad, gevolgd door “Visual Basic” > “Invoegen” > “Module”.

Plaats de volgende code in het tekstveld:

Sub Move()
Dim a$, b$, x$
On Error GoTo errHandler
For r = 2 To Range("A" & Rows.Count).End(xlUp).Row
    a = Range("F" & r).Value
    b = Range("G" & r).Value
    Name a As b
    x = "Succes"
skip:
    Range("H" & r) = x
 Next
Exit Sub

errHandler:
x = "Err " & Err.Description
On Error GoTo -1
On Error GoTo errHandler
GoTo skip
End Sub

(Met dank aan ByteMarks (via excelforum.com))

Mogelijke aanpassingen

Is jouw Excel-document anders dan dit voorbeeld?

Dan kan je deze zaken in de code aanpassen:

  • Verander “F” door de kolom die in jouw bestand het startbestandspad bevat.
  • Verander “G” door de kolom die in jouw bestand het eindbestandspad bevat.
  • Verander “H” door één der welke kolom, zolang deze kolom leeg is. Dit is de controlekolom (zie hieronder).

Klik vervolgens op de groene play-knop (Sub/UserForm uitvoeren) of F5.

Resultaat:

De bestanden worden van je bronmap naar de door jouw aangegeven bestemmingsmap verplaatst.

Afhankelijk van de hoeveelheid kan dit een tijdje duren. Soms lijkt het alsof je Excel-programma bevriest: dit is geen probleem, wees geduldig.

Als de verplaatsing gelukt is, creëert de code de nieuwe kolom “H” (de controlekolom). Als de opdracht succesvol is, wordt het woord “Succes” in deze kolom geplaatst. Als de verplaatsing mislukt krijg je een waarschuwing in deze kolom.