[VBA] Modules wissen

Pagina: 1
Acties:
  • 572 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

Anoniem: 32345

Topicstarter
Hoi!,

Ik heb de pech dat ik een excel macro sheet moet bouwen. Als deze opstart vraagt hij om een invoerbestand (komma gescheiden file). Hij verwerkt deze dan en bouwt er een heel mooi excel sheet van. Ten slotte slaat hij het bestand op en is de gebruiker blij.

Het probleem is alleen dat het opgeslagen bestand dan nog steeds alle achterliggende formulieren en code modules bevat. Dit wil ik eigenlijk alleen in mijn origineel houden. Als ik het resultaat nu open vraagt hij namelijk weer om het bronbestand etc. Dat is niet de bedoeling. Daarbij wordt het resultaat ook 420Kb i.p.v. gewoon 60Kb.

Wat heb ik al gebrobeerd
Ik dacht er eerst een excel sheet template (xlt) van te maken. Maar helaas, de code blijft ook dan aanwezig. Toen gezocht naar een soor van forms en modules collectie om daar eventueel een delete op uit te voeren... ook niet. Grote vriend Google geeft ook weinig resultaat.

Ten slotte nog een property TemplateRemoveExtData gevonden op het workbook, maar dat geld jammer genoeg niet voor code objecten.

Iemand enig idee?

Acties:
  • 0 Henk 'm!

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 02-07 12:14
Je kunt het makkelijkst excel een nieuw bestand laten maken en daarin de csv data zetten, eventueel gebaseerd op een template als je niet de opmaak in code wilt doen.

[ Voor 31% gewijzigd door _js_ op 09-10-2003 13:19 ]


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21:52
Maak een kopie van een leeg excel bestand / een nieuw excel bestand en prop ut daar in

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

Anoniem: 32345

Topicstarter
Dan heb ik alleen nog steeds een groot probleem. De huidige macro doet echt erg veel, data neerzetten, opmaak, grafiekjes bouwen, subtotalen aanzetten, filters plaatsen, totaliseringen, kolombreedtes, etc.

Als ik een nieuw workbook object aanmaak en de worksheets daar naartoe kopieer dan raak ik een hoop van deze opmaak kwijt en dat zou zonde zijn.

Eigenlijk is de macro helemaal perfect, aan het einde moet hij alleen zijn code kwijtraken. Dat moet toch wel mogelijk zijn? Een soort "save zonder code" optie.

Acties:
  • 0 Henk 'm!

  • extraordinare
  • Registratie: September 2000
  • Laatst online: 17:38
Anoniem: 32345 schreef op 10 oktober 2003 @ 09:30:
Dan heb ik alleen nog steeds een groot probleem. De huidige macro doet echt erg veel, data neerzetten, opmaak, grafiekjes bouwen, subtotalen aanzetten, filters plaatsen, totaliseringen, kolombreedtes, etc.

Als ik een nieuw workbook object aanmaak en de worksheets daar naartoe kopieer dan raak ik een hoop van deze opmaak kwijt en dat zou zonde zijn.

Eigenlijk is de macro helemaal perfect, aan het einde moet hij alleen zijn code kwijtraken. Dat moet toch wel mogelijk zijn? Een soort "save zonder code" optie.
Je kan ook een onWorkbookExit macro maken die de modules delete

Acties:
  • 0 Henk 'm!

Anoniem: 32345

Topicstarter
Extraordinare schreef op 10 October 2003 @ 09:39:
[...]

Je kan ook een onWorkbookExit macro maken die de modules delete
Dat is het probleem niet. Ik weet wanneer de conversie gereed is. Ik kan alleen de code niet verwijderen. Als ik dat kan ben ik klaar. Ik werd net helemaal vrolijk van het volgende stukje code:

code:
1
2
3
4
5
6
7
8
9
Sub DeleteVBComponent(ByVal wb As Workbook, ByVal CompName As String)
' deletes the vbcomponent named CompName from wb
    Application.DisplayAlerts = False
    On Error Resume Next ' ignores any errors
    wb.VBProject.VBComponents.Remove wb.VBProject.VBComponents(CompName) 
    ' delete the component
    On Error GoTo 0
    Application.DisplayAlerts = True
End Sub


Dit zou perfect zijn geweest maar geeft helaas de volgende melding:
Toegang tot het Visual Basic-project op programmeerniveau is niet betrouwbaar verder doet het geen drol en heb ik zowel aan de mededeling als aan de code weer helemaal geen f@ck.

[ Voor 7% gewijzigd door Anoniem: 32345 op 10-10-2003 10:59 ]


Acties:
  • 0 Henk 'm!

  • Yoeri
  • Registratie: Maart 2003
  • Niet online

Yoeri

O+ Joyce O+

(overleden)
ik zou gewoon een nieuw workbook aanmaken in die macro, in plaats van in de huidige sheet te werken

in plaats van
with currentworkbook
.cell(A1).Color = Blue
end with

zet je dan
with newMadeWorkbook
.cell(A1).color = blue
end with


probleem opgelost toch?

Kijkje in de redactiekeuken van Tweakers.net
22 dec: Onze reputatie hooghouden
20 dec: Acht fouten


Acties:
  • 0 Henk 'm!

  • extraordinare
  • Registratie: September 2000
  • Laatst online: 17:38
Mjah... dat zou ook goed kunnen werken... en laat je je sheet waar je macro's in staan sluiten zonder opslaan.... en blijf je met de nieuwe sheet achter ;)

Acties:
  • 0 Henk 'm!

Anoniem: 32345

Topicstarter
Bedankt weer allemaal. Een kopietje maken naar een nieuw workbook is nu inderdaad gelukt. Toch een beetje bagger dat ze wel aangeven dat het mogelijk is om code modules te wissen en dat je dan vette errors krijgt als je dat gaat proberen.

Acties:
  • 0 Henk 'm!

  • Pink Panther
  • Registratie: Juni 2003
  • Laatst online: 09-06 23:25
Je kunt dus wel gebruik maken van de macro die de modules verwijderen.
Hiertoe moet je wel aangeven dat de macro toegnag mag hebben tot de modules. Dit moet je als volgt doen (vanuit worksheet):

Tools -> Macro -> Security -> Trusted Sources -> Trust Access to Visual Basic Projects aanzetten.

Een tweede mogelijkheid is natuurlijk gewoon je huidige macro uitvoeren en vervolgens de sheet die de gegevens bevat te kopieeren naar een nieuw bestand.
Het voordeel hiervan is dat je de huidige macro maar minimaal hoeft aan te vullen en dus verder niet hoeft te wijzigen.

[ Voor 34% gewijzigd door Pink Panther op 17-10-2003 08:05 ]


Acties:
  • 0 Henk 'm!

  • henkleerssen
  • Registratie: December 2000
  • Niet online

henkleerssen

Your life is as you narrate it

Anoniem: 32345 schreef op 10 October 2003 @ 10:30:
[...]


Dat is het probleem niet. Ik weet wanneer de conversie gereed is. Ik kan alleen de code niet verwijderen. Als ik dat kan ben ik klaar. Ik werd net helemaal vrolijk van het volgende stukje code:

code:
1
2
3
4
5
6
7
8
9
Sub DeleteVBComponent(ByVal wb As Workbook, ByVal CompName As String)
' deletes the vbcomponent named CompName from wb
    Application.DisplayAlerts = False
    On Error Resume Next ' ignores any errors
    wb.VBProject.VBComponents.Remove wb.VBProject.VBComponents(CompName) 
    ' delete the component
    On Error GoTo 0
    Application.DisplayAlerts = True
End Sub


Dit zou perfect zijn geweest maar geeft helaas de volgende melding:
Toegang tot het Visual Basic-project op programmeerniveau is niet betrouwbaar verder doet het geen drol en heb ik zowel aan de mededeling als aan de code weer helemaal geen f@ck.
De code zou kunnen werken als je dus (onder VB editor, "Tools", "References" en Visual Basic Extensibility" aanvinken .. maakt ff niet uit welke versie).

Andere code zoals ik heb hem gemaakt zou ook kunnen werken:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
Function DeleteModule(ProjectName As String, Modulename As String) As Boolean

Dim X As Object

Set X = Application.VBE.VBProjects(ProjectName).VBComponents

' Delete the current module.
X.Remove VBComponent:=X.Item(Modulename)

End Function

Moet je dus wel weer de namen weten van de modules...
Je zou nog kunnen checken of het specifiek een vb module in het project met:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Function ComponentType(intType As Integer) As String

Select Case intType
Case VBIDE.vbext_ComponentType.vbext_ct_StdModule
    ComponentType = "Module"
Case VBIDE.vbext_ComponentType.vbext_ct_ClassModule
    ComponentType = "Class Module"
Case VBIDE.vbext_ComponentType.vbext_ct_MSForm
    ComponentType = "UserForm"
Case VBIDE.vbext_ComponentType.vbext_ct_Document
    ComponentType = "Sheet"
Case Else
    ComponentType = "Unknown"
End Select

End Function


Het een en ander in for next loopje zetten en checken op alle compnonenten en je bent er...

Acties:
  • 0 Henk 'm!

  • Bzzje
  • Registratie: November 2000
  • Laatst online: 23-06 23:00

Bzzje

Negeren is vooruitzien

Ook zonder namen van de modules kan je het doen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim vFilename As Variant
    Dim wbActiveBook As Workbook
    Dim oVBComp As Object
    Dim oVBComps As Object
    
    If Cancel = True Then
        Exit Sub
    Else
        Sheets("Report").Activate
        'hide userform lookups
        Lookups.Hide
        On Error GoTo CodeError

        Set wbActiveBook = ActiveWorkbook
    
        'Now strip all VBA, modules, userforms from the copy
        Set oVBComps = wbActiveBook.VBProject.VBComponents

        For Each oVBComp In oVBComps
            Select Case oVBComp.Type
                Case 1, 2, 3  'Standard Module, Class Module, Userform
                oVBComps.Remove oVBComp
            Case Else
                With oVBComp.CodeModule    'Worksheet or workbook code module
                .DeleteLines 1, .CountOfLines
                End With
            End Select
        Next oVBComp
        'turn alerts off befor deletion of sheets
        Application.DisplayAlerts = False
        Sheets("nomacro").Delete
        Sheets("start lookups").Delete
        Application.DisplayAlerts = True
    End If
        Exit Sub
CodeError:
    MsgBox Err.Description, vbExclamation, "An Error Occurred"

End Sub


weet niet of je er nog wat aan hebt nu...

Negeren is vooruitzien

Pagina: 1