Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBComponents remove

Forumthread: VBComponents remove

VBComponents remove
Uwe
Hallo Forum,
ich habe folgendes Problem und leider im Forum noch keine Antwort gefunden.
Ein Makro soll in einem laufenden Projekt ein Modul updaten.
Das funktioniert mit
VBComponents.Remove X
VBComponents.Import X
Der Haken ist, daß das neue X dann X1 heißt. Offensichtlich ist X-alt noch nicht vollständig verschwunden bevor X-neu importiert wird.
Hat jemand eine Lösung?
Anzeige
AW: VBComponents remove
31.01.2011 16:35:29
Josef

Hallo Uwe,
probier mal ein DoEvents zwischen den beiden Zeilen, sonst zeig mal den Gesamten Code.

Gruß Sepp

Anzeige
AW: VBComponents remove
31.01.2011 17:36:45
Uwe
Hallo Sepp, hallo Forum,
With ActiveWorkbook.VBProject
for i=.VBComponents.Count To 1 Step -1
set objX=.VBComponents(i)
If Dir(strVerzeichnisname & objX.Name & "*.*") "" Then
Select Case objX.Type
Case 1 ,2, 3
.VBComponents.Remove objX
Case Else
MsgBox("Fehler")
End select
End if
Next
strFilename=Dir(strVerzeichnisname & "*.*")
While StrDateiname""
Select Case LCase(Right(strFilename,3))
Case "frm", "bas", "cls"
VBComponents.Import strVerzeichnisname & strFilename
Case Else
MsgBox ("Fehler")
End Select
Wend
End With
Die unwesentlichen Dinge zwischendurch (sichern der alten Komponente etc.) habe ich weggelassen.
DoEvents hat es übrigens nicht gebracht. Eine Ablaufunterbrechung über Haltepunkte führt allerdings dazu, dass das alte Modul entfernt wird und das neue Modul korrekt eingelesen wird.
Für jede Idee dankbar - Uwe
Anzeige
AW: VBComponents remove
31.01.2011 17:45:34
Josef

Hallo Uwe,
versuch es einmal so.
With ActiveWorkbook.VBProject
  
  For i = .VBComponents.Count To 1 Step -1
    Set objX = .VBComponents(i)
    If Dir(strVerzeichnisname & objX.Name & "*.*") <> "" Then
      Select Case objX.Type
        Case 1, 2, 3
          .VBComponents.Remove objX
        Case Else
          MsgBox ("Fehler")
      End Select
    End If
  Next
  
  Application.Wait Now + TimeSerial(0, 0, 1)
  
  strFilename = Dir(strVerzeichnisname & "*.*")
  
  Do While strDateiname <> ""
    Select Case LCase(Right(strFilename, 3))
      Case "frm", "bas", "cls"
        VBComponents.Import strVerzeichnisname & strFilename
      Case Else
        MsgBox ("Fehler")
    End Select
    strDateiname = Dir
  Loop
  
End With


Gruß Sepp

Anzeige
AW: VBComponents remove
31.01.2011 17:54:49
Uwe
Hi Sepp,
danke für die prompte Antwort - leider war es das nicht. Es handelt sich sicher nicht um ein Timing-Problem. Wie schon erwähnt braucht es wohl eher eine Ablaufunterbrechung, aus irgendwelchen, mir noch unerfindlichen Gründen, klappt das Ganze aber hin und wieder bei bestimmten Modulen wenn anschließend noch weitere Module ausgetauscht werden.
Viele Grüße, Uwe
Anzeige
AW: VBComponents remove
31.01.2011 18:17:50
Josef

Hallo Uwe,
dann trennen wir die beiden Codes einmal. Für die Prozedur "Test" aus, allerdings weiß ich nicht, woher "strVerzeichnisname" seinen Wert bezieht.
Sub loeschen()
  Dim objVBComp As Object
  
  With ActiveWorkbook.VBProject
    
    For Each objVBComp In .VbComponents
      If Dir(strVerzeichnisName & objVBComp.Name & "*.*") <> "" Then
        Select Case objVBComp.Type
          Case 1, 2, 3
            .VbComponents.Remove objVBComp
          Case Else
            MsgBox ("Fehler")
        End Select
      End If
    Next
  End With
  
  
End Sub

Sub einfuegen()
  With ActiveWorkbook.VBProject
    
    strFileName = Dir(strVerzeichnisName & "*.*")
    
    Do While strFileName <> ""
      Select Case LCase(Right(strFileName, 3))
        Case "frm", "bas", "cls"
          .VbComponents.Import strVerzeichnisName & strFileName
        Case Else
          'MsgBox ("Fehler")
      End Select
      strFileName = Dir
    Loop
    
  End With
  
End Sub

Sub test()
  loeschen
  Application.OnTime Now + TimeSerial(0, 0, 1), "einfuegen"
End Sub


Gruß Sepp

Anzeige
AW: VBComponents remove
31.01.2011 18:25:26
Uwe
Hi Sepp,
klingt gut, kann ich aber erst morgen testen.
Schönen Abend noch, Uwe
AW: VBComponents remove
01.02.2011 08:22:14
Uwe
Hallo Forum,
leider hat auch das Trennen nicht zum gewünschten Ergebnis geführt.
Remove objX löscht das Objekt X nicht, jedenfalls nicht zur Laufzeit. Beim Löschen mehrerer Module wird das zuletzt aufgerufene Modul nicht gelöscht, die vorherigen schon. Setze ich hinter Remove objX einen Haltepunkt, wird objX gelöscht.
Die Lösung kann wohl nicht sein, ein Dummy-Modul mitzuführen das immer als letztes Modul gelöscht wird?
Gruß Uwe
Anzeige
AW: VBComponents remove
01.02.2011 08:49:22
Josef

Hallo Uwe,
schwierig, weil für mich nicht nachvollziehbar. Bei mir werden mit allen hier gezeigten Codes jeweils alle Module gelöscht und auch wieder eingefügt.

Gruß Sepp

Anzeige
AW: VBComponents remove
01.02.2011 09:06:14
Uwe
Guten Morgen Sepp,
ich hab es gerade noch einmal auf einem anderen Rechner versucht - nix. Einige Module wurden korrekt ersetzt, andere nicht. Sobald jedoch der Programmablauf stoppt werden die Module entfernt während des Laufs (bei mir durch eine offene Userform) bleiben einige alte Module erhalten, die neuen heißen dann eben X1 etc. und sind somit nicht ansprechbar, bzw. erzeugen während der Laufzeit des Codes den Fehler "mehrdeutiger Name" - logisch, es gibt den Modulnamen in X und X1.
Ich versuch es gleich noch mal auf einem dritten Rechner.
Gruß Uwe
Anzeige
AW: VBComponents remove
01.02.2011 09:17:17
Josef

Hallo Uwe,
dann schliesse doch das UF während der Code läuft und lade sie anschliessend wieder.

Gruß Sepp

Anzeige
AW: VBComponents remove
01.02.2011 09:34:48
Uwe
Hi Sepp,
nein, Missverständnis. Wenn ich die UF schließe verschwindet zwar das alte Modul, allerdings heißt das neue Modul dann X1, nicht X, denn X existierte ja noch als X-neu importiert wurde. Die offene UF führt hier nur dazu, dass ich die beiden Module X und X1 im Editor unzweideutig nebeneinander sehen kann also klar ist, dass zu diesem Zeitpunkt (nach Ablauf des Moduls "Update") das alte X immer noch da ist, trotz remove.
Hast Du eine Idee unter welchen Bedingungen Remove erst nach einem "Break" arbeitet? Dass das zu ersetzende Modul bei Ausführen von Remove nicht aktiv ist, versteht sich von selbst.
Der dritte Rechner ergab übrigens auch nichts Anderes.
Gruß Uwe
Anzeige
AW: VBComponents remove
01.02.2011 13:43:04
Uwe
Hi Forum, hi Sepp,
mir ist noch was Lustiges aufgefallen, vielleicht hat dazu jemand eine Idee:
Remove objX
Import objX
erzeugt, wie ja diskutiert objX1. Nach Beendigung des Makros ist auch objX verschwunden und es existiert objX1. Wenn ich objX1 umbenenne in objX und das obige Remove - import mit dem umbenannten Modul objX wiederhole funktioniert das Ganze, d.h. ich habe dann objX neu importiert und es heißt auch objX und nicht objX1.
? Fragen, Fragen, nichts als Fragen, Uwe
Anzeige
AW: VBComponents remove
01.02.2011 13:44:18
Uwe
Hi,
hab vergessen die Frage als offen zu markieren.
Uwe
AW: VBComponents remove
01.02.2011 14:02:22
Uwe
Hi schon wieder,
danke Euch allen für Eure Hilfsversuche, aber ich habe jetzt eine Lösung gefunden.
Die alte mit Remove "entfernte" (augenscheinlich aber nur als zu löschen markierte) objX bennene ich nach dem Remove um. VBComponents(objX.Name).Name = "Test"
Dadurch wird der alte Name von objX frei und dem Import des gleichnamigen objX steht nichts mehr im Weg. Bei Beendigung des Makros wird Modul "Test" gelöscht -- Ende.
Hab noch nicht probiert was passiert wenn mehrere Module "Test" entstehen, das lässt sich aber auf jeden Fall mit einer Abfrage und fortlaufender Nummerierung von "Test" erledigen.
Tschüß, Uwe
Anzeige
;
Anzeige

Infobox / Tutorial

VBComponents entfernen und importieren in VBA


Schritt-für-Schritt-Anleitung

Um ein Modul in einem laufenden VBA-Projekt zu entfernen und ein neues Modul zu importieren, kannst du den folgenden Code verwenden. Stelle sicher, dass du die richtige Excel-Version verwendest, die VBA unterstützt:

Sub UpdateModule()
    Dim objX As Object
    Dim strVerzeichnisname As String
    strVerzeichnisname = "C:\Dein\Pfad\" ' Passe den Pfad zu deinem Verzeichnis an

    With ActiveWorkbook.VBProject
        For i = .VBComponents.Count To 1 Step -1
            Set objX = .VBComponents(i)
            If Dir(strVerzeichnisname & objX.Name & "*.*") <> "" Then
                Select Case objX.Type
                    Case 1, 2, 3
                        .VBComponents.Remove objX
                    Case Else
                        MsgBox "Fehler"
                End Select
            End If
        Next i

        ' Warten, um sicherzustellen, dass das alte Modul entfernt wurde
        Application.Wait Now + TimeSerial(0, 0, 1)

        ' Importiere das neue Modul
        Dim strFilename As String
        strFilename = Dir(strVerzeichnisname & "*.*")

        Do While strFilename <> ""
            Select Case LCase(Right(strFilename, 3))
                Case "frm", "bas", "cls"
                    .VBComponents.Import strVerzeichnisname & strFilename
                Case Else
                    MsgBox "Fehler"
            End Select
            strFilename = Dir
        Loop
    End With
End Sub

In diesem Code verwenden wir VBComponents.Remove, um das alte Modul zu entfernen, und VBComponents.Import, um das neue Modul zu importieren.


Häufige Fehler und Lösungen

  • Problem: Das Modul wird nicht vollständig entfernt, und das neue Modul hat den Namen X1 anstelle von X.

    • Lösung: Füge eine Verzögerung mit Application.Wait oder DoEvents zwischen den Zeilen ein. Dies kann helfen, sicherzustellen, dass das alte Modul vollständig entfernt wird, bevor das neue importiert wird.
  • Problem: Fehler "mehrdeutiger Name" während der Laufzeit.

    • Lösung: Benenne das alte Modul nach der Verwendung von Remove um, um sicherzustellen, dass der Name frei wird.

Alternative Methoden

Eine alternative Methode könnte sein, die Module in separaten Subroutinen zu verwalten. Beispielsweise:

Sub Loeschen()
    ' Logik zum Entfernen von Modulen
End Sub

Sub Einfuegen()
    ' Logik zum Importieren von Modulen
End Sub

Sub Test()
    Loeschen
    Application.OnTime Now + TimeSerial(0, 0, 1), "Einfuegen"
End Sub

Durch das Trennen der Codeabschnitte kannst du die Kontrolle über die Ausführung verbessern und Timing-Probleme vermeiden.


Praktische Beispiele

Ein praktisches Beispiel könnte wie folgt aussehen:

Sub UpdateModuleWithRenaming()
    Dim objX As Object
    Dim strVerzeichnisname As String
    strVerzeichnisname = "C:\Dein\Pfad\"

    With ActiveWorkbook.VBProject
        For i = .VBComponents.Count To 1 Step -1
            Set objX = .VBComponents(i)
            If Dir(strVerzeichnisname & objX.Name & "*.*") <> "" Then
                .VBComponents.Remove objX
                ' Umbenennung, um Konflikte zu vermeiden
                .VBComponents(objX.Name).Name = "Test"
            End If
        Next i
        ' Importiere das neue Modul
        ' (Rest des Codes wie oben)
    End With
End Sub

Hier wird das alte Modul umbenannt, um sicherzustellen, dass das neue Modul korrekt importiert werden kann.


Tipps für Profis

  • Verwende Application.OnTime: Diese Methode kann helfen, die Ausführung zu steuern und sicherzustellen, dass das Modul importiert wird, nachdem das alte entfernt wurde.

  • Verwende einen Dummy-Namen: Wenn du regelmäßig Module austauschst, könnte es hilfreich sein, einen Dummy-Modulnamen zu verwenden, der vorübergehend verwendet wird, um Konflikte zu vermeiden.

  • Überprüfe die Module regelmäßig: Halte deine Module sauber und überprüfe, ob sie nicht mehr benötigt werden, um Verwirrung zu vermeiden.


FAQ: Häufige Fragen

1. Was heißt Remove in VBA?
Remove entfernt ein Modul aus dem VBA-Projekt. Es ist wichtig, dass das Modul nicht mehr verwendet wird, um Konflikte zu vermeiden.

2. Warum wird mein Modul nicht gelöscht?
Oft liegt es an Timing-Problemen. Stelle sicher, dass du eine Verzögerung oder eine Ablaufunterbrechung hinzufügst, um sicherzustellen, dass das alte Modul vollständig entfernt wird, bevor das neue importiert wird.

3. Kann ich mehrere Module gleichzeitig entfernen?
Ja, indem du eine Schleife verwendest, um durch alle Module zu iterieren, kannst du mehrere Module in einem Durchgang entfernen. Achte darauf, die Reihenfolge der Module zu berücksichtigen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige