Excel-Datei nur öffnen, wenn nicht durch anderen Benutzer in Bearbeitung

Don Philippo

Mitglied
Hallo .NET-ler,

brauch mal wieder ein bißchen Hilfe. Hab das Forum bzgl. meines Problems schon durchforstet, aber irgendwie nicht fündig geworden.
Wäre Euch sehr dankbar, wenn ihr mir konkret zu meinem Problem helfen könntet! Danke!

Folgendes:
Ich möchte ein Excel-Dokument öffnen (ohne, daß jedoch Excel geöffnet wird --> Funktioniert auch soweit!) und editieren. Jedoch nur, wenn die Datei von keinem anderen benutzt wird.


Hier noch ein bißchen Code:
Code:
            try
            {
                Excel.Application exlApp = new Excel.Application();
                Excel.Workbook wb = exlApp.Workbooks.Open(strPath, 0, false, 5, "", "", true, Type.Missing, "\t", true, false, 0, true, true, false);
                Excel.Worksheet wc = new Microsoft.Office.Interop.Excel.Worksheet();

                object objRange = null;
                object objOpt = Missing.Value;

                workSheetNo = wb.Worksheets.Count;

                //Hier arbeite ich mit dem Excel-Dokument ...

                Marshal.ReleaseComObject(wc);
                if (bContinue)
                    wb.Save(); //Problem No. 2
                wb.Close(false, Type.Missing, Type.Missing);
                Marshal.ReleaseComObject(wb);
                exlApp.Quit();
                Marshal.ReleaseComObject(exlApp);
                bContinue = false;
            }
            catch (COMException e)
            {
                ...
            }

Schön wäre es, wenn man statt der MessageBox "Möchten sie die Datei schreibgeschützt öffnen?" unterbinden könnte und stattdessen ne eigene MessageBox mit der Nachricht "Zugriff verweigert! Datei in Gebrauch!" bekommt.

Bin ich da mit der COMException-Variante auf dem richtigen Weg?! Auf jeden Fall hab ich im Moment keine elegante Lösung parat. :confused:

Erbitte um Hilfe?
 
hallo,
darf Excel nicht geöffnet werden, oder reicht es wenn es nur nicht sichtbar ist?
Dann könntest du nämlich mit
Code:
exlApp.Visible=False
Das Sichtbarkeitsproblem lösen. Alternativ kannst du auch eine Verbindung zu dem Excelsheet aufbauen und diesen mit einem Recordset bearbeiten. Dann bräuchtest du kein Excel

zu deinem anderen Problem kann ich dir wenig sagen, hast du schonmal nachgesehen, ob man überprüfen kann welche Programme gerade laufen? Sobald Excel läuft kannst du ja den Zugriff im Programm unterbinden ^^. Eine Excelfunktion sowie das EXCLUSIV ÖFFNEN von Access habe ich noch nicht gesehen

Gruß romin
 
Hi Romin,

vielen Dank für die Antwort.
Das mit der Excel-Applikation ist kein Problem. Das funktioniert.

Komm nur nicht drauf, wie ich abfragen kann, ob die Datei schon von einem anderen User benutzt wird.

Verbal sollte es so aussehen:
Siehe Anhang

Danke
 

Anhänge

  • c_sharp_fileaccess_flow.gif
    c_sharp_fileaccess_flow.gif
    7,9 KB · Aufrufe: 39
geht es darum das eine Datei im Netzwerk hinterlegt ist? oder ist die datei nur von deinem eigenen PC aus zu öffnen?
 
Ja genau, die Datei ist im Netzwerk hinterlegt.
Ein kleines "wichtiges" Detail, das ich vergessen hatte .. Sorry! ;)

Dürfte eigentlich bestimmt nicht so schwer sein, den Status abzufragen und zu entscheiden, ob man zugreift oder nicht. Find aber nix ... oder bzw. weiß nicht mehr nach was ich suchen soll ...
 
Hi,
habe ich mir auch schon so ein bisschen gedacht. Sonst bräuchte man ja nicht unbedingt abfragen ob die Datei aufgerufen ist^^. Also mir fällt dazu nur eine GANZ stumpfe Lösung ein.
Es geht ja wahrscheinlich darum, dass es Konflikte gibt wenn die Datei gerade geändert wurde/wird. Du könntst also einen Blattschutz auf die Exceldateien legen. Und bei dem Start von deinem Programm fragt er ab, ob das Dokument geschützt ist oder nicht. Da der Benutzer jedes mal den Blattschutz aufheben muss, wenn er das Dokument ändern will, hättest du so eine Überprüfung inklusive Blattschutz ^^. Problem ist natürlich das der Blattschutz aktiv sein muss wenn das Dokument geschlossen wird! Das kann man zwar mit einem VBA Makro machen, dafür muss dieses aber vorher aktiviert sein. Wenn du den Benutzer dazu zwingen willst Makros zu aktivieren kannst du den Blattschutz mit einem langen Passwort versehen welches nur das Makro bzw dein Programm aufheben kann

Ich hoffe ich habe dich nicht erschlagen aber das war die einzige kreative Idee die mir in den Sinn gekommen ist

Gruß romin
 
Hm, ich probier's mal aus.
Aber da wär dann immer noch das Problem, wenn ich schreiben will. Dann frägt er auch jedes mal nach dem Makro, oder?
Es uß doch irgendwas einfaches geben, wo man den Status eines Windows-Dokumentes abfragen kann und demnach entscheidet, welche Aktion man ausführt ... :p ?! Für sowas ist doch das "mächtige" C# eigentlich entwickelt worden ... ?!
Naja, kommt Zeit kommt Rat!

Danke nochmal für den Tipp!
 
Das Application-Objekt hat eine Eigenschaft DisplayAlerts. Damit kannst du gleich mal die Meldungen für den User abschalten. Das ist das eine.

Wenn ein anderer User ein Workbook geöffnet hat, dann kannst du es ja ohnehin nur im schreibgeschützen Modus öffnen. Das heißt, du könntest beim geöffneten Workbook die Eigenschaft ReadOnly abfragen. Wenn true, dann hat es ein anderer User geöffnet, andernfalls solltest du deine Änderungen durchführen können.

Hoffe das hilft mal vorerst weiter.
 
Hi Nobert,

jepp hat geklappt! Wunderbar! Mein Fehler war noch zusätzlich, dass ich an der falschen Stelle (nach dem .Release-Befehl für das Excel-File) einen Breakpunkt gesetzt hatte um zu prüfen, ob der Schreibschutz während des Zugriffs über das Programm besteht.
Tja, aber da wurde das File schon wieder frei gegeben, da der Release-Befehl ja schon abgearbeitet wurde!
So kann man ja keine Message bekommen, die auf den Schreibschutz hinweist. :rolleyes:
Das mit den Display-Alerts ist auch ein guter Tipp!

Vielen Dank!

Gruß,
Philipp
 

Neue Beiträge

Zurück