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-Key: 181323

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

Printed on: April 19, 2024 at 05:04 o'clock

Member: bastla
bastla Mar 01, 2012 at 22:04:46 (UTC)
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
Member: OKIDOKI
OKIDOKI Mar 01, 2012 at 22:21:12 (UTC)
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
Member: Pjordorf
Pjordorf Mar 01, 2012 at 22:38:22 (UTC)
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
Member: OKIDOKI
OKIDOKI Mar 01, 2012 at 22:42:43 (UTC)
Goto Top
Hallo Peter,

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

Gruß OKIDOKI
Member: Pjordorf
Pjordorf Mar 01, 2012 at 22:52:15 (UTC)
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
Member: OKIDOKI
OKIDOKI Mar 01, 2012 at 23:03:10 (UTC)
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
Member: bastla
bastla Mar 01, 2012 at 23:08:37 (UTC)
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
Member: OKIDOKI
OKIDOKI Mar 01, 2012 at 23:20:19 (UTC)
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
Member: Pjordorf
Pjordorf Mar 01, 2012 at 23:22:44 (UTC)
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
Member: bastla
bastla Mar 01, 2012 at 23:57:59 (UTC)
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
Member: TsukiSan
TsukiSan Mar 02, 2012 at 06:39:07 (UTC)
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
Mitglied: 60730
60730 Mar 02, 2012 at 08:01:50 (UTC)
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ß
Member: OKIDOKI
OKIDOKI Mar 02, 2012 at 08:12:40 (UTC)
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
Mitglied: 60730
60730 Mar 02, 2012 at 08:39:28 (UTC)
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ß
Member: OKIDOKI
OKIDOKI Mar 02, 2012 at 09:18:05 (UTC)
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
Member: pieh-ejdsch
pieh-ejdsch Mar 02, 2012 at 10:52:46 (UTC)
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
Member: OKIDOKI
OKIDOKI Mar 02, 2012 at 12:27:13 (UTC)
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
Mitglied: 60730
60730 Mar 02, 2012 at 15:21:24 (UTC)
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
Member: bastla
bastla Mar 02, 2012 at 16:04:42 (UTC)
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
Member: OKIDOKI
OKIDOKI Mar 03, 2012 at 11:25:01 (UTC)
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
Member: bastla
bastla Mar 03, 2012 at 11:55:29 (UTC)
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