verschil ThisWorkbook en Module

Status
Niet open voor verdere reacties.

kv41282

Gebruiker
Lid geworden
14 dec 2007
Berichten
91
Ik gebruik nu sinds enkele dagen/weken VBA- codes in Excel. Er gaat echt een wereld voor mij open.

Maar wat me nog niet duidelijk is:

Wat is het verschil tussen codes die ik in ThisWorkbook moet zetten, en codes die ik in Modules zet?

En......een andere vraag is:
Is er veel verschil met excel 2003 en excel2007 VBA ?

Ik heb namelijk op mn werk excel2003 en thuis excel 2007.
En nu wil er in excel2007 een excel2003 code die ik in ThisWorkbook heb staan niet werken. Komt dit door die versie verschillen?
Of moet ik die code ergens anders neerzetten?

Code:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
On Error Resume Next
If Not Application.Intersect(Target, Range("B1")) Is Nothing Then Sh.Name = Range("B1").Text
On Error Goto 0
End Sub

Gr Kim
 
ThisWorkbook is een class module, net zoals de modules die bij WorkSheets horen, en code 'achter' userforms.
Deze code hoort dus bij resp het workbook of de sheets, en wordt voornamelijk gebruikt bij dat object. Zo kan iedere worksheet een eigen _SheetChange hebben.

Een 'normale' module kan naast ieder type (sub)routine of functie ook public/private variabelen bevatten, gedeclareerd op module niveau.
 
verschil tussen ThisWorkbook en Modules

In een module is het mogelijk Variabelen, Subs en Functions te definiëren die je vanuit andere modules (dus ook ClassModules kunt aanroepen). Als je een globale variabele als "Public Varnaam as Integer" declareert ipv "Dim Varnaam as Integer" kun je deze variabele ook vanuit andere (Class)modules gebruiken. Hetzelfde geldt voor constanten, door het voorvoegsel Public voor de Const declaratie te zetten.

Subs en Function wijken wat af; als je in een module een van deze twee declareert zijn ze impliciet al Public. Ofwel het is niet perse nodig om hier Public voor te zetten. Als een sub of function specifiek Private moet zijn dien je dit wel aan te geven door een Sub/Function als "Private Sub" of "Private Function" te declareren. In Thisworkbook zijn alle declaraties impliciet Private. Sterker nog, het is niet toegestaan om zaken Public te declareren.

In Thisworkbook komen de werkbladgebeurtenissen (Events) te staan zoals "BeforeDoubleclick", "BeforeSave", etc. Als je bijv. een BeforeDoubleclick event hebt gemaakt die de volgende instructie afhandelt MsgBox "Hier ben ik" zal er telkens een Windows message box verschijnen als je op een cel in het actieve werkblad dubbelklikt. Als op Ok drukt zal de cursor in de cel verschijnen.
 
code

Wat je code betreft het kan inderdaad zijn dat er verschillen zijn tussen beide versies.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
On Error Resume Next
If Not Application.Intersect(Target, Range("B1")) Is Nothing Then Sh.Name = Range("B1").Text
On Error Goto 0
End Sub

Ik vind alleen de declaratie van je fout afhandeling wat eigenaardig. Je geeft eerst een On Error resume next, wat inhoudt dat je wilt dat de fout genegeerd wordt en dat het programma verder gaat met de volgende instructie. De volgende instructie na de code die een fout kan opleveren is: "on error goto 0"???

Ik denk trouwens dat er inderdaad een fout optreedt. Haal de tweede On error weg en schakel de eerste even uit door er een REM voor te zetten, sla het dan even op en zorg dat je event wordt aangeroepen door iets te veranderen in je werkblad. Als er een foutmelding verschijnt kun je via de "Help" achterhalen wat er fout is.
 
Laatst bewerkt:
on error goto

Oh, Juist.

Is dus nutteloos omdat het de laatste regel in de sub is. De on error event handler wordt automatisch uitgeschakeld bij het verlaten van de sub. Hij is immers locaal gedeclareerd.
 
code

--------------------------------------------------------------------------------
Wat je code betreft het kan inderdaad zijn dat er verschillen zijn tussen beide versies.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
On Error Resume Next
If Not Application.Intersect(Target, Range("B1")) Is Nothing Then Sh.Name = Range("B1").Text
On Error Goto 0
End Sub
Ik vind alleen de declaratie van je fout afhandeling wat eigenaardig. Je geeft eerst een On Error resume next, wat inhoudt dat je wilt dat de fout genegeerd wordt en dat het programma verder gaat met de volgende instructie. De volgende instructie na de code die een fout kan opleveren is: "on error goto 0"???

Ik denk trouwens dat er inderdaad een fout optreedt. Haal de tweede On error weg en schakel de eerste even uit door er een REM voor te zetten, sla het dan even op en zorg dat je event wordt aangeroepen door iets te veranderen in je werkblad. Als er een foutmelding verschijnt kun je via de "Help" achterhalen wat er fout is.

Ik kom er nog niet uit.....

Het zit zo. in tabblad 1 wordt met een formule, in kolom B, 30 datums gecreeerd. Deze datums wordt dan in de komende 30 tabbladen in cel "B1" weergegeven deze waarde wordt ook gebruikt voor de tabbladnamen.

Met de code die ik hierboven had staan werkte alles prima in excel 2003. Totdat ik ben overgestapt op excel 2007. Hier werken een aantal dingen niet, die ik al wel heb op kunnen lossen behalve dan het bovenstaande. Ook als ik het document nu weer eens een keer in excel2003 wil openen komt er een fout in het beeld. Dus ik kan niet verder......:confused:
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan