VBA-code om VBA-code te verwijderen of aan te passen ?

Status
Niet open voor verdere reacties.

willema

Gebruiker
Lid geworden
26 aug 2005
Berichten
320
Kan je VBA (Excel) schrijven in een Module om VBA in een Worksheet te verwijderen ?

Wat is de bedoeling:
Ik heb een sjabloon in omloop in een redelijk groot aantal duplicaten bij evenveel gebruikers.
Er zijn problemen met ActiveX-elementen die eigenlijk niet gebruikt worden.

Ik heb nu in een andere "hulp"-werkmap een procedure geschreven die alle ActiveX-elementen van het ActiveWorkbook verwijderd.
Bedoeling is dus dat de gebruiker beide bestanden opent en dat men, met het sjabloon als actieve werkmap, de procedure uit de hulp-werkmap uitvoert.

Dit heb ik getest en inderdaad: alle besturingselementen verdwijnen.

Maar...
bij Worksheet_Activate van elk werkblad staat één regel code waarop VBA vervolgens crasht omdat die besturingselementen er niet meer zijn.

Kan ik dus de procedure uit de hulp-werkmap in die zin uitbreiden dat deze in de VBA-code van de ActiveWorkbook.Sheets op zoek gaat naar één regel (te definieren als bvb. een string met vaste waarde en die vervolgens vervangen door ofwel "", ofwel door Chr(39) & String (commentaarregel van maken).

Als dat lukt moet ik er alleen nog een ActiveWorkbook.Save achter plaatsen en de gebruiker kan zelf zijn bestand herstellen in afwachting van een nieuw en foutloos sjabloon.

Groeten,
Marnik
 
Vba code kan alsnog worden verwijderd: link
Wanneer je het werkboek opslaat als .xlsx of .xltx (voor een template) wordt vba vanzelf verwijderd.
info
mvg Leo
 
Dag leofact,
Het is zoals ik schreef niet de bedoeling om VBA volledig te verwijderen, maar zoals ik schreef: slechts één regel per worksheet. Opslaan als .xlsx is dus geen optie.

Dankjewel MDN111,
ik lees het uitgebreide artikel.

Met groeten,
Marnik
 
Ho maar, in het Nederlands !!! Nog beter voor iemand die alleen een cup of tea kan bestellen in het Engels:rolleyes:

Dankjewel snb !
 
Hey snb,

Ben begonnen om het artikel op jouw website te lezen.
Het eerste wat ik probeerde was de namen uitlezen met de code:

Code:
Sub Modules_namen()
     
     For j = 1 To ThisWorkbook.VBProject.VBComponents.Count
          MsgBox ThisWorkbook.VBProject.VBComponents(j).Name
     Next

End Sub
of
Code:
Sub Modules_namen2()

     For Each cp in ThisWorkbook.VBProject.VBcomponents
          MsgBox cp.Name
     Next

End Sub

als ik die code plak in This Workbook krijg ik de fout 400 met een dreigend rood kruis er voor.
en
als ik die code plak in Module1 krijg ik de fout 1004 tijdens uitvoering: "Toegang tot het Visual Basic-project op programmeerniveau is niet betrouwbaar". Foutopsporing zet de de eerste regel in geel.

Wat zou er hier fout lopen ?
Als ik de namen van de VBcomponents al niet kan uitlezen, heeft het wellicht ook geen zin om verder te experimenteren met code om de code aan te passen.

Groeten,
Marnik
 
Je zult bij de beveiliging (vertrouwenscentrum) wel moeten aangeven dat jij hier mag gaan prutsen:

vertrouwenscentrum / macro setting / Developer macro settings

trust Access to the VBA project object model
 
Dankjewel snb, zo werkt het. Ik kan nu verder in jouw bijzonder interessante tekst :thumb:
 
Hey snb,

het lukt me niet. Enfin, de foutmeldingen heb ik al weg gekregen, maar er verandert niets aan mijn code.

Dit staat in een Module van een eerste bestand:

Code:
Sub AAA_VERWIJDER_BESTURINGSELEMENTEN()
           
    MsgBox "BESTURINGSELEMENTEN OP " & ActiveWorkbook.Name & " WORDEN VERWIJDERD.", vbCritical
    
[COLOR="#008000"]    'besturingselementen op elk werkblad verwijderen[/COLOR]
    For Each sh In ActiveWorkbook.Worksheets
        On Error Resume Next
        sh.DrawingObjects.Visible = True
        sh.DrawingObjects.Delete
        sh.Cells.ClearComments
        On Error GoTo 0
    Next
    
[COLOR="#008000"]    'code onder Worksheet_Change verwijderen op elk werkblad
[/COLOR]    For j = 1 To ActiveWorkbook.VBProject.VBComponents.Count
        With ActiveWorkbook.VBProject.VBComponents(j).CodeModule
            .DeleteLines .ProcStartLine("Worksheet_Activate", 0), .ProcCountlines("Worksheet_Activate", 0)
[COLOR="#008000"]'ik ben beginnen testen met het verwijderen van de code onder Worksheet_Activate, maar het is de bedoeling dat er meer code verdwijnt (zie onderaan deze post). 
'er verschijnt geen foutmelding, maar hiermee wordt ook niets verwijderd.
[/COLOR]        End With
    Next
       
    ActiveWorkbook.Save
    MsgBox "BESTURINGSELEMENTEN OP " & ActiveWorkbook.Name & " ZIJN VERWIJDERD.", vbInformation

End Sub

Bedoeling is dat een tweede bestand geopend is (ActiveWorkbook) en dat AAA_VERWIJDER_BESTURINGSELEMENTEN() uit het eerste bestand daarop wordt uitgevoerd.
Dat tweede bestand heeft op elk van de tien werkbladen besturingselementen en die worden allemaal weg gehaald met het eerste deel van de code. Dat lukt al!
Maar elk van de tien werkbladen heeft ook deze Worksheet-code (op elk werkblad identiek).

Code:
Option Explicit

Private Sub cmdD_Click()
    doorSTREEP
End Sub

Private Sub cmdB_Click()
    VetSETS
End Sub

Private Sub cmdI_Click()
    SchuinSETS
End Sub

Private Sub cmdU_Click()
    OnderstreepSETS
End Sub

Private Sub cmdMaakSL_Romlaag_Click()
    If Left(Me.cmdMaakSL_Romlaag.Caption, 3) = "RIJ" Then
        OmlaagRIJ
    Else
        MaakSETLIJST
    End If
End Sub

Private Sub cmdMaakCL_Romhoog_Click()
    If Left(Me.cmdMaakCL_Romhoog.Caption, 3) = "RIJ" Then
        OmhoogRIJ
    Else
        MaakCASTLIJST
    End If
End Sub

Private Sub cmdMaakUS_Click()
    MaakUITSPLITSING
End Sub

Private Sub cmdMaakTB_Click()
    MaakTUSSENBASIS
End Sub

Private Sub Worksheet_Activate()
    EventsInschakelen
    If Not ActiveSheet.Name = "temp" Then
        ValidList
        ComboboxVerbergen Me, Me.TempCombo
[COLOR="#008000"]        'PrintSetUpSetLstX
[/COLOR]        EventsInschakelen
    End If
End Sub

[COLOR="#008000"]'dit is de enige code die mag blijven bestaan: van hier...[/COLOR]
Private Sub Worksheet_Change(ByVal Target As Range)
    EventsInschakelen
    KorteTscTop Target
    KorteTijd Target
    ColSetUCase Target
    ColPrsUCase Target
    ColScnUCase Target
    ColDNUCase Target
    EventsInschakelen 
End Sub
[COLOR="#008000"]'...tot hier.[/COLOR]

Private Sub Worksheet_Deactivate()
    EventsInschakelen
    If Not ActiveSheet.Name = "temp" Then
        ComboboxVerbergen Me, Me.TempCombo
        'PrintSetUpSetLstX
        EventsInschakelen
    End If
End Sub

Private Sub TempCombo_LostFocus()
    LostFocusTempCombo Me, Me.TempCombo
End Sub

Private Sub TempCombo_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    KeyDownTempCombo KeyCode, Shift, ActiveCell
End Sub

Bedoeling is dat al die code wordt verwijderd, behalve de code onder Private Sub Worksheet_Change(ByVal Target As Range).
Daarin staan een aantal verwijzingen naar macro's in een algemene module die moeten blijven werken.

Ik hoop en waardeer het ten zeerste als je hier even wil naar kijken.
 
Laatst bewerkt:
Als je de beide bestanden hier plaatst....

Is het niet eenvoudiger een kopiebestand te maken, op te slaan zonder macro's (xlsx), er vervolgesn 1 macro aan toe te voegen en op te slaan als xslm of xlsb ?
 
Laatst bewerkt:
Geniaal idee snb !:thumb:

Als je 1000 regels code hebt en je moet er hier en daar 5 van bewaren. Waarom dan 995 regels wissen. Dat is veel moeilijker.
Beter dus eerst alles wissen en die 5 terug plaatsen.

Dankzij de code op jouw website mag ik dit probleem ook al weer op opgelost zetten :D

met dank,
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan