Excel Comate Datei ohne Rückfrage speichern

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Ich habe hier auch mal CNESM's Source etwas erweitert.

Dabei öffne ich nun keine Exceltabelle mit Open, sondern es soll nur eine gepeichert werden. Achtung, aus der IDE beim Debuggen wird die Tabelle nicht erstellt. Erst, wenn diese nach dem Compilieren ins Wunschverzeichnis ausgeführt wird, siehst du die dadurch erstellte Tabelle.

Compiliere bitte folgenden Source und starte diese Exe. Dann schau mal im Taskmanager, ob da was hängen bleibt. Bei mir ist alles ok.

Code: Alles auswählen

#xlUp=-4162
IncludePath #PB_Compiler_Home+"comate_pb4-3" 
XIncludeFile "COMate.pbi"
Pfad.s=GetCurrentDirectory()+"MeinExcel.xls"; Datei die erstellt werden soll
Debug Pfad
Define.COMateObject ExcelObject, WorkBook,WorkSheet,myRange,answer
Define myRange.ComateObject
ExcelObject = COMate_CreateObject("Excel.Application")
If ExcelObject
    ExcelObject\SetProperty("Application\DisplayAlerts = #False") ; Excel-Alerts ausschalten
    ;ExcelObject\SetProperty("Visible = #False"); Tabelle nicht sichbar öffnen
    ExcelObject\SetProperty("Visible = #True"); Tabelle sichbar öffnen
    ;ExcelObject\Invoke("Workbooks\Open('"+Pfad+"\Test.xls')"); Wenn man eine bestehende Tabelle öffnen will, dann aufrufen.
    WorkBook = ExcelObject\GetObjectProperty("Workbooks\Add")
    ExcelObject\SetProperty("WorkSheets(1)\Name = 'ErsteTabelle'"); Tabelle1 mit Namen verzeichnen
    ExcelObject\SetProperty("Cells(1,1) = 'Hello'")
    ExcelObject\SetProperty("Cells(1,2) = 'from'")
    ExcelObject\SetProperty("Cells(1,3) = 'COMate!'")
    ExcelObject\SetProperty("Cells(" + Str(intRow) + ",14) = "+ Cell6$ + "")
    ExcelObject\Invoke("ActiveWorkbook\SaveAs('"+Pfad+"')") 
    ExcelObject\Invoke("ActiveWorkbook\Close = #True")
    ;ExcelObject\Invoke("Workbooks\Saved = #True"); Wenn eine XLS geöffnet wurde, reicht dieses Save
    ExcelObject\Invoke("Workbooks\Close")
    ExcelObject\Invoke("Quit()")
    ExcelObject\SetProperty("Application\DisplayAlerts = #True") ; Excel-Alerts wieder aktivieren
    ExcelObject\Release()
Else
  MessageRequester("COMate -Excel demo", "Couldn't create the application object!")
EndIf

Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
TheSaint
Beiträge: 143
Registriert: 21.12.2008 18:59

Beitrag von TheSaint »

Hallo Falko,
hallo CNESM,

ich habe eure beiden Codebeispiele ausprobiert und so, wie sie dort sind funktioniert es und Excel ist auch nicht mehr im Taskmanager.
Ich habe euren beiden Vorschläge versucht mit meinem Code anzupassen, jedoch bleibt es dabei, Excel bleibt im Taskmanager.
Keine Ahnung warum.

Bitte seht euch doch mal diesen Code an:

Code: Alles auswählen

IncludePath #PB_Compiler_Home+"comate_pb4-3"
XIncludeFile "COMate.pbi"

Define.COMateObject ExcelObject, WorkBook
Define.COMateObject ExcelObject, WorkSheet
Define.COMateObject ExcelObject, Sheet

ExcelObject = COMate_CreateObject("Excel.Application")
ExcelObject\SetProperty("Visible = #False")
ExcelObject\Invoke("Workbooks\Open('C:\Kassenbuch2008.xls')")

If ExcelObject
  intRow.i = 13

    For a=1 To ExcelObject\GetIntegerProperty("Worksheets\Count")
      TabName$ = ExcelObject\GetStringProperty("Worksheets("+ Str(a) +")\Name")
        If Right(TabName$,4) = Str(2008)
          WorkSheet = ExcelObject\GetObjectProperty("Sheets('" + TabName$ + "')") 
          WorkSheet\Invoke("Activate()")
            While ExcelObject\GetStringProperty("Cells(" + Str(intRow) + ",8)") <> ""
              Cell6$ = ExcelObject\GetStringProperty("Cells(" + Str(intRow) + ",9)")  
              ExcelObject\SetProperty("Cells(" + Str(intRow) + ",14) = "+ Cell6$ + "")
              intRow + 1
            Wend
        intRow = 13
        EndIf
    Next

    ExcelObject\SetProperty("Application\DisplayAlerts = #False")
    ExcelObject\Invoke("ActiveWorkbook\Save")
    ExcelObject\Invoke("Workbooks\Close")
    ExcelObject\SetProperty("Application\DisplayAlerts = #True")
    ExcelObject\Invoke("Quit()")
    ExcelObject\Release()   

Else
  MessageRequester("COMate - Excel", "Couldn't create the application object!") 
EndIf
Hier funktioniert es einfach nicht. Excel bleibt immer im Taskmanager hängen.
Seht ihr hier vielleicht den Fehler?

Wäre toll, wenn Ihr nochmal hier drauf schauen könntet.
Vielen Dank für Eure Hilfe
Gruß, TheSaint
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Das müsste richtig sein. Das visible muss nach dem Quitt kommen

Code: Alles auswählen

IncludePath #PB_Compiler_Home+"comate_pb4-3"
XIncludeFile "COMate.pbi"

Define.COMateObject ExcelObject, WorkBook
Define.COMateObject ExcelObject, WorkSheet
Define.COMateObject ExcelObject, Sheet

ExcelObject = COMate_CreateObject("Excel.Application")
ExcelObject\SetProperty("Application\DisplayAlerts = #False")
ExcelObject\SetProperty("Visible = #Visible")
ExcelObject\Invoke("Workbook\Open('C:\Test\Kassenbuch2008.xls')")

If ExcelObject
  intRow.i = 13

    For a=1 To ExcelObject\GetIntegerProperty("Worksheets\Count")
      TabName$ = ExcelObject\GetStringProperty("Worksheets("+ Str(a) +")\Name")
        If Right(TabName$,4) = Str(2008)
          WorkSheet = ExcelObject\GetObjectProperty("Sheets('" + TabName$ + "')")
          WorkSheet\Invoke("Activate()")
            While ExcelObject\GetStringProperty("Cells(" + Str(intRow) + ",8)") <> ""
              Cell6$ = ExcelObject\GetStringProperty("Cells(" + Str(intRow) + ",9)") 
              ExcelObject\SetProperty("Cells(" + Str(intRow) + ",14) = "+ Cell6$ + "")
              intRow + 1
            Wend
        intRow = 13
        EndIf
    Next

    
    ExcelObject\Invoke("ActiveWorkbooks\Save = #True")
    ExcelObject\Invoke("Workbook\Close = #True")
    ExcelObject\Invoke("Quit()")
    ExcelObject\SetProperty("Application\DisplayAlerts = #True")
    ExcelObject\Release()   

Else
  MessageRequester("COMate - Excel", "Couldn't create the application object!")
EndIf 


Bild
Win11 Pro 64-Bit, PB_6.11b1
TheSaint
Beiträge: 143
Registriert: 21.12.2008 18:59

Beitrag von TheSaint »

Hallo Falko,
Falko hat geschrieben:Das müsste richtig sein. Das visible muss nach dem Quitt kommen
Danke das Du Dir den Code angesehen hast.
Jetzt kommt wieder bei mir die Frage ob ich die Datei speichern will.
Ich verzweifel langsam.
Bewundere Deine / Eure Geduld.

Es klappt einfach nicht. Entweder bleibt Excel im Taskmanager oder es kommt diese blöde Frage nach dem Speichern.

Nochmals vielen Dank für Deine Hilfe.
Gruß, TheSaint
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

sorry, ich meinte das mit dem
ExcelObject\SetProperty("Application\DisplayAlerts = #True")
nach dem Quit.

Du kannst es aber auch weglassen und wie folgt schreiben.

ExcelObject\Invoke("Quit()=#True")

Der Grund dafür ist, wenn du die Exceltabelle speicherst und dann
mit Close beendet, ist Excel selber noch nicht beendet und wartet
wegen dem DisplayAlerts #True auf deine Bestätigung, ob du Excel beenden möchtest.

Diese Allertbox wird aber nicht mehr
angezeigt. Darum ist Excel immer noch im Task. Also kannst du
am besten auch beim Quitt ein #True setzen, das die Alertbox ein
OK gibt, welche du ja nicht sehen kannst.

Dann braucht man am Ende das Alert nicht wieder einschalten.


Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Wegen dem Speichern, das es nicht klappt. Bei mir in Vista ist es so, das ich nicht einfach unter C:, wegen Benutzerrechte, was speichern kann. Excel wird dann einfach unterbrochen und bleibt ebenfalls im Task hängen.

Somit habe ich mir dort einen Ordner angelegt. und dort speichert er diese xls ab. Dazu hätte ich aber noch eine Frage. Diese Datei muss bei einer Open-Funktion vorhanden sein. Also bin ich davon ausgegangen, das ich zuerst dort eine zuerst diese Kassenbuch.xls im Ordner C:\Test\ erstellt habe, mit deinem Source diese dann bearbeite und das läuft dann so wie es soll, inklusive Task ohne Excel.

Sollte das denn so? Oder willst du eine neue xls-Datei erzeugen?

Wenn ja, dann schau das Beispiel mit SaveAs bitte an.

PS: Geduld ist überhaupt kein Problem. Dafür sind wir ja alle hier im Forum :lol:

Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
TheSaint
Beiträge: 143
Registriert: 21.12.2008 18:59

Beitrag von TheSaint »

Hallo Falko,

vielen Dank für Deine schnelle Antwort.
Falko hat geschrieben: Du kannst es aber auch weglassen und wie folgt schreiben.
ExcelObject\Invoke("Quit()=#True")
Ich verwende jetzt folgenden Code:

Code: Alles auswählen

    ExcelObject\Invoke("ActiveWorkbooks\Save = #True")
    ExcelObject\Invoke("Workbook\Close = #True")
    ExcelObject\Invoke("Quit()=#True")
    ExcelObject\Release()
Entweder bin ich einfach nur zu blöd, oder dieses verdammte Excel...

Also ich habe, bevor ich den Code getestet habe, im Taskmanager nachgesehen: kein Excel mehr vorhanden.

Ich verwende den o. g. Code und...
... Excel bleibt im Taskmanager...

Es tut mir leid...
Es ändert sich nichts.
Gruß, TheSaint
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Zwar hat es bei mir auch funktioniert, aber ich hatte noch
am Anfang des Sources einen kleinen Fehler gehabt:
ExcelObject\SetProperty("Visible = #visible")
Hast du die Datei Kassenbuch2008.xls im Verzeichnis C:\Test\
kopiert und dann z.B. aus dem Desktop den folgenden PB -Code geöffnet und ausgeführt?

Im Task sieht man schön, wie sich Excel kurz anzeigt und dann wieder nach Ablauf des Programms verschwindet.

Gruß Falko

Code: Alles auswählen

IncludePath #PB_Compiler_Home+"comate_pb4-3"
XIncludeFile "COMate.pbi"

Define.COMateObject ExcelObject, WorkBook
Define.COMateObject ExcelObject, WorkSheet
Define.COMateObject ExcelObject, Sheet

ExcelObject = COMate_CreateObject("Excel.Application")
ExcelObject\SetProperty("Application\DisplayAlerts = #False")
ExcelObject\SetProperty("Visible = #False")
ExcelObject\Invoke("Workbook\Open('C:\Test\Kassenbuch2008.xls')")

If ExcelObject
  intRow.i = 13

    For a=1 To ExcelObject\GetIntegerProperty("Worksheets\Count")
      TabName$ = ExcelObject\GetStringProperty("Worksheets("+ Str(a) +")\Name")
        If Right(TabName$,4) = Str(2008)
          WorkSheet = ExcelObject\GetObjectProperty("Sheets('" + TabName$ + "')")
          WorkSheet\Invoke("Activate()")
            While ExcelObject\GetStringProperty("Cells(" + Str(intRow) + ",8)") <> ""
              Cell6$ = ExcelObject\GetStringProperty("Cells(" + Str(intRow) + ",9)") 
              ExcelObject\SetProperty("Cells(" + Str(intRow) + ",14) = "+ Cell6$ + "")
              intRow + 1
            Wend
        intRow = 13
        EndIf
    Next

    
    ExcelObject\Invoke("ActiveWorkbooks\Save = #True")
    ExcelObject\Invoke("Workbook\Close = #True")
    ExcelObject\Invoke("Quit()=#True")
    ;ExcelObject\SetProperty("Application\DisplayAlerts = #True")
    ; muss nicht umbedingt gesetzt werden, wenn Save, Close und Quit mit #True gesetzt werden
    ExcelObject\Release()   

Else
  MessageRequester("COMate - Excel", "Couldn't create the application object!")
EndIf 
Bild
Win11 Pro 64-Bit, PB_6.11b1
TheSaint
Beiträge: 143
Registriert: 21.12.2008 18:59

Beitrag von TheSaint »

Hallo Falko,
Falko hat geschrieben: Hast du die Datei Kassenbuch2008.xls im Verzeichnis C:\Test\
kopiert und dann z.B. aus dem Desktop den folgenden PB -Code geöffnet und ausgeführt?

Im Task sieht man schön, wie sich Excel kurz anzeigt und dann wieder nach Ablauf des Programms verschwindet.
Also die Excel Datei existiert schon und ich lese alle Zellen aus und dann schreibe ich eine eine Zelle eine BuchungsNr.
Die Datei ist unter D:\Daten\Excel\Kassenbuch2008.xls gespeichert.
Den Pfad muss ich halt immer korrigieren, nachdem ich ein Beispielcode von Dir erhalte.
Ich benutze Excel 2003 und XP Prof.

Egal welchen Code ich benutze, Excel bleibt im Taskmanager.
Ich weis nicht woran das liegt. Bei jeden neuen Test schaue ich in den Taskmanager und wenn Excel vorhanden ist beende ich den Prozess.

Diese blöde Excel ist einfach nicht weg zu kriegen.
Frage mich die ganze Zeit was ich falsch mache.

Könntest Du nochmal schauen? Vielen Dank.
Zuletzt geändert von TheSaint am 02.04.2009 07:50, insgesamt 1-mal geändert.
Gruß, TheSaint
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Ich habe nun versucht Errorcodes ausgeben zu lassen um zu sehen,
wo sich da Fehler eingeschlichen haben. Leider ist es mit diesem #True in wohl nicht korrekt gewesen, obwohl es beim Office 2007 funktionierte. Comat sagt, aber das es falsch ist. Siehe Code mit Debug

Ich habe nun alles soweit angepasst, bis keine Fehlermeldung bei den Comate-funktionen auftauchen. Nun ist es so, wie Du es hast. Excel wird im Task nicht beendet.

Code: Alles auswählen

IncludePath #PB_Compiler_Home+"comate_pb4-3"
XIncludeFile "COMate.pbi"

Define.COMateObject ExcelObject, WorkBook
Define.COMateObject ExcelObject, WorkSheet
Define.COMateObject ExcelObject, Sheet

ExcelObject = COMate_CreateObject("Excel.Application")
Debug COMate_GetLastErrorDescription() 
ExcelObject\SetProperty("Visible = #False")
Debug COMate_GetLastErrorDescription() 
ExcelObject\Invoke("Workbooks\Open('C:\Daten\Kassenbuch2008.xls')")
Debug COMate_GetLastErrorDescription() 
If ExcelObject
  intRow.i = 13

    For a=1 To ExcelObject\GetIntegerProperty("Worksheets\Count")
      TabName$ = ExcelObject\GetStringProperty("Worksheets("+ Str(a) +")\Name")
        If Right(TabName$,4) = Str(2008)
          WorkSheet = ExcelObject\GetObjectProperty("Sheets('" + TabName$ + "')")
          WorkSheet\Invoke("Activate()")
            While ExcelObject\GetStringProperty("Cells(" + Str(intRow) + ",8)") <> ""
              Cell6$ = ExcelObject\GetStringProperty("Cells(" + Str(intRow) + ",9)") 
              ExcelObject\SetProperty("Cells(" + Str(intRow) + ",14) = "+ Cell6$ + "")
              intRow + 1
            Wend
        intRow = 13
        EndIf
    Next
    Debug COMate_GetLastErrorDescription() 
    ExcelObject\SetProperty("Application\DisplayAlerts = #False")
    Debug COMate_GetLastErrorDescription() 
;    ExcelObject\SetProperty("ActiveWorkbook\Saved = #True")
;    Debug COMate_GetLastErrorDescription() 
    ExcelObject\Invoke("ActiveWorkbook\Save")
    Debug COMate_GetLastErrorDescription() 
    ExcelObject\Invoke("Workbooks\Close")
    Debug COMate_GetLastErrorDescription() 
    ExcelObject\Invoke("Quit()")
    Debug COMate_GetLastErrorDescription() 
    ExcelObject\SetProperty("Application\DisplayAlerts = #True")
    Debug COMate_GetLastErrorDescription() 
    ExcelObject\Release()   
    Debug COMate_GetLastErrorDescription() 
Else
  MessageRequester("COMate - Excel", "Couldn't create the application object!")
EndIf 
Bild
Win11 Pro 64-Bit, PB_6.11b1
Antworten