Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1632to1636
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

Tabellen-Objekte verschwunden

Tabellen-Objekte verschwunden
11.07.2018 11:03:03
Burkhard
Hallo miteinander,
ich habe hier ein seltsames, mir unerklärliches Phänomen: nach der Bearbeitung einer Excel-Datei (sImportToFile) durch ein VBA-Programm aus einer anderen Datei heraus hat die bearbeitete Datei sämtliche Tabellen verloren! Im VBA-Editor sind sie zwar unter "Microsoft Excel Objekte" noch zu sehen, mit der rechten Maustaste kann ich aber den Punkt "Objekt anzeigen" nicht auswählen, da er inaktiv (ausgegraut) ist. Der Code ist, sofern zutreffend, vorhanden.
Die VBA-Funktion in der "Hilfs-Datei" wirft aus der Zieldatei zuerst alle Forms und Module raus und importiert sie anschließend aus dem angegebenen Pfad (sImportFromPath) neu. Während der Laufzeit tritt kein Fehler auf ...
Function ImportToFile(ByVal sImportToFile As String, ByVal sImportFromPath As String)
Dim obImportComponent As Object
Dim wbImportWorkbook As Workbook
Dim sComponentToImport As String
Application.ScreenUpdating = False
Application.EnableEvents = False
Set wbImportWorkbook = GetObject(sImportToFile)
With wbImportWorkbook.VBProject
For Each obImportComponent In .VBComponents
If obImportComponent.Type = 1 Or obImportComponent.Type = 3 Then
'modules and forms
.VBComponents.Remove .VBComponents(obImportComponent.Name)
End If
Next
sComponentToImport = Dir$(sImportFromPath & "*.*")
Do While sComponentToImport  ""
If UCase$(Right$(sComponentToImport, 4)) = ".BAS" Or _
UCase$(Right$(sComponentToImport, 4)) = ".FRM" Then  'Or _
.VBComponents.Import sImportFromPath & sComponentToImport
End If
sComponentToImport = Dir$
Loop
End With
If Not wbImportWorkbook Is Nothing Then
wbImportWorkbook.Close True         ' True = SaveChanges
Set wbImportWorkbook = Nothing
End If
Application.ScreenUpdating = True
Application.EnableEvents = True
Hat irgendjemand eine Idee?

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Ideensammlung
11.07.2018 11:37:48
mmat
Hi
Hat der Code schon jemals richtig funktioniert?
Die Zeile kommt mir komisch vor, ich hätts wahrscheinlich erstmal mit Workbook.open probiert:
Set wbImportWorkbook = GetObject(sImportToFile)
Ansonsten laß das mal laufen und guck dir an ob die Ergebnisse den Erwartungen entsprechen:
Function ImportToFile(ByVal sImportToFile As String)
Dim obImportComponent As Object
Dim wbImportWorkbook As Workbook
Dim sComponentToImport As String
Set wbImportWorkbook = GetObject(sImportToFile)
With wbImportWorkbook.VBProject
For Each obImportComponent In .VBComponents
Debug.Print obImportComponent.Name & " / " & obImportComponent.Type
Next
End With
End Sub

Anzeige
AW: Ideensammlung
11.07.2018 12:26:41
Burkhard
Hallo,
ich habe mir die hinausgeworfenen components (ebenso wie die "hineingeworfenen") anzeigen lassen - alles OK, nur Forms und Module, wie gewünscht.
Das GetObject() habe ich statt Workbook.open genommen, weil hier die geöffnete Datei nicht automatisch aktiviert wird, also am Bildschirm nicht zu sehen ist - die Funktion ImportToFile() kann auch rekursiv für mehrere Zieldateien aufgerufen werden, und da stört es doch ziemlich, wenn die gerade bearbeitete Datei mal eben aufgeht und dann wieder verschwindet. Wenn man das bei Workbook.open auch hinbekommt (also auch ohne kurzes "Aufblitzen"), dann würde ich es schon mal damit probieren.
Burkhard
Anzeige
AW: Ideensammlung
11.07.2018 13:02:38
mmat
Hallo Burkhard,
also ich würde zumindest mal im Test probieren, ob es bei Workbook.open funktioniert. Vielleicht muß der optionale Parameter class bei Getobject in deinem Fall explizit angegeben werden.
Ansonsten hätt ich natürlich noch viele weitere Ideen, aber das ist mir ein wenig zusehr im Trüben gefischt. Vielleicht weiss einer der Kollegen hier nochwas.
AW: Ideensammlung
11.07.2018 15:04:15
Nepumuk
Hallo,
wenn eine Mappe per GetObject geöffnet wird ist sie ausgeblendet. Wenn sie dann gespeichert wird, wird sie auch ausgeblendet gespeichert. Um sie einzublenden musst du im Ansicht - Gruppe Fenster auf "Einblenden" klicken.
Gruß
Nepumuk
Anzeige
AW: Ideensammlung
12.07.2018 10:13:05
mmat
Hallo,
ich hab mal ein bisschen mit dem Code von Burkhard gespielt und es ist mir leider nicht gelungen, das Phänomen zu reproduzieren. Vielleicht stimmt was mit den Importdateien nicht, das läßt sich aber leicht prüfen.
@Nepomuk: Auch das Ausblenden der Mappe nach öffnen mit GetObject und speichern konnte ich leider nicht reproduzieren.
Warum macht man sowas überhaupt? Ich vermute mal es handelt sich um ein Projekt mit umfangreichen Daten (ggf. unterschiedliche Sammlungen in verschiedenen Exceldateien) und Skripten. Nachdem an den Skripten was rumgeschraubt wurde (in einer Testumgebung) werden diese so aktualisiert. Ich würde in so einem Fall Daten und Module in separate Exceldateien trennen, dann besteht garnicht die Notwendigkeit, in VBProject einzugreifen.
Anzeige
AW: Lösung
12.07.2018 10:41:57
Burkhard
Hallo mmat,
an den Importdateien kanns nicht liegen, ich habe testweise diesen Codeteil mal übersprungen (also nur geöffnet und gleich gespeichert), das Ergebnis war dasselbe.
Die von mir gefundene Lösung habe ich vor ein paar Minuten gepostet.
Mit deiner Vermutung (derselbe Code in verschiedenen Projekt-Excel-Dateien) liegst du ganz richtig, und mit deinem letzten Satz sprichst du mir aus der Seele. Ich rede schon seit Monaten mit Engelszungen, das endlich mal umzustellen ...
Grüße
Burkhard
AW: Ideensammlung
12.07.2018 10:32:22
Burkhard
Hallo miteinander,
vielen Dank für eure Ideen und Hinweise.
Ich will mal kurz feedback geben, wie ich das Problem gelöst habe. Die Idee war ja, eine Datei so zu öffnen, zu bearbeiten und zu schließen (mit Speichern), dass der Benutzer nichts davon mitbekommt.
Das Öffnen mit GetObject() war schon mal richtig. ALLE ausprobierten Varianten mit Workbooks.Open() waren nicht zielführend, insbesondere hat Application.ScreenUpdating = False bei mir gar nichts bewirkt.
Die Konsequenz von GetObject() ist, dass vor dem Speichern das workbook (per code) wieder eingeblendet werden muss. Wenn ich das ScreenUpdating unmittelbar vor dem Einblenden abschalte, ist davon tatsächlich (fast) nichts zu sehen:
        Application.ScreenUpdating = False
wbImportWorkbook.Windows(1).Visible = True
wbImportWorkbook.Close True         ' True = SaveChanges
Eine kleine Verbesserung könnte man noch einbauen: beim Visible = True wird (bei entsprechender Einstellung) in der Taskleiste kurz die entsprechende Excel-Instanz / Datei angezeigt. Das sollte sich mit Application.ShowWindowsInTaskbar = False verhindern lassen.
Fazit: es geht kein Fenster auf, es blitzt nichts, es zuckt nichts, der Bildschirm bleibt ganz ruhig - und die bearbeitete Datei lässt sich hinterher ganz normal öffnen. WORKS AS DESIRED.
Grüße
Burkhard
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige