PDA

Vollständige Version anzeigen : Excelsheet unsichtbar kopieren


Carla_Carla
19.02.2008, 19:14
Hallo Liebe Excelfreunde,

1) ich speicher meine Mappe mit
ActiveWorkbook.SaveCopyAs "Pfad"
Auf dieses Laufwerk haben aber nicht alle User Zugriff. Wie kann ich vermeiden, dass der Debugger sich öffnet, wenn die User keinen Zugriff haben? Stattdessen soll eine MSGBox erscheinen.

2)Ich selektiere ein Sheet aus der Mappe und speicher dieses Sheet einzeln ab. Über Application.Screenupdating habe ich vermieden, dass die einzelnen Schritte (wie z.B. das Sheet aufzurufen und noch einige Formatiereungsgeschichten)sichtbar werden. Der Code an sich,funktioniert super. Leider poppt aber in der Taskleiste die neue Mappe auf. Lässt sich dieses vermeiden?
Hier mein Code

Application.Screenupdating = False
Sheets("tabelle2").Activate
ActiveSheet.Copy
ActiveWorkbook.SaveAs Filename:="....."
ActiveWorkbook.Close SaveChanges:= True
Application.Screenupdating = true


Danke im Voraus

IngGi
19.02.2008, 20:42
Hallo Carla!

Zu deiner ersten Frage:

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="REM">'Datei auf &quot;muss noch gespeichert werden&quot; setzen</span>
ActiveWorkbook.Saved = <span class="TOKEN">False</span>
<span class="REM">'Laufzeitfehler ignorieren und mit n&auml;chster</span>
<span class="REM">'Programmzeile fortfahren</span>
<span class="TOKEN">On</span> <span class="TOKEN">Error</span> <span class="TOKEN">Resume</span> <span class="TOKEN">Next</span>
ActiveWorkbook.SaveAs Filename:=&quot;.....&quot;
<span class="REM">'Wenn der Speichervorgang erfolgreich war,</span>
<span class="REM">'ist die Datei nicht mehr auf &quot;muss noch</span>
<span class="REM">'gespeichert werden&quot; gesetzt</span>
<span class="TOKEN">If</span> ActiveWorkbook.Saved = <span class="TOKEN">True</span> <span class="TOKEN">Then</span>
<span class="REM"> 'Speichern fehlgeschlagen, daher MsgBox</span>
MsgBox &quot;Konnte nicht speichern.&quot;
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="REM">'Laufzeitfehler wieder &quot;einschalten&quot;</span>
<span class="TOKEN">On Error GoTo 0</span></pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)


Zu deiner zweiten Frage:

Das funktioniert meines Erachtens nur, indem du eine Kopie der gesamten Mappe, aus der das Tabellenblatt stammt, temporär speicherst und zunächst eine zweite Excelinstanz startest. Die ist standardmäßig zunächst einmal nicht sichtbar, daher funktioniert das Ganze überhaupt nur. In dieser zweiten - unsichtbaren - Excelinstanz kannst du nun die temporär zwischengespeicherte Datei öffnen, das gewünschte Blatt in eine neue Datei kopieren, die temporäre Datei schließen und löschen und anschließend mit der Kopie noch diese und jene Arbeiten im Hintergrund erledigen. Am Schluss wird die zweite Excelinstanz dann wieder beendet:

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Dim</span> appExcel <span class="TOKEN">As</span> Application
<span class="TOKEN">Dim</span> strTmpPfadName <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> intTB <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
&nbsp;
<span class="REM">'Pfad und Name der tempor&auml;ren Datei in Variable &uuml;bergeben</span>
strTmpPfadName = &quot;C:\Dokumente und Einstellungen\&quot; &amp; Environ(&quot;UserName&quot;) &amp; &quot;\Desktop\tmp.xls&quot;
<span class="REM">'Aktive Arbeitsmappe tempor&auml;r auf dem Desktop des Benutzers speichern</span>
ActiveWorkbook.SaveCopyAs strTmpPfadName
&nbsp;
<span class="REM">'Zweite Excelinstanz im Hintergrund starten</span>
<span class="TOKEN">Set</span> appExcel = CreateObject(&quot;Excel.Application&quot;)
<span class="REM">'Warnmeldungen ausschalten</span>
appExcel.DisplayAlerts = <span class="TOKEN">False</span>
<span class="REM">'Tempor&auml;r gespeicherte Arbeitsmappe dort &ouml;ffnen</span>
appExcel.Workbooks.Open Filename:=strTmpPfadName
<span class="TOKEN">With</span> appExcel.ActiveWorkbook
<span class="REM"> 'Tabellenblatt in neue Arbeitsmappe kopieren</span>
.Sheets(&quot;Tabelle2&quot;).Copy Before:=.Sheets(1)
<span class="REM"> '&Uuml;brige Bl&auml;tter der neuen Datei l&ouml;schen</span>
<span class="TOKEN">For</span> intTB = 2 <span class="TOKEN">To</span> .Sheets.Count
.Sheets(intTB).Delete
<span class="TOKEN">Next</span> <span class="REM">'intTB</span>
&nbsp;
<span class="REM">'#####################################################################</span>
<span class="REM">'Hier hab ich dir das erste Makro gleich mit eingebaut:</span>
&nbsp;
&nbsp;
<span class="REM"> 'Datei auf &quot;muss noch gespeichert werden&quot; setzen</span>
.Saved = <span class="TOKEN">False</span>
<span class="REM"> 'Laufzeitfehler ignorieren und mit n&auml;chster</span>
<span class="REM"> 'Programmzeile fortfahren</span>
<span class="TOKEN">On</span> <span class="TOKEN">Error</span> <span class="TOKEN">Resume</span> <span class="TOKEN">Next</span>
.SaveAs Filename:=&quot;.....&quot;
<span class="REM"> 'Wenn der Speichervorgang erfolgreich war,</span>
<span class="REM"> 'ist die Datei nicht mehr auf &quot;muss noch</span>
<span class="REM"> 'gespeichert werden&quot; gesetzt</span>
<span class="TOKEN">If</span> .Saved = <span class="TOKEN">True</span> <span class="TOKEN">Then</span>
<span class="REM"> 'Speichern fehlgeschlagen, daher MsgBox</span>
MsgBox &quot;Konnte nicht speichern.&quot;
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="REM"> 'Laufzeitfehler wieder &quot;einschalten&quot;</span>
<span class="TOKEN">On Error GoTo 0</span>
&nbsp;
<span class="REM">'######################################################################</span>
&nbsp;
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">With</span>
&nbsp;
&nbsp;
<span class="REM">'Zweite Excelinstanz beenden</span>
appExcel.Quit
<span class="REM">'Speicherfreigabe</span>
<span class="TOKEN">Set</span> appExcel = <span class="TOKEN">Nothing</span>
&nbsp;</pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)


Gruß Ingolf

jinx
20.02.2008, 06:07
<font size="2" face="Century Gothic">Moin, Ingolf,

es ist mir neu, dass der Zustand Saved einer Mappe eine nicht erfolgreiche Speicherung signalisiert.

If Err <> 0 then...

Zu 2.:
Ab Excel2000 kann die Anzeige in der Taskleiste auf ein einziges Fenster reduziert werden, und unter Excel97 erscheint kein neues Fenster:

Application.ShowWindowsInTaskbar = False</font>

IngGi
20.02.2008, 08:18
Hallo jinx,

der Weg über das Err-Objekt mag hier ja der logischere sein. Über die Saved-Eigenschaft der Mappe funktioniert es allerdings auch.

Eine erfolgreiche Speicherung setzt die Saved-Eigenschaft der Mappe auf "Wahr", ein erfolgloser Speicherversuch dagegen läßt die Saved-Eigenschaft unberührt. Wenn ich die Saved-Eigenschaft der Mappe vor dem Speicherversuch explizit auf "Falsch" setze, kann ich den Erfolg der Speicherung an der Saved-Eigenschaft ablesen.

Gruß Ingolf

Carla_Carla
20.02.2008, 18:42
Hallo,

erst einmal vielen Dank für die Antworten

eine Frage hab ich noch rein aus Interesse:
Weshalb wird das Excelsheet temporärer auf dem Desktop gespeichert.
Kann ich nicht eine neue ExcelInstanz öffnen, dann eine neue Mappe öffnen und dann mein Sheet direkt darein kopieren? Wieso der Zwischenschritt?

Grüße
Carla

IngGi
20.02.2008, 23:18
Hallo Carla,

alles was du in die Zwischenablage kopieren kannst, läßt sich problemlos auch in einer anderen Excelinstanz einfügen. Wenn du allerdings ein komplettes Tabellenblatt kopierst, geht das nicht über die Zwischenablage. Du klickst rechts auf den Tabellenblattreiter, wählst den Menüpunkt Verschieben/Kopieren und musst dann gleich ein Kopierziel angeben. Auf diesem Weg bekommst du kein Tabellenblatt in eine andere Arbeitsmappe, die in einer anderen Excelinstanz geöffnet ist, bzw. wird. Daher der Umweg über das Zwischenspeichern der Quellmappe.

Gruß Ingolf

Carla_Carla
21.02.2008, 19:42
Hallo,
ich habe mich jetzt mal an den Kopiercode gesetzt.Leider scheint irgendwas nicht zu funktionieren. Mein Code sieht jetzt so aus

Private Sub CommandButton1_Click()
Dim appExcel As Application
ActiveWorkbook.SaveCopyAs Filename:="C:\users\Carla\Desktop\tmp.xls"
Set appExcel = CreateObject("Excel.Application")
appExcel.DisplayAlerts = False
appExcel.Workbooks.Open Filename:="C:\users\Carla\Desktop\tmp.xls"
With appExcel.ActiveWorkbook
'Tabellenblatt in neue Arbeitsmappe kopieren
.Sheets("Tabelle2").Copy Before:=.Sheets(1)
.sheets("tabelle1").delete
.sheets("tabelle3").delete
End With
appExcel.Quit
End Sub


Mein Problem: Ich speicher die Mappe auf dem Desktop und ruf sie dann in der neuen Instanz auf (ihr hattet Dim strPfdName vorgeschlagen, ich hab es hier ausgeschrieben, da ich immer eine Fehlermeldung erhielt-dürfte aber nicht der Grund sein?!)
Ich scheine aber die Tabelle2 nicht zu kopieren, denn wenn ich tmp.xls aufrufe, dann ist es eine 1:1 kopie. Wo ist denn die Arbeitsmappe, die nur aus em kopierten Sheet besteht
Wo liegt mein Fehler?

(Hoffe ich hab mich halbwegs verständlich ausgedrückt!?)