Classmodule

Status
Niet open voor verdere reacties.

ReilingJ

Gebruiker
Lid geworden
31 mei 2007
Berichten
168
Hallo,
voor een project in Word 2003 heb ik een VBA klassemodule geschreven. Achterliggende bedoeling was om deze module ook in andere projecten te gebruiken.

Helaas werkt deze module alleen in het betreffende project.

Bij de eigenschappen kan ik bij instancing kiezen uit: 1- private en 2- Public not creatable. Dit leidt niet tot het gewenste resultaat.

Weet iemand hoe ik een klassemodule van een project kan aanroepen in een ander project?

Groeten van Jan.
 
Laad het werkboek met die classmodule als een addin.
 
SNB: hoe laad ik in word 2003 een werkboek met een klassemodule?
Mark XL: kost even tijd te verwerken kom er op terug.

alvast bedankt,

Jan.
 
In het artikel wat ik gelinkt heb, staat ook dat je een project als addin moet laden.
Alleen dan hoe, waarom en wat de beperkingen zijn van de door jou gewenste aanpak. daar heb je wèl wat aan.
 
Mark,
je schreef dat ik je om hulp kon vragen. Het volgende uit het artikel krijg ik niet voor elkaar:
Code:
One final change will make life a little easier.  Rename the project from the default VBAProject to ClassProvider.  To do so, select the project in the VBE Project Explorer, then select Tools | VBAProject Properties… | General tab | and in the Project Name field enter ClassProvider.
 
Save this file, say, as Class Provider.xls.

Hoe kom ik in the VBE Project Explorer of wat wordt daarmee bedoeld? (Word 2003)
 
De VBE Explorer is de project explorer van de VBA Editor.
Rechts in de VBA editor zie je een soort "tree stuctuur" waarbij je je werkbladen en codemodules ziet.
rechtermuisklik op een van de items van een document, en klik op de optie "Eigenschappen voor VBA Project"

Daar kun je de projectnaam bepalen (standaard is "VBAProject)
 
de laatste paar stappen met afbeelding:

Naam van VBAProject Instellen
prop1.jpg

referenties naar werkmap maken in nieuwe werkmap
prop2.jpg
prop4.jpg
 
Zeer bedankt,
de onduidelijkheid over de instellingen en code is voor zover ik kan overzien nu opgelost. Ga nu de code en instellingen in mijn klasse module aanpassen conform instructie. Zodra het werkt zet ik de vraag op afgewerkt.
 
Naam van een VBProject instellen:

Code:
Sub snb()
    Application.VBE.ActiveVBProject.Name = InputBox("voorbeeld")
End Sub
 
Het gaat toch niet helemaal goed. Ik heb mijn klasse aangepast volgens bijlage. Deze functioneert. De module waarin deze wordt aangeroepen ziet er als volgt uit:
Code:
Option Explicit

Dim MyRegio As ClsRegio
Dim BepRegio As String
Public Function New_ClsRegio() As ClsRegio
    Set MyRegio = New ClsRegio
    Beginnen
 End Function



Sub Beginnen()
    If FrmRegio.ObtnRegioNoord = True Then
        BepRegio = "Noord"
    ElseIf FrmRegio.ObtnRegioOost = True Then
        BepRegio = "Oost"
    ElseIf FrmRegio.ObtnRegioZuid = True Then
        BepRegio = "Zuid"
    ElseIf FrmRegio.ObtnRegioWest = True Then
        BepRegio = "West"
    End If


MyRegio.Plaats = BepRegio


ActiveDocument.Tables(1).Cell(1, 1).Range.Text = MyRegio.LocRegio
ActiveDocument.Tables(1).Cell(2, 1).Range.Text = MyRegio.LocBezoekadres
ActiveDocument.Tables(1).Cell(3, 1).Range.Text = MyRegio.LocPostadres
ActiveDocument.Tables(1).Cell(4, 1).Range.Text = MyRegio.LocTelfReg
ActiveDocument.Tables(1).Cell(5, 1).Range.Text = MyRegio.LocFaxReg
ActiveDocument.Tables(1).Cell(6, 1).Range.Text = MyRegio.LocBank

End Sub

Vervolgens heb ik een nieuw document waarin de klasse nu ook zou moeten werken met de module:

Code:
Sub UseExportedClass_EarlyBinding()
    Dim RegGeg As ClassProvider.ClsRegio
    Set Regeg = ClassProvider.New_ClsRegio
    
   Beginnen
    End Sub


Sub Beginnen()
    If FrmRegio.ObtnRegioNoord = True Then
        BepRegio = "Noord"
    ElseIf FrmRegio.ObtnRegioOost = True Then
        BepRegio = "Oost"
    ElseIf FrmRegio.ObtnRegioZuid = True Then
        BepRegio = "Zuid"
    ElseIf FrmRegio.ObtnRegioWest = True Then
        BepRegio = "West"
    End If


MyRegio.Plaats = BepRegio


ActiveDocument.Tables(1).Cell(1, 1).Range.Text = MyRegio.LocRegio
ActiveDocument.Tables(1).Cell(2, 1).Range.Text = MyRegio.LocBezoekadres
ActiveDocument.Tables(1).Cell(3, 1).Range.Text = MyRegio.LocPostadres
ActiveDocument.Tables(1).Cell(4, 1).Range.Text = MyRegio.LocTelfReg
ActiveDocument.Tables(1).Cell(5, 1).Range.Text = MyRegio.LocFaxReg
ActiveDocument.Tables(1).Cell(6, 1).Range.Text = MyRegio.LocBank

End Sub

Op Sub
Code:
Sub UseExportedClass_EarlyBinding
loopt het vast.

In de bijlage een kopie van de instellingen (ik maak geen gebruik van addin).

Bekijk bijlage Doc4.doc
 
Voor een uitgebreide handleiding voor het gebruik van een klassemodule voor controle op een userform zie hier.
 
Dat ziet er goed uit!

Je functie New_ClsRegio heeft geen returnvalue, dat is denk ik het probleem

Code:
Public Function New_ClsRegio() As ClsRegio
    Set MyRegio = New ClsRegio
    Beginnen
    Set New_ClsRegio = MyRegio
 End Function

en beginnen zou ik weghalen uit New_ClsRegio, want het wordt een zootje als je vanuit een ander werkboek macro's gaat runnen die "activedocument" aanroepen. :)
 
Laatst bewerkt:
Marc,
helemaal waar wat je schrijft. Heb ik veranderd maar in het nieuwe document, welke gebruik zou moeten maken van de klasse in de externe bibliotheek, loopt het nog fout, zie bijlage.
 

Bijlagen

Heb je de klasse op "Public, not createable" gezet, en een verwijzing naar "Classprovider" ingesteld?
de foutmelding geeft aan, dat het huidige project het type variabele niet kent.

Verder vraag ik me nog even af wat je wilt met de externe Regio. wil je de regio initialiseren met waarden vanuit je externe bibliotheek, of met waarden vanuit het huidige document?
 
Laatst bewerkt:
Ja, dat staat goed.

Zelf heb ik twijfels bij de uitwerking en benaming van "ClassProvider" in de normale module.

zie doc 4
 
Voor alle duidelijkheid nog even die hiebij horende aangepaste code:

Code:
Option Explicit

Dim MyRegio As ClsRegio
Dim BepRegio As String
Public Function New_ClsRegio() As ClsRegio
    Set MyRegio = New ClsRegio
    

    If FrmRegio_vs1.ObtnRegioNoord = True Then
        BepRegio = "Noord"
    ElseIf FrmRegio_vs1.ObtnRegioOost = True Then
        BepRegio = "Oost"
    ElseIf FrmRegio_vs1.ObtnRegioZuid = True Then
        BepRegio = "Zuid"
    ElseIf FrmRegio_vs1.ObtnRegioWest = True Then
        BepRegio = "West"
    End If


MyRegio.Plaats = BepRegio


ActiveDocument.Tables(1).Cell(1, 1).Range.Text = MyRegio.LocRegio
ActiveDocument.Tables(1).Cell(2, 1).Range.Text = MyRegio.LocBezoekadres
ActiveDocument.Tables(1).Cell(3, 1).Range.Text = MyRegio.LocPostadres
ActiveDocument.Tables(1).Cell(4, 1).Range.Text = MyRegio.LocTelfReg
ActiveDocument.Tables(1).Cell(5, 1).Range.Text = MyRegio.LocFaxReg
ActiveDocument.Tables(1).Cell(6, 1).Range.Text = MyRegio.LocBank
Set New_ClsRegio = MyRegio
 End Function
 
Het lukt mij niet jouw bijlage met de klassemodule te openen; ik ben denk ik niet de enige....
 
ik heb effe snel twee documenten in elkaar geflanst, en als je "Library" als verwijzing toevoegd in "Implementatie" zou het moeten werken
Bekijk bijlage Library.doc / Bekijk bijlage Implementatie.doc

hieronder een voorbeeld van mijn vba project structuur van de twee documenten
voorbeeld.jpg
attachment.php


Hopelijk kom je eruit.

Overigens, je moet bij het lezen van gegevens uit een tabel oppassen met "activedocument". je kunt beter het document expliciet benoemen.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan