Classmodule

Status
Niet open voor verdere reacties.
Het werkt hier wel, ik kreeg slechts een foutmelding toen ik de macro's nog niet had ingeschakeld voor het project Class_regio.
 
Het bewaren van data in code is volgens mij volstrekt onwenselijk.

ik adviseer een tekstbestand, Excel-document, Access-database, of ander Word-document als gegevensbron.
vervolgens kun je met je code deze gegevens ophalen en transformeren.

En tja, de code kan vast wel korter.
Ik vind het belangrijk dat het leesbaar, duidelijk, en uiteraard niet dubbelzinnig.
maar daar zijn genoeg artikelen over, daar mag iedereen verder zijn eigen mening over hebben.
 
SNB,
natuurlijk heb je dit fantastisch gecomprimeert. Maar ik kan me niet voostellen dat dit een methode is voor de klasse. Als je er mee bereikt wat ik er mee wil bereiken (ongeveer 30 verschillende sjablonen die deze klasse aanroepen om de gegevens in de tabel te plaatsen) is dat natuurlijk fantastisch. Echter ik heb geleerd (VB) in dit geval met let, get kortom volgens deze methodiek te werken.

Blijven er twee problemen: waarom krijg ik een foutmelding en Mark niet. En nieuw telkens als de klasse wordt aangeroepen wordt ook het document geopend.
 
Reacties hebben elkaar gekruist.

Natuurlijk wil ik de data niet in de code verwerken. Weet overigens nog niet hoe. Was slechts voorbeeld om probleem duidelijk te maken.

Dus nog steeds graag zeer gewaardeerde hulp bij uiteindelijke oplossing.
 
Beste ReilingJ,

volgens mij maakt de laatste versie van de macro helemaal geen gebruik van de functionaliteit van de Klasse Provider. je roept alleen een externe module aan. probeer nog eens goed na te gaan of je ontwerp deze ingewikkelde constructie wel nodig heeft...

En code moet je niet compacter willen maken dan noodzakelijk. ik vind jouw gebruik van get/set erg duidelijk.
 
Om je van gedachten te laten veranderen.

Sla het bestand regio10.dot op
Laadt dit bestand als addin.
Open het bestand regio.doc.
Klik op de knop.

NB als je de addin eenmaal hebt geladen hoef je alleen nog maar in ieder bestand een macro te zetten waarmee het scherm in de addin wordt geopend.
Op deze manier maken bestanden geen gebruik van de klassemodule , maar van de addin.
Het userform in de addin maakt gebruik van een klassemodule.
 

Bijlagen

Laatst bewerkt:
SNB,
klopt inderdaad, werkt helemaal super!! Tot mijn spijt kan ik de code, mijn probleem, nog niet helemaal volgen.


Mark,
ga nog aan de slag om mijn eigen code ook werkend te krijgen.

Sluit daarom nog niet af.
 
Laatst bewerkt:
in plaats van er hier op te klikken moet je het 'opslaan als...' (rechtermuisknop)
 
Je ziet dus dat je helemaal niet veel code nodig hebt:

in de addin

in 'Thisdocument' de macro
Code:
Sub start_scherm()
  scherm.Show
End Sub

in het userform 'scherm'

Code:
Public m_snb As New Collection

Public Sub UserForm_Initialize()
  For Each ct In Controls
    If LCase(TypeName(ct)) = "optionbutton" Then
      m_snb.Add New ClsRegio
      Set m_snb.Item(m_snb.Count).m_option = ct
    End If
  Next
End Sub

in de klassemodule 'ClsRegion' die door het userform gebruikt wordt:

Code:
Public WithEvents m_option As MSForms.OptionButton

Private Sub m_option_click()
  If m_option Then
    sn = Split(Join(Filter(Split(ThisDocument.Variables("data"), vbCr), "Regio " & m_option.Caption), ""), "|")
    With ActiveDocument.Tables(1)
      For j = 0 To UBound(sn)
        .Cell(j + 1, 1).Range.Text = sn(j)
      Next
    End With
  End If
  m_option.Parent.hide
End Sub

In het aanroepende document staat alleen een macro:

Code:
Application.Run "start_scherm"
die rechtstreeks de macro 'start_scherm" in de geladen Addin start.

Wil je meer weten klik dan eens op de link in mijn handtekening.
 
Laatst bewerkt:
Eerlijk gezegd denk ik dat je iets simpels onnodig gecompliceerd hebt aangepakt.
Voor het ter beschikking stellen van standaardgegevens en wat VBA code om die gegevens in een document te zetten heb je noch een addin, noch een klassemodule nodig.
Het aardige van Word, in tegenstelling tot de andere office vba bibliotheken is, dat er bij Word wel sprake is van overerving in de vorm van sjablonen.
Zet alle gegevens in een sjaboon, zet alle VBA code in het sjabloon; elk document, gebaseerd op dit sjabloon, heeft dan de beschikking over de gegevens en de code. Zelfs als die in het sjabloon worden gewijzigd wordt de wijziging automatisch van toepassing op de daarop gebaseerde documenten.

Hoewel de klassemodule een manier is om de afwikkeling van het gebruik van de keuzerondjes uit te voeren kan het veel eenvoudiger in het userform zelf afgehandeld worden. Dat zie je in sjabloon Regio11.dot.
Ter illustratie heb ik de startknop niet in het document gezet maar in een extra knop in de menubalk.

Eigenlijk is zelfs een userform in dit geval overbodig. Met een extra knop in de menubalk kan hetzelfde gerealiseerd worden. Als daarin een keuze wordt gemaakt, zet de eraan gekoppelde macro de gegevens in het document.
Dat zie je in sjabloon Regio12.dot
 

Bijlagen

Laatst bewerkt:
Zo leer je nog eens wat. Deze wijze van overerving was mij onbekend. Zeer verassend.
Jouw wijze van programmeren is steeds super gecomprimeert. Uiteraard de bedoeling anderzijds dikwijls moeilijk te ontleden.
Dat maakt dat ik blij ben met de hulp maar op deze wijze zelf programmeren voor mij een brug te ver is.
Ik zal me zelf moeten houden aan de meer conventionele wijze van programmeren.

De vraag is meer dan voldoende opgelost waarvoor nogmaals dank. Ga me nu bezig houden met het in de praktijk brengen van geboden oplossingen.
 
Laatst bewerkt:
nadat ik dit zag:
Echter ik heb geleerd (VB)

Dat je wel tegen een stootje kon .... ;):)

Door zelf na te denken en uit te proberen ben ik er achter gekomen, dat er toch wel erg veel 'volgens traditie' en niet op basis van een analyse van wat de code precies moet doen, wordt geprogrammeerd.
Het gebruik van een klassemodule voor de afwikkeling van gebeurtenissen van bestaande objekten (bijv. keuzerondjes) is natuurllijk een heel ander geval dan het gebruik van een klassemodule om eigen objekten te maken. In het eerste geval zijn de eigenschappen, methoden en gebeurtenissen van tevoren bepaald (en is dus geen enkele property let of property get procedure nodig.)
Bovendien hebben vooral de programmeurs van de Word VBA bibliotheek de VB- methoden veel gebruikersvriendelijker gemaakt dan ze in VB zijn.
Blijkbaar is ook nog niemand op het idee gekomen om variabelen die verband houden met klassemodules publiek te declareren. Dat biedt ineens leuke handige mogelijkheden.
Ik ben ook nog geen goede klassemodule handleiding voor VBA tegengekomen, waarin niet alleen het hoe beschreven staat (vind ik zelf niet zo interessant), maar vooral het wanneer, waarom, wanneer niet, voordelen, beperkingen en wat eigenlijk het proces is als je met een klassemodule werkt:
(wat is een instantie, wat moet je aan een variabele toewijzen, hoe moet je die stappen beschrijven.)
Als iemand een suggestie heeft ik hoor die graag.
Op mijn website heb ik het geprobeerd voor de controle op userformcontrols en ActiveX-controls.
 
Laatst bewerkt:
Ik ervaar dit niet als een stootje. Zolang wat wordt geschreven met met wederzijds respect gebeurd is er wat mij betreft niets aan de hand.

Het ontbreken van goede beschrijvingen van klassemodulen over het waarom, wanneer etc. kan ik alleen maar onderschrijven.
Google eens naar: Welkom bij de Design Patterns - Sdu. Welliswaar kinderachtig maar maakt de essentie wel duidelijk.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan