Live-Forum - Die aktuellen Beiträge
Datum
Titel
29.03.2024 13:14:12
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1196to1200
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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?

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
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

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
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
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
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
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

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige