okidoki
Goto Top

Batch-Abfrage, ob bestimmte excel-Datei geöffnet ist und diese dann auch schließen (können)

Guten Abend!
In zahlreichen Foren habe ich nach einer Antwort gesucht, leider für mein Problem aber noch keine gefunden ...

Wie kann ich auslesen (Batch), ob eine bestimmte Excel-Datei geöffnet ist. Ist dies der Fall, dann soll sie (vom Batch) geschlossen werden können.
Die angebotenen Lösungen wurden immer in Excel selber durchgeführt, nicht aber in einem externen Batch, daher diese Fragestellung.

OKIDOKI

Content-ID: 181323

Url: https://administrator.de/contentid/181323

Ausgedruckt am: 19.11.2024 um 17:11 Uhr

bastla
bastla 01.03.2012 um 23:04:46 Uhr
Goto Top
Hallo OKIDOKI!

Etwas weiter solltest Du aber doch ausholen - etwa:
  • Woran ist die "bestimmte" Excel-Datei zu erkennen?
  • Ist davon auszugehen, dass auch andere Dateien mit Excel geöffnet sind?
  • Gilt "Task beenden" auch als "schließen" in Deinem Sinn?
  • Und auch nicht ganz uninteressant: Wozu soll das Ganze gut sein? face-wink

Vorhandene Lösungsansätze in Excel könnten auch nützlich sein - daher bitte posten ...

Grüße
bastla
OKIDOKI
OKIDOKI 01.03.2012 um 23:21:12 Uhr
Goto Top
Hallo bastla,

- die bestimmte Excel-Datei hat einfach einen Namen /dies beinhaltet gleich Frage 2, da eine andere Excel-Datei, bzw. Excel selbst, geöffnet sein kann/
In meinem Fall geht es um die Dateien 1.xlsx und 2.xlsx, die abgefragt werden sollen. Dies hat den Hintergrund, dass sie irgendwo hinkopiert werden und nach dieser Abfrage gelöscht werden sollen.
Deshalb soll es auch möglich sein, dass sie gespeichert werden sollen (geht das überhaupt automatisch?) und anschließend geschlossen werden können sollen (Bandwurmsatz...).

Gilt "Task beenden" auch als "schließen" in Deinem Sinn?
Da die beiden Excel-Dateien gelöscht werden, reicht vermutlich Task beenden nicht, außer sie lassen sich auch dann löschen.

Von den Kommentaren fand ich diese Lösung sehr charmant, die bei mir leider nicht läuft:


Function IsWorkbookOpen(strWB As String) As Boolean
   On Error Resume Next
   IsWorkbookOpen = Not Workbooks(strWB) Is Nothing
End Function


Testen kannst du es damit:
Code:

Sub test()
   If IsWorkbookOpen("Mappe2.xlsx") Then  
      MsgBox "OFFEN"  
   Else
      MsgBox "Nicht offen"  
   End If
End Sub

Vielleicht gefällt die diese Lösung auch Smile
Super, solltest Du Dir patentieren lassen. Gefällt mir am Besten.
Ich habs ausprobiert, weil ich auch diese Nuss zu knacken hatte.
Man darf nur in strWB nicht den kompletten Pfad angeben.
Vielen Dank - Gruß Martin
http://www.office-loesung.de/ftopic118311_0_0_asc.php

Grüße
OKIDOKI
Pjordorf
Pjordorf 01.03.2012 um 23:38:22 Uhr
Goto Top
Hallo,

Zitat von @OKIDOKI:
diese Lösung sehr charmant, die bei mir leider nicht läuft:
Hehe. Was läuft den bei dir leider nicht bzw. was läuft denn bzw. wenn eine Fehlermeldung kommt, was steht dann da drin? Wie rufst du denn diese Lösung auf?

Gruß,
Peter
OKIDOKI
OKIDOKI 01.03.2012 um 23:42:43 Uhr
Goto Top
Hallo Peter,

Ich dachte es ist eine vbs, da passiert gar nichts beim Start ... auch keine Fehlermeldung

Gruß OKIDOKI
Pjordorf
Pjordorf 01.03.2012 um 23:52:15 Uhr
Goto Top
Hallo OKIDOKI,

Das kannst du doch besserface-smile
Zitat von @OKIDOKI:
da passiert gar nichts beim Start
Das erklärt uns aber noch nicht wie du dein (vermutetes VBS) tatsächlich gestartet hast damit auch dein
... auch keine Fehlermeldung
einen Sinn ergeben würde.

Spann uns nicht auf die Folterface-smile

Gruß,
Peter
OKIDOKI
OKIDOKI 02.03.2012 um 00:03:10 Uhr
Goto Top
Hallo Pjordorf ,

ganz leise: Doppelklick

Bei deinem Wortlaut habe ich bestimmt etwas Dummes gemacht oder nicht gemacht ... face-wink

> Zitat von @Pjordorf:
Hehe.

OKIDOKI
bastla
bastla 02.03.2012 um 00:08:37 Uhr
Goto Top
Hallo OKIDOKI!

Meine Tests (mit Excel 2007) haben ergeben
  • Der gepostete Code funktioniert, wenn er als VBA in der selben Excel-Instanz wie die gesuchte Datei gestartet wird - damit entfällt die Möglichkeit, per Batch über VBS eine weitere Excel-Instanz zu öffnen und von dort aus zu testen.
  • Mit tasklist /v|findstr /i "1.xlsx" oder tasklist /fi "WINDOWTITLE EQ Microsoft Excel - 1.xlsx" wird der Task nur gefunden, wenn das Fenster mit der "1.xlsx" aktiv ist - wurde in der gleichen Excel-Instanz eine weitere Datei geöffnet und befindet sich diese im Vordergrund, wird deren Name angezeigt.
  • Wenn der Task gefunden und (über die PID) per "{{taskkill}" beendet wird, sind davon auch alle weiteren in der selben Excel-Instanz geöffneten Dateien betroffen.

Mein derzeitiger Schluss daraus: Das wird per Batch nix ... face-sad

Grüße
bsatla
OKIDOKI
OKIDOKI 02.03.2012 um 00:20:19 Uhr
Goto Top
Hallo bastla,

dann noch eine andere Überlegung: dann scheint es möglich zu sein, zu testen ob Excel generell geöffnet ist, alles zu speichern und alle Excel-Instanzen (also Excel generell) zu schließen. Hier entfällt die Möglichkeit einer Auswahl, was aber überhaupt nicht schlimm wäre!
Damit hätte sich deine erste Frage in eine andere Richtung bewegt:

Woran ist die "bestimmte" Excel-Datei zu erkennen?
Gar nicht, denn es geht um Excel allgemein! Wenn Excel geöffnet ist, soll es (gespeichert und dann) geschlossen werden - fertig.

Wäre diese Lösung denkbar?

Gruß
OKIDOKI
Pjordorf
Pjordorf 02.03.2012 um 00:22:44 Uhr
Goto Top
Hallo,

Zitat von @OKIDOKI:
ganz leise: Doppelklick
Aber wo drauf hast du ganz leise Doppelklick gemacht? Auf das Fenster mit dem Code in deinem Browser oder wie/was? Das kann ich mir einfach nicht vorstellen. Schreib uns doch bitte genau wie du vorgegangen bist. Dann können wir auch sehen ob bei uns nichts beim Starten passiert.

Bei deinem Wortlaut habe ich bestimmt etwas Dummes gemacht oder nicht gemacht ... face-wink
Du ahnst ja gar nicht wo ich alles drauf Klicken und Doppelklicken kannface-smile

Gruß,
Peter
bastla
bastla 02.03.2012 um 00:57:59 Uhr
Goto Top
Hallo OKIDOKI!

Ein Speichern ließe sich allenfalls per VBS-SendKeys realisieren - und das wäre alles andere als verlässlich - daher weiterhin: nein ...

Grüße
bastla
TsukiSan
TsukiSan 02.03.2012 um 07:39:07 Uhr
Goto Top
Hallo OKIDOKI,

ein umständlicher Weg mittels Batch ginge eventuell über Batch mit VBS
also sowas in Form von
FindStr (Fenstertitel.vbs "MeineDatei.xls")
in der Fenstertitel.vbs kannst du von der PC Welt das bisschen DLL und VBS -Code nehmen und den VBS code noch etwas anpassen.
Ungefähr so:
set MyTasks = CreateObject("pcwHide.pcwHide")  

result=MyTasks.ListAll
for n = 0 to ubound(result)
     if  result(n) = "MeineDatei.xls" then  
	      wscript.echo result(n)
     End If
next

Vielleicht hilft's !?

Gruss
Tsuki
60730
60730 02.03.2012 um 09:01:50 Uhr
Goto Top
Moin,

Zitat von @OKIDOKI:
Wie kann ich auslesen (Batch), ob eine bestimmte Excel-Datei geöffnet ist. Ist dies der Fall, dann soll sie (vom Batch)
geschlossen werden können.
  • dann stell ich einfach mal die Gegenfrage - wo liegt die Datei und wie viel Overhead (speziell, wenn Sie garnicht läuft - also "immer" - nicht nur während der Ausführung) darf die Lösung "kosten"?

Die angebotenen Lösungen wurden immer in Excel selber durchgeführt, nicht aber in einem externen Batch, daher diese Fragestellung.
Naja - gehen tun tut das schon, die Frage ist halt - liegt das Zeug lokal oder auf nem Share.
Und wenn auf nem Share dann - was passiert wenn User A die abschiesst während User B die auch auf hat

Von daher - ich leg mich mal mit Bastla an gaaanz weit auf dem Fenster und behaupte - das ist mit Batchmitteln "möglich", wenn gewisse Bedingungen erfüllt sind.
Aber ob es Hybsch ist...
Und vielleicht kannst du Bastlas Frage nochmal ganz genau beantworten...
Und auch nicht ganz uninteressant: Wozu soll das Ganze gut sein? face-wink

Denn mit excel eine Excel Datei erzeugen um die dann einzulesen und wieder abzuschiessen, das ist irgendwie wie der Versuch mit Excel eine "Datenbank" zu stricken?

Gruß
OKIDOKI
OKIDOKI 02.03.2012 um 09:12:40 Uhr
Goto Top
Moin,
die Excel-Datei liegt lokal undzwar im selben Verzeichnis wie die Batch.
Es geht darum, dass an der Excel-Datei gearbeitet wird. Aus dem Excel wird eine csv ausgelesen und diese weiterverarbeitet. Alsbald wird diese Excel-Datei dann in einem Sicherungsordner abgelegt und für den nächsten Prozess eine "frisch aufbereitete" Excel Datei benutzt - dann csv auslesen und weiterverarbeiten, Excel-Datei archivieren und löschen usw.

Eine Möglichkeit wäre vielleicht:

taskkill /fi "Windowtitle eq Microsoft Excel - 1"  

Damit wird genau die Datei geschlossen, die gemeint ist, alle weiteren Excel-Prozesse (falls es welche gibt) bleiben geöffnet. Und Excel fragt sogar, ob die Änderungen gespeichert werden sollen.
Nach dem Aufruf und bei geschlossenem Excel kommt die Meldung: "Information: Es werden keine Tasks mit den angegebenen Kriterien ausgeführt."
Vielleicht lässt sich damit weiterarbeiten?
Vielleicht lässt sich Excel damit auch automatisch speichern?

Gruß
OKIDOKI
60730
60730 02.03.2012 um 09:39:28 Uhr
Goto Top
Hmm..

Es geht darum, dass an der Excel-Datei gearbeitet wird. Aus dem Excel wird eine csv ausgelesen und diese weiterverarbeitet.
irgendwie war der Kaffe grade nicht gut genug...

Und warum exportiert/erzeugst du nicht gleich ne CSV und liesst die ein?

die Excel-Datei liegt lokal
Das hatte ich "befürchtet"...
Wenns taskkill /fi "Windowtitle eq Microsoft Excel - 1" für dich auch tut und es dir nur um die Info geht pipe das doch ins Nirvana >nul

Vielleicht lässt sich Excel damit auch automatisch speichern?

Wie geschrieben, ich verstehs noch nicht so richtig ich würde so wie ich es verstanden habe - den ganzen Hokuspokus eindampfen.

Gruß
OKIDOKI
OKIDOKI 02.03.2012 um 10:18:05 Uhr
Goto Top
Hmm...

ich bade den Kram von anderen Leuten aus face-wink

Aber wie auch schon bastla schrieb und du es meinst, hier sind auch die Grenzen von Batch erreicht...

PS: Gleich eine csv erzeugen geht nicht, da mit Excel erst Berechnungen durchgeführt werden. Sonst hättest du natürlich vollkommen recht!

Danke dir noch einmal und auch bastla und TsukiSan für eure Kopfkapazitäten face-wink

OKIDOKI
pieh-ejdsch
pieh-ejdsch 02.03.2012 um 11:52:46 Uhr
Goto Top
Moin,

Wenn die Datei keinen Schreibschutz hat reicht ein simples
type nul>>Datei || echo datei ist offen!

sonst eventuell kombiniert.
@echo off &setlocal
if "%~1" equ "/?" echo Syntax: %~nx0 Datei^  
 &echo Errorlevel 3 == Datei hat Schreibschutz! ^(eventuell Offen^)^
 &echo Errorlevel 2 == Datei in Verwendung.^
 &echo Errorlevel 1 == Syntaxfehler/Datei nicht gefunden^
 &echo Errorlevel 0 == Datei nicht in Verwendung.&exit /b

if not exist "%~1" echo Syntaxfehler.^  
 &echo Syntax: %~n0 Datei^
 &exit /b 1

(for /f "delims=, tokens=9" %%i in ('tasklist /Nh /v /Fo csv /Fi "IMAGENAME ne cmd.exe"') do @echo %%i)|find "%~nx1" >&2 && exit /b 3^  
 || for /f "delims=" %%i in ('^(type nul^>^>"%~f1"^) 2^>^&1 ') do (  
	>&2 echo %%i
	echo %%i|find /i "Zugriff verweigert" >nul && echo Datei-Schutz! 1>&2 && exit /b 2 || exit /b 3  
)
exit /b 0

Gruß Phil
OKIDOKI
OKIDOKI 02.03.2012 um 13:27:13 Uhr
Goto Top
Hallo pieh-ejdsch,

wie schön, dass du noch weitermachst face-wink

Die Datei hat in keinem Fall einen Schreibschutz, weil mit ihr ja bis zu letzt gearbeitet wird!

Es geht ja darum die Excel-Datei zu schließen, falls sie geöffnet sein sollte. Vielleicht kannst du mir noch kurz sagen wie ich die beiden Dateinamen um die es geht (1.xlsx und 2.xlsx) in der Batch unterbringe und abfrage (auch bei der oberen Zeile face-wink ...

Vielen Dank pieh-ejdsch
OKIDOKI
60730
60730 02.03.2012 um 16:21:24 Uhr
Goto Top
Servus,

Zitat von @OKIDOKI:
Hallo pieh-ejdsch,

wie schön, dass du noch weitermachst face-wink
  • tja so sind wir halt..

Die Datei hat in keinem Fall einen Schreibschutz, weil mit ihr ja bis zu letzt gearbeitet wird!

  • Sicher?

Es geht ja darum die Excel-Datei zu schließen, falls sie geöffnet sein sollte.
Vielleicht kannst du mir noch kurz sagen wie ich die beiden Dateinamen um die es geht (1.xlsx und 2.xlsx) in der Batch unterbringe und abfrage (auch bei der oberen Zeile

  • Hast du mal nachgesehen getestet, was dir Pietsch da gemalt hat?
Und was uist dir bei der Zeile aufgefallen?
if "%~1" equ "/?" echo Syntax:
Also, wenn das so ist, dann verstehe ich auch diese Zeile
In zahlreichen Foren habe ich nach einer Antwort gesucht, leider für mein Problem aber noch keine gefunden ...

Geh mal raus dreh dich um und dass siehst du auf den Wald und nicht nur Bäume.

@pietsch - schee gemacht so richtig auf die "simple" Nummer face-wink face-wink
bastla
bastla 02.03.2012 um 17:04:42 Uhr
Goto Top
Hallo T-Mo!
* tja so sind wir halt..
Nun bin ich ja meist auch so face-wink (und beileibe kein Pessimist) - aber eigentlich steht immer noch
Es geht ja darum die Excel-Datei zu schließen
(und das mit Speichern) im Raum - und auch die Möglichkeit
Wenn Excel geöffnet ist, soll es (gespeichert und dann) geschlossen werden - fertig.
kriege ich eigentlich nur mit einer ziemlich windigen Lösung der Art
@echo off & setlocal
set "VBS=%temp%\CloseExcel.vbs"  
>%VBS% echo Set Sh=CreateObject("WScript.Shell"):Sh.AppActivate WScript.Arguments(0):WScript.Sleep 1000:Sh.SendKeys "%%{F4}":WScript.Sleep 1000:Sh.SendKeys "j~"  

:Loop
tasklist|findstr /i /b "excel.exe">nul || goto :Done  
for /f "tokens=2" %%i in ('tasklist^|findstr /i "excel.exe"') do cscript //nologo %VBS% %%i  
goto :Loop

:Done
echo Excel beendet ...
hin (und die mochte ich eigentlich gestern schon nicht posten) ...

Grüße
bastla
OKIDOKI
OKIDOKI 03.03.2012 um 12:25:01 Uhr
Goto Top
Hallo Bastla, T-Mo! und pieh-ejdsch,

Phils Lösung peil ich einfach nicht, ich werd wohl weiter Gärtner bleiben und mich nicht um die Bäume kümmern können face-wink

Bastla versteht mich, irgendwie kann ich seine Lösungen besser nachvollziehen. Eine Anmerkung hätte ich:

Wäre es in Zeile 3 vielleicht besser statt "j~" "s~" zu nehmen, da bei zwei geöffneten Excelfiles die Abfrage von Excel kommt, ob alle gespeichert werden sollen ... ?
(Witzigerweise trägt er bei der geposteteten Lösung in einer von den Dateien zeilenweise ein j ein, versucht zu schließen und trägt ein j in der nächsten Spalte ein)

Danke ausdrücklich euch allen, dass ihr euch mit solchen (bestimmt für euch hahnebüchenen Problemen) "rumärgert" (oder dies als Herausforderung empfindet face-wink ). Viele andere Posts lassen aber erkennen, dass einige Leute dafür eine Lösung suchen!

Vielen Dank
OKIDOKI
bastla
bastla 03.03.2012 um 12:55:29 Uhr
Goto Top
Hallo OKIDOKI!
(Witzigerweise trägt er bei der geposteteten Lösung in einer von den Dateien zeilenweise ein j ein, versucht zu schließen und trägt ein j in der nächsten Spalte ein)
Nicht zuletzt deshalb meine Vorbehalte gegen diese "Krücke" ...

Grüße
bastla