Überprüfen, ob die Datei in Excel mit OLE geöffnet ist

  • Wie kann ich überprüfen, ob in einer Excel-Instanz bereits eine Datei geöffnet ist?

    Ich verwende die DXL-Sprache (DOORS), die jedoch unabhängig von sein sollte Diese Sprache.

    Gibt es eine OLE-Methode, die ich aufrufen kann, um zu überprüfen, welche Datei geöffnet ist, und diese mit dem Pfad / Dateinamen vergleichen?

    und wenn dies möglich ist, kann ich nur dieses Arbeitsblatt / diese Datei in dieser Excel-Anwendung schließen?

    edit: das ist, was ich bis jetzt bekommen habe, das funktioniert aber nur einmal. DXL lässt einen Excel.exe-Prozess geöffnet, und bei der nächsten Überprüfung wird diese Instanz verwendet, die keine oder keine geöffneten Arbeitsmappen enthält.

             if (confirm "File \"" fPath "\" already exists. Do you want to overwrite it?") {
    
            // check if file is opened in any Excel instance
            OleAutoObj oleWorkbooks     = null;
            OleAutoObj oleExcel         = null;
            OleAutoObj oleWorkbook      = null;
            OleAutoArgs autoArgs = create;
    
            oleExcel = oleGetAutoObject("Excel.Application");
            bool opened = false;
            // if excel is opened
            if(oleExcel != null){
                d("Excel is opened");
                // Get workbooks and open file
                oleGet(oleExcel,"Workbooks", oleWorkbooks);
    
                // compare each open workbook
                int count = 0;
                oleGet(oleWorkbooks,"Count", count);
                string workbookname = "";
                string sPath = replace(fPath, "\\", "/");
                sPath = stripPath(sPath, true);
    
                while (count > 0) {
                    d("checking opened document");
                    clear(autoArgs);
                    put(autoArgs, count);
                    oleGet(oleWorkbooks,"Item", autoArgs, oleWorkbook);
                    oleGet(oleWorkbook, "Name", workbookname);
                    opened = sPath == workbookname;
                    if(opened) {
                        if(confirm "The file is currently opened in Excel. It must be closed. Do you want to close the document?") {
                            clear(autoArgs);
                            oleMethod(oleWorkbook,"Close",autoArgs);
                        }
                        break;  
                    }
                    count--;
                }
            }
            oleCloseAutoObject(oleExcel);
            oleCloseAutoObject(oleWorkbooks);
            oleCloseAutoObject(oleWorkbook);
            // todo leaves excel process open
    
            if(!opened) {
                streamOutputData = write fPath;
                streamOutputData << sOutput;
                close streamOutputData;
                return true;    
            }
        }
     
    25 August 2011
    anonanon
2 answers
  • wurde mit der vorhandenen DXL-Methode canOpenFile (Stringpfad, bool write) gelöst:

     if (confirm "File \"" fPath "\" already exists. Do you want to overwrite it?") {
            if(canOpenFile(fPath, true)) {
                streamOutputData = write fPath;
                streamOutputData << sOutput;
                close streamOutputData;
                return true;    
            }
            else {
                e("File \"" fPath "\" is opened in another program. Close it! (It's probably Excel ;) )");
            }
        }
     
    25 August 2011
    anonanon
  • Ich kenne DXL nicht. Dies ist jedoch, was Sie in VBA tun könnten. Ich kann Sie an DXL anpassen:

     Sub IsXLBookOpen(strName As String) 
    
         'Procedure designed to test if a specific Excel
         'workbook is open or not.
    
        Dim i As Long, XLAppFx As Excel.Application 
    
         'Find/create an Excel instance
        On Error Resume Next 
        Set XLAppFx = GetObject(, "Excel.Application") 
        If Err.Number = 429 Then 
            Set XLAppFx = CreateObject("Excel.Application") 
            Err.Clear 
        End If 
        On Error GoTo 0
    
         'Loop through all open workbooks in such instance
        For i = 1 To XLAppFx.Workbooks.Count
            If XLAppFx.Workbooks(i).Name = strName Then
               MsgBox("The workbook is open")
               'Close the workbook and ask if user wants to save
               XLAppFx.Workbooks(i).Close
               'Force close and save changes
               XLAppFx.Workbooks(i).Close True
        Next i 
    End Sub
     

    Angepasst von hier

    24 August 2011
    JMax