Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1312to1316
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

Makro endet immer auf dem Desktop

Makro endet immer auf dem Desktop
15.05.2013 11:21:22
Toumas
Hallo zusammen,
ich habe mir unten stehendes Makro selbst zusammengebastelt. Es öffnet mir eine Datei, kopiert dort einen Bereich heraus, fügt diesen auf dem Reiter ein und schließt die andere Datei wieder.
Nun komme ich zu meinem Problem, das ich absolut nicht verstehe.
Bis um schließen der anderen Datei funktioniert auch alles super.
dann wird mir aber nicht mehr Excel angezeigt, sondern mein Desktop (oder den Ordner, den ich davor offen hatte)
Warum ?
(Die Pfadangaben usw. haben ich durch Buchstaben ersetzt)
Vielen Dank im Voraus
und viele Grüße
Toumas
Sub Kopieren1()
Workbooks.Open Filename:= _
"\\xxx\xxx\xxx\xxxxx\xxxx\xxx\xxxxxxx\yyyyyyyyyy.xlsx"
Sheets("aaaaaa").Select
ActiveSheet.Unprotect "123"
Range("B9:Q31").Copy
Windows("MeineDatei.xlsm").Activate
Sheets("BBBBB").Select
ActiveSheet.Unprotect "123"
Range("B9").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Application.WindowState = xlMinimized
Windows("yyyyyyyyyy.xlsx").Activate
Application.DisplayAlerts = False
ActiveSheet.Protect "123"
ActiveWindow.Close
Application.DisplayAlerts = True
Sheets("BBBBB").Select
End Sub

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro endet immer auf dem Desktop
15.05.2013 11:27:46
Klaus
Hi,
hier:
ActiveWindow.Close
wenn du das aktive Fenster schließt, bist du halt auf dem Desktop. Du musst das "Workbook" schließen, nicht die Datei!
Ich tipp mal was zusammen und melde mich in 10min nochmal. Hast ja sicher nichts dagegen, wenn ich die "select" und "activate" aus deinem Code gleich mitentferne.
Grüße,
Klaus M.vdT.

AW: Makro endet immer auf dem Desktop
15.05.2013 11:36:42
Toumas
Hallo Klaus,
danke dir vielmals und nein, was sollte ich dagegen haben ;-)
viele Grüße
Toumas

AW: Makro endet immer auf dem Desktop
15.05.2013 11:51:32
Klaus
Hi Toumas,
vorab enschuldige: Die Lösung ist vielleicht ein wenig Overkill für dein VBA-Level. Dafür erledigt sie ihre Aufgabe aber absolut sauber.
Ich habe versucht, möglichst ausführlich zu kommentieren. Deinen Originalcode habe ich größtenteils auskommentiert statt ihn zu löschen, damit du leicher vergleichen und nachvollziehen kannst. Im Finalen einsatz solltest du die auskommentierten Codezeilen der übersichtlichkeit halber endgültig löschen.
Bei Fragen: fragen!
Sub Kopieren1()
'** hier die Sheet-Namen auf deine anpassen
Const sSheetNewFile As String = "aaaaaa"
Const sSheetOldFile As String = "BBBBB"
Const sPassword As String = "123"
Dim wkbOld As Workbook
Dim wkbNew As Workbook
Set wkbOld = ActiveWorkbook
'** altes Workbook merken
'ERSETZT Workbooks.Open Filename:= "\\xxx\xxx\xxx\xxxxx\xxxx\xxx\xxxxxxx\yyyyyyyyyy.xlsx"
Call FileCheckOpen("\\xxx\xxx\xxx\xxxxx\xxxx\xxx\xxxxxxx", "yyyyyyyyyy.xlsx")
'** wenn das workbook bereits offen ist, gibts ne Fehlermeldung!
'** die Sub "FileCheckOpen" verhindert eben diese
Set wkbNew = ActiveWorkbook
'** neues Workbook merken (ist aktiv, da grad geöffnet!)
'ERSETZE Sheets("aaaaaa").Activate
If Not WksSheetExists(sSheetNewFile) Then
'** Wenn es das sheet nicht gibt, dann gibts ne Fehlermeldung!
'** Die Sub "wksSheetsExists" verhindert diese
MsgBox ("falsches Sheet!")
'** neues Workbook wieder schließen und Sub beenden
wkbNew.Close
Exit Sub
End If
With wkbNew.Sheets(sSheetNewFile)
'Windows("MeineDatei.xlsm").Activate
'Sheets("BBBBB").Select
'** statt "activate" und "select" lieber direkt referenzieren
.Unprotect sPassword
.Range("B9:Q31").Copy
End With
With wkbOld.Sheets(sSheetOldFile)
'Windows("MeineDatei.xlsm").Activate
'Sheets("BBBBB").Select
'** statt "activate" und "select" lieber direkt referenzieren
.Unprotect sPassword
.Range("B9").PasteSpecial
Application.CutCopyMode = False
.Protect sPassword
End With
'Application.DisplayAlerts = False
'ActiveSheet.Protect "123"
'** kein Grund den Schutz wieder zu setzen - du schließt ja ohne zu speichern!
'ERSETZT ActiveWindow.Close
wkbNew.Close True
'** wkbNew haben wir uns oben gemerkt, können wir hier also direkt schließen
'Application.DisplayAlerts = True
'** auf die "gefählichen" DisplayAlerts verzichten wir auch, da CLOSE mit
'** dem Zusatz "TRUE" ohne Rückfrage ausgeführt wird.
End Sub
Sub FileCheckOpen(sPath As String, sFile As String)
'Prüft, ob es eine Datei schon offen ist
'Wenn ja, wird sie aktiviert. Wenn nein, geöffnet.
sPath = sPath & "/" & sFile
If WkbExists(sFile) = False Then
If Dir(sPath) = "" Then
MsgBox "File " & sPath & " not found!"
Else
Workbooks.Open sPath, UpdateLinks:=False
End If
Else
Workbooks(sFile).Activate
End If
End Sub
Function WkbExists(sFile As String) As Boolean
'prüft, ob es eine Datei überhaupt gibt
Dim wkb As Object
On Error Resume Next
Set wkb = Workbooks(sFile)
If Not wkb Is Nothing Then
WkbExists = True
End If
On Error GoTo 0
End Function
Function WksSheetExists(sSheet As String) As Boolean
'prüft, ob es ein Blatt überhaupt gibt
Dim wks As Object
On Error Resume Next
Set wks = Sheets(sSheet)
If Not wks Is Nothing Then
WksSheetExists = True
End If
On Error GoTo 0
End Function
Grüße,
Klaus M.vdT.

Anzeige
AW: Makro endet immer auf dem Desktop
15.05.2013 12:00:13
Toumas
Hallo Klaus,
erst mal danke für deine Mühe. Ich werde mir deine Lösung gleich zu Gemüte führen, und wenn ich anfange es zu verstehen, werde ich fragen. ;-)
Aber auf den ersten Blick (und dank deiner Kommentare) wird bei dir wirklich jegliche Situation abgefangen....
Nebenbei war Hajo_Zi so freundlich und hat mir auch eine Lösung eingestellt...
ich werde einfach beide testen.
Falls ich mich heute nicht mehr melden sollte ist mein Gehirn explodiert ;-))
Viele Grüße
Toumas

AW: Makro endet immer auf dem Desktop
15.05.2013 12:06:53
Klaus
Hi Toumas,
Hajos Code ist - für deine Zwecke - warscheinlich sogar besser geeignet (da nachvollziehbarer für Anfänger-Level).
Solange es keine Fehler gibt (Datei 2 ist NIE geöffnet, Tabellenblattname stimmt immer usw usw) ist der ja auch völlig ausreichend.
Wenn man aber das 100ste mal auf die "Datei ist bereits geöffnet" und "Arbeitsblatt existiert nicht" Fehler reinfällt, dann speichert man sich irgendwann die entsprechende Fehlerbehandlung und benutzt die aus Prinzip jedesmal. (Übrigens, den Code dazu hab ich von hier
https://www.herber.de/mailing/Pruefen_ob_Arbeitsmappe_geoeffnet_und_wenn_nein_oeffnen.htm
und dann noch etwas überarbeitet).
Ob du Hajos Code nimmst (der funktioniert) oder meinen (der faktisch das gleiche macht, nur ein bisschen aufwendiger) nachvollziehen und nutzen willst musst du entscheiden.
Viel Erfolg, und trag ein Kopftuch damit nachher nicht so viel Hirn aufgewischt werden muss!
Grüße,
Klaus M.vdT.

Anzeige
AW: Makro endet immer auf dem Desktop
15.05.2013 11:32:49
Hajo_Zi
arbeite ohne select usw. Das ist in Vba nicht notwendig.
Sub Kopieren1()
Workbooks.Open Filename:= _
"\\xxx\xxx\xxx\xxxxx\xxxx\xxx\xxxxxxx\yyyyyyyyyy.xlsx"
Workbooks("MeineDatei.xlsm").Sheets("BBBBB").Unprotect "123"
With Sheets("aaaaaa")
.Unprotect "123"
.Range("B9:Q31").Copy Workbooks("MeineDatei.xlsm").Sheets("BBBBB").Range("?")
.Protect "123"
End With
Workbooks("MeineDatei.xlsm").Close True
End Sub

AW: Makro endet immer auf dem Desktop
15.05.2013 11:38:10
Toumas
Hallo Hajo
ich versuch es schon, aber immer gelingt es mir noch nicht (bin ja noch Anfänger)
und schon recht glücklich, wenn ich überhaupt ein Makro hinbekomme *g*
Grüße
Toumas

Anzeige
AW: Makro endet immer auf dem Desktop
15.05.2013 12:02:10
Toumas
Hallo Hajo,
wie ich Klaus gerade sagte, ich teste beide Lösungen....
Aber danke nochmals für deine Mühen
viele Grüße
Toumas

Beim zweiten drüberschauen ...
15.05.2013 12:19:17
Klaus
... vermute ich, dass der Rekordercode so wie er da steht auch lauffähig ist.
Die Zeile
Application.WindowState = xlMinimized
ist vermutlich beim Rekordern entstanden, da du das Fenster "wegclicken" musstest. Wird jetzt später
ActiveWindow.Close
ausgeführt, ist das vorherige Fenster bereits minimiert und daher siehst du das vor-vorherige Fenster (bzw den Desktop).
wenn du
Application.WindowState = xlMinimized
auskommentierst, müsste der Rekordercode korrekt durchlaufen und im Ursprungsfenster landen.
Um Missverständnisse auszuschließen: Nimm nicht, auf gar keinem Fall, dieses grausame SELECT-ACTIVATE Konstrukt! Dieses Posting dient nur dem akademischem Interesse.
An diesem Beispiel zeigt sich auch gut ein Problem des Makrorekorders. Es wird halt alles, egal ob wichtig oder nicht, aufgezeichnet. Und ohne Bereinigung ist das meist nur begrenzt lauffähig. Ich habe schon so viele Makros im Einsatz gesehen, in denen jede dritte Zeile ActiveWindow.LargeScroll Down:=1 war ...
Grüße,
Klaus M.vdT.

Anzeige
AW: Beim zweiten drüberschauen ...
15.05.2013 12:50:48
Toumas
Hallo Klaus,
danke nochmals für die Antwort.
Mein Problem (wie oft bei einem Anfänger) ist, dass ich mir den Code erst mal mit dem Rekorder aufzeichne und dann versuche den Code zu ver(schlimm)bessern....
Aber dank eurer Hilfen, lernt man ja dazu...
Viele Grüße
Toumas

AW: Beim zweiten drüberschauen ...
15.05.2013 13:57:46
Toumas
Hallo Klaus,
damit es erst mal vorzeigbar ist, habe ich Hajo`s Version genommen.
Ich bin aber mittlerweile der Überzeugung, da die Datei nachher von anderen Usern verwendet wird,
werde ich wohl über kurz oder lang deine Version einbauen.
Viele Grüße
Toumas

AW: Beim zweiten drüberschauen ...
15.05.2013 14:04:59
Klaus
Hi Toumas,
da passt der Spruch "Besser ein Spatz in der Hand als eine Taube auf dem Dach" :-)
Grüße,
Klaus M.vdT.

Anzeige
AW: Beim zweiten drüberschauen ...
15.05.2013 14:25:45
Toumas
Hi Klaus,
Wobei die Taube schon das durchschnittliche Gewicht eines JumboJets hatte *g*
Ich hirne immer noch über dein Makro, wird wohl meine Bahn-Lektüre werden heute. :-)
Grüße
Toumas

38 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige