Userform kopiëren

Voorbeeldbestanden bij dit artikel:
  • Userform kopiëren
  • Inleiding

    Laatst was ik bezig met een zeer uitgebreide userform of gebruikersformulier in Excel VBA. Ik had op een bepaald ogenblik een volledige kopie nodig van die userform in hetzelfde bestand. Manueel zijn er een aantal mogelijkheden om dit voor mekaar te krijgen, de ene al wat handiger dan de andere:

    • een nieuwe userform toevoegen, de VBA code kopiëren en alle userformelementen overzetten (inclusief hun uitlijning op de userform en andere eigenschappen). Dat is dus niet meteen een aanlokkelijke manier van werken want zeer tijdrovend. Al heeft MZ Tools hier wel een aantal voorzieningen voor.
    • we kunnen ook de userform exporteren (via het context menu na een rechtermuisklik), en vervolgens een userform importeren (zelfde rechtermuisklik). Probleem is dat de naam van de geëxporteerde userform ingebakken zit in de .frm en .frx bestanden bij het exporteren. We moeten dus die bestanden openen met een tekstverwerker, en een Zoeken/Vervangen actie ondernemen. Ideaal is dit echter niet; het is veiliger om ingebouwde methoden te gebruiken die correcte bestanden opleveren, eerder dan zelf in te grijpen in de bestanden. Al hoor je mij niet zeggen dat het niet mogelijk is. In het geval dat je de geëxporteerde bestanden zou importeren zonder vervangen, dan krijg je een foutmelding omdat de userformnaam als dusdanig reeds in gebruik is.
    • de laatste optie is de handigste: maak een nieuw leeg bestand aan (Control + N) in Excel. Dan, in de VBA-programmeeromgeving (de VBE) sleep je de userform van het bronbestand naar het tijdelijke nieuwe bestand. Daar vervang je de naam van de userform in de nieuwe naam, en sleep je de userform terug van het tijdelijke nieuwe bestand naar het originele bestand. Sluit het tijdelijke bestand zonder wijzigingen opslaan en je bent klaar! (Een gelijkaardige werkwijze geldt voor macro modules, al hoef je daar niet noodzakelijk de naam te veranderen: er volgt geen foutmelding als de modulenamen gelijk zijn. VBA zal de modules hernoemen door steeds een 1 bij te plaatsen. Module1 wordt Module11, dan Module111, enz.)

    VBA-code

    Ook middels VBA is er geen directe methode voor het kopiëren van een userform binnen hetzelfde bestand. De oplossingsrichting die we volgen in de code hieronder, is dezelfde als eerder uitgelegd:

    1. exporteren van de userform
    2. geëxporteerde userform importeren in een tijdelijk bestand
    3. in dat bestand de userform hernoemen
    4. op zijn beurt de userform exporteren
    5. het tijdelijke bestand verwijderen
    6. importeren in het oorspronkelijke bestand
    7. de hulpbestanden (.frm, .frx) op de harde schijf verwijderen

    Die 7 stappen lijken veel code te gaan worden, maar dat hoeft het niet te zijn als je goed programmeert:

    Sub userform_kopieren()
    ' Wim Gielis ' http://www.wimgielis.com
    ''''' ' Code om een userform te kopieren binnen hetzelfde bestand ' 11/11/11 '''''
    Const sFileFrm As String = "C:\temp.frm" ThisWorkbook.VBProject.VBComponents("UserForm1").Export sFileFrm 'stap 1 With Workbooks.Add 'stap 2 .VBProject.VBComponents.Import(sFileFrm).Name = "UserForm2" 'stap 2, 3 .VBProject.VBComponents(3).Export sFileFrm 'stap 4 .Close 0 'stap 5 End With ThisWorkbook.VBProject.VBComponents.Import sFileFrm 'stap 6 Kill Left(sFileFrm, Len(sFileFrm) - 1) & "*" 'stap 7
    End Sub

    Wijzigingen

    Als je deze code gebruikt, moet je mogelijk nog de constanten sFileFrm, UserForm1 en UserForm2 aanpassen. UserForm1 staat voor de naam van de userform die je wenst te kopiëren, UserForm2 doelt op de nieuwe naam van de kopie. Merk ook op dat het best kan dat de naam van de userform nog voorkomt in de code van de userform: als die naam hardgecodeerd werd moet je een Zoeken > Vervangen actie doen om te verwijzen naar de nieuwe naam.




    Over Wim

    Wim Gielis is Business Intelligence consultant en Excel expert

    Andere links