2017-05-10 3 views
0

Ich teile ein Arbeitsblatt mit ein paar Kollegen. Diese Tabelle wird schließlich an eine externe Partei gesendet, sodass wir das VBE-Modul programmatisch als Teil des Makros entfernen. Ich habe diesen Code, der von der Microsoft-Dokumentation entnommen wurde:Laufzeitfehler '9' beim Entfernen des Moduls Excel VBA

Dim vbCom As Object 

    Set vbCom = Application.VBE.ActiveVBProject.VBComponents 

    vbCom.Remove VBComponent:= vbCom.Item("sample_module") 

Es ist für einige Benutzer funktioniert, aber ich Laufzeitfehler ‚9‘ mit anderen. Der Rest des Skripts wird schließlich ausgeführt, das Modul wird jedoch nicht entfernt.

+0

RTE 9 bedeutet „Dieser Artikel existiert nicht“ - wenn es kein Modul mit dem Namen 'sample_module' im' VBComponents' Sammlung, dann gibt es nichts zu entfernen. –

+0

Auch wenn der Rest des Skripts ausgeführt wird, haben Sie 'On Error Resume Next' irgendwo, und das ist wahrscheinlich eine schlechte Idee. –

+0

Es gibt jedoch ein sample_module. Einige Benutzer erhalten den Fehler und andere nicht. Für die Benutzer, die den Fehler nicht erhalten, wird das Modul entfernt. Ich habe auch keine On Error Resume Next im Skript. Ich habe das Gefühl, dass ich das Modul nicht richtig referenziere, aber ich bin nicht sicher, wie ich es angehen soll. –

Antwort

1

versuchen, den Code mit der For Each vbCom In .VBComponents Schleife unten zu laufen, sehen, was man bekommt:

Option Explicit 

Sub CheckVBProjComp() 

Dim vbCom As Object 
Dim flag As Boolean 
Dim VbComName As String 

VbComName = "sample_module" 

With ThisWorkbook.VBProject 
    For Each vbCom In .VBComponents 
     If vbCom.Name Like VbComName Then 
      .VBComponents.Remove .VBComponents(vbCom.Name) 
      flag = True 
      Exit For 
     End If 
    Next vbCom 
End With 

If flag Then 
    MsgBox "VB Component " & Chr(34) & VbComName & Chr(34) & " successfully removed", vbOKOnly 
Else 
    MsgBox "Unable to find VB Component " & Chr(34) & VbComName & Chr(34), vbInformation 
End If 

End Sub 
+1

Kudos zum Entfernen der Ambiguität 'ActiveVBProject'. –

+0

Danke für die Hilfe. Das funktioniert ganz gut. Der Fehler wird nicht mehr angezeigt. –

+0

@WalterWhalen Sie sind willkommen, Sie können als "Antwort" markieren, indem Sie auf das graue Häkchen neben meiner Antwort –

0

Sie müssen einen Verweis auf die VBA-Erweiterbarkeitsbibliothek hinzufügen und auf jedem Client, auf dem diese Befehle ausgeführt werden, "Zugriff auf das Visual Basic-Projekt vertrauen" aktivieren. Sie können diese Seite von Chip mit einem großen Zusammenbruch sehen: http://www.cpearson.com/excel/vbe.aspx

+0

Ich dachte ich war, als ich vbCom eingestellt habe. Ich habe auch bereits die Benutzer den Vertrauenszugang ermöglichen lassen. Sollte ich irgendwie meine vbCom Referenz ändern? –

+0

@WalterWhalen Nr. Ihr Code macht spät gebundene Aufrufe an die VBIDE API, weil Sie 'vbCom As Object' deklariert haben. –

0

Wenn das Ziel einfach ist, alle Module zu entfernen, eine vorgegebene Excel-Arbeitsmappe, dann arbeiten Sie diese Workbook 's VBProject, nicht davon ausgehen, dass die VBE.ActiveVBProject wird das Projekt hinter der Arbeitsmappe Sie zielen.

Dieses Verfahren Streifen all Nicht-Dokument Module aus den angegebenen target:

Public Sub RemoveAllMacros(ByVal target As Workbook) 

    'if the target is ThisWorkbook, we're removing the very macro we're running! 
    If target Is ThisWorkbook Then Exit Sub 

    Dim components As VBComponents 
    Set components = target.VBProject.VBComponents 

    Dim component As VBComponent 
    For Each component In components 
     If component.Type <> vbext_ct_Document Then components.Remove component 
    Next 

End Sub 
Verwandte Themen