Zugriff verweigert (Öffnen einer 2. Excel Datei) (Excel Warpperklasse)



  • Bleibt die Excelinstanz in deiner Klasse erhalten?
    Beim Durchschauen ist mir auch aufgefallen, dass die CloseWorkbook Funktion einen Fehler hat. Sie sollte so aussehen.

    bool TMLExcel::CloseWorkbook(AnsiString BookName)
    {
      try
      {
       int temp=IndexOfWorkbooks(BookName);
       if(Connect && temp != -1) //Test von temp gegen -1 und nicht gegen 0
           var_Excel.OlePropertyGet("Workbooks",temp).OleProcedure("Close");
       else
          return false;
    
       UpdateBookList();
       return true;
      }
      catch (...)
      {
         return false;
      }
    }
    

    IndexOfWorkbooks gibt -1 und nicht 0 zurück wenn das Workbook nicht existiert. Das problem kann also bei allen Funktionen auftreten, die IndexOfWorkbooks verwenden.



  • Ich habe mal meine Änderungen der Excel-Klasse hier eingepflegt.
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-214989.html
    Welche Office Variante hast du eigentlich?



  • Hallo,

    also when ich CloseWorkbook aufrufe bleibt die Excel Instanz zumindest geöffnet. Diese schließe ich dann mit OleFunction("Quit").

    Das Problem mit Zugriff auf "DateiName" verweigert besteht weiter.

    Danke schon mal für die Verbesserung

    Gruß

    Grim



  • Nochmal die Frage, Welche Office-Version verwendest du?
    In einer Antwort in dem von mir verlinkten Thread hat jemand von Problemen mit Office 2007 berichtet. Da ich das nicht habe, kann ich dazu aber nichts sagen.



  • Hallo,

    ich verwende Office 2002 SP3.
    Wird aber im Laufe des Jahres auf Office 2007 umgestellt.

    Gruß

    Mathias



  • Ich kann dein Problem nicht nachvollziehen. Evtl. kannst du ja mal etwas mehr Code zeigen oder falls das zuviel ist, mir dein Projekt schicken.



  • So hier mal etwas mehr.
    Diese Routine wird geöffnet nachdem beim Standard Öffnendialog gerufen wird.

    Gruß

    void __fastcall TDesignForm::FileOpen1Accept(TObject *Sender)
    {
            //Routine die gerufen wird, sobald der FileOpen-Dialog beendet wird
            //Danach soll eine Musterprojekt geöffnet werden
            AnsiString path, fname;
            AnsiString ModDatFName, ModDatFName2, s1, s2;
    
            bool test;
            bool case2;
    
            path = ExtractFilePath(FileOpen1->Dialog->FileName);
            ED.ProjFName = FileOpen1->Dialog->FileName;
            ED.FilePath = path;
    
            ED.Excel = new TMLExcel;
            ED.Excel->OpenWorkbook(ED.ProjFName);
            fname = ExtractFileName(ED.ProjFName);
            this->ProjektNameFrame->Wert->Text = fname;
    
            bool existsProj;
            existsProj = false;
    
            s1 = "test";
            s2 = "test";
            AnsiString Item, name;
            int count = 0;
            int i, k, j, l;
            j = 0;
            for(l = 0; l < 2; l++)
            {
                    for(k = 0; k < ED.Excel->WorkbookCount; k++)
                    {
                            for(i = 0; i < ED.Excel->Books[k]->WorksheetCount; i++)
                            {
                                    name = ED.Excel->Books[k]->Sheets[i]->Name;
                                    if(name == "EDaten(T)")
                                    {
                                            existsProj = true;
                                            this->ProjektNrFrame->Wert->Text = ED.Excel->Books[k]->Sheets[i]->CellString[6][2];
                                            if(this->ProjektNrFrame->Wert->Text == "6345789")
                                            {
                                                    this->ProjektNrFrame->Wert->Text = "";
                                            }
                                            this->KundeFrame->Wert->Text = ED.Excel->Books[k]->Sheets[i]->CellString[5][2];
                                            if(this->ProjektNrFrame->Wert->Text == "6345789")
                                            {
                                                    this->ProjektNrFrame->Wert->Text = "";
                                            }
                                            this->DatenQuelleFrame->Wert->Text = "";
                                    }
                            }
                    }
            }
    
            if(!existsProj)
            {
                    ShowMessage("Die gewaehlte Datei ist keine Projektdatei!");
                    this->ProjektNameFrame->Wert->Text = "Projekt";
            }
    
            //Teilinitialisierung
            //Es werden weder Elektronik, noch Blechschnitt initialisiert
            ED.Init(-1,-1,-1);
            test = false;
            ED.Excel->CloseWorkbook(ED.ProjFName);
            ED.Excel->DeusExMachina();
    
            //ED.Excel->~TMLExcel();
    
            //ModDatFName2 = "C:\\Documents and Settings\\z563187\\Desktop\\Design v46 Basis\\Modelldat.xls";
            if(ED.ModeldatName == NULL || ED.ModeldatName == "")
            {
                    ModDatFName = OpenDialog();
                    ED.ModelDat = new TMLExcel;
                    ED.ModelDat->OpenWorkbook(ModDatFName);
            }
            else
            {
                    ED.Excel->OpenWorkbook(path + ED.ModeldatName);
            }
    
            test = true;
            if(!test)
            {
                    ModDatFName = OpenDialog();
                    Sleep(500);
                    case2 = ED.Excel->OpenWorkbook(ModDatFName2);
    
            }
    
            for(k = 0; k < ED.Excel->WorkbookCount; k++)
            {
                    for(i = 0; i < ED.Excel->Books[k]->WorksheetCount; i++)
                    {
                            name = ED.Excel->Books[k]->Sheets[i]->Name;
                            if(name == "ModelldatMot")
                            //i = ED.Excel->Books[k]->IndexOfWorksheets("ModelldatMot");
                            {
                                    if(i != -1)
                                    {
                                            while((count != 6345789))
                                            {
                                                    count = StrToInt(ED.Excel->Books[k]->Sheets[i]->CellString[1][5 + j]);
                                                    Item = ED.Excel->Books[k]->Sheets[i]->CellString[2][5 + j];
                                                    this->BlechschnittComboFrame->Auswahl->AddItem(Item, BlechschnittComboFrame);
                                                    j = j + 1;
                                                    count = StrToInt(ED.Excel->Books[k]->Sheets[i]->CellString[1][5 + j]);
                                            }
                                    }
                            }
                    }
            }
            j = 0;
            count = 0;
            for(k = 0; k < ED.Excel->WorkbookCount; k++)
            {
                    for(i = 0; i < ED.Excel->Books[k]->WorksheetCount; i++)
                    {
                            name = ED.Excel->Books[k]->Sheets[i]->Name;
                            if(name == "ModelldatLE")
                            //i = ED.Excel->Books[k]->IndexOfWorksheets("ModelldatLE");
                            {
                                    if(i != -1)
                                    {
                                            while((count != 6345789))
                                            {
                                                    count = StrToInt(ED.Excel->Books[k]->Sheets[i]->CellString[1][4 + j]);
                                                    Item = ED.Excel->Books[k]->Sheets[i]->CellString[2][5 + j];
                                                    this->ElektronikComboFrame->Auswahl->AddItem(Item, ElektronikComboFrame);
                                                    j = j + 1;
                                                    count = StrToInt(ED.Excel->Books[k]->Sheets[i]->CellString[1][5 + j]);
                                            }
                                    }
                            }
                    }
            }
            EnDis(true);
    }
    


  • Warum ist die Excel-Instanz bei dir Mitglied der Klasse? Das scheint mir nicht nötig. Brauchst du die auch noch woanders?
    Da das Einlesen wohl nur in dieser Funktion erfolgt, würde ich die Excelinstanzen lokal dort erzeugen. Das muß auch nicht dynamisch geschehen (per new). Statt ED.ModelDat legst du dann einfach eine zweite lokale Instanz an. Dann hast du auch keine Probleme mehr mit der Speicherfreigabe.
    Den Rest schau ich mir später an.



  • Hi,

    so ich habe nun die Excelinstanz aus der Struktur ED extrahiert.
    Ich habe also in meiner FileOpenAccept-funktion eine

    TMLExcel Musterprojekt; 
    Musterprojekt = new TMLExcel;
    

    angelegt.

    Nun wird das erste Excel-File geöffnet.

    Musterprojekt->OpenWorkbook(ED.ProjFName);
    

    Einige Operationen ausgeführt und dann das Workbook geschlossen.

    Musterprojekt->CloseWorkbook(ED.ProjFName);
    

    So, nun möchte ich mit der Instanz ein anderes Workbook öffnen.

    Musterprojekt->OpenWorkbook(ModDatFName);
    

    Aber leider das selbe Fehlerbild.

    Was mache ich falsch?

    Danke für Euren Support

    Gruß

    Grim



  • Hi,

    mein Problem hat sich gerade gelöst.
    Es lag wohl an meinem Handle, den ich für den Öffnen-Dialog verwendet habe.

    Nochmals Danke für Eure Mühen.

    Gruß

    Grim



  • Was für ein Handle?


Anmelden zum Antworten