Seite 2 von 2

Re: COMatePlus speichert nicht

Verfasst: 16.01.2013 22:17
von Kiffi
Joel hat geschrieben:Wenn ich aber in der bereits geöffneten Datei was ändere und diese dann schließe werden die Änderungen nicht mehr gespeichert.
kannst Du das ein wenig näher erläutern? Die Excel-Datei ist geöffnet? Von welchem Programm? Von Excel oder Deinem?

Bin mir jetzt nicht sicher, aber ich gehe mal davon aus, dass man keine Änderungen an geöffneten Dateien durchführen kann.

Grüße ... Kiffi

Re: COMatePlus speichert nicht

Verfasst: 17.01.2013 22:16
von Joel
Kiffi hat geschrieben:Die Excel-Datei ist geöffnet? Von welchem Programm? Von Excel oder Deinem?
Grüße ... Kiffi
Jup. Mein Code öffnet die Datei damit die bearbeitet werden kann. Wenn ich aber nun was änder werden die Änderungen nicht mehr gespeichert.
Kiffi hat geschrieben:Bin mir jetzt nicht sicher, aber ich gehe mal davon aus, dass man keine Änderungen an geöffneten Dateien durchführen kann.
Grüße ... Kiffi
Habe es mal mit einem SaveAs unter anderem Pfad probiert. aber das hat leider auch nichts geholfen.

Hier nochmal der aktuelle ProblemCode:

Code: Alles auswählen

XIncludeFile "COMatePLUS.pbi"
IncludeFile "ExcelConstants.pbi"
XIncludeFile "ExcelFunktion.pbi"
date$ = FormatDate("%dd/%mm/%yyyy", Date())
Define.COMateObject ExcelObject, WorkBook
ExcelObject = XLSFunc_OpenExcelFile(Dropbox_Pfad$)

If ExcelObject
  If ExcelObject\SetProperty("Visible = #True") = #S_OK
    WorkBook = ExcelObject\GetObjectProperty("ActiveWorkbook")
    If WorkBook
      letzte_Reihe = XLSFunc_GetLastRow(ExcelObject)+3
      ExcelObject\SetProperty("Cells("+Str(letzte_Reihe)+",1) = 'Datum:'")
      ExcelObject\SetProperty("Cells("+Str(letzte_Reihe)+",2) = '" + date$ + "' As DATE")
      ExcelObject\SetProperty("Cells("+Str(letzte_Reihe+2)+",1) = 'Lieder:'")
      
      ExcelObject\SetProperty("Application\DisplayAlerts = #False")
      FFormat=#xlNormal
      ;Workbook\Invoke("SaveAs('" + Dropbox_Pfad$ + "'," + Str(FFormat) + ")")
      Workbook\Invoke("Save")
      ExcelObject\SetProperty("Application\DisplayAlerts = #False")
      WorkBook\Release()
    EndIf
  EndIf
  ExcelObject\Release()
Else
  MessageRequester("Excel Datei erstellen", "Couldn't create the application object!")
EndIf

Re: COMatePlus speichert nicht

Verfasst: 18.01.2013 00:33
von Kiffi
Habe grade Deinen Code ausprobiert. Bei mir klappt es
problemlos. Die Änderungen werden gespeichert.

Grüße ... Kiffi

Re: COMatePlus speichert nicht

Verfasst: 02.02.2013 00:24
von Joel
Kiffi hat geschrieben:Habe grade Deinen Code ausprobiert. Bei mir klappt es
problemlos. Die Änderungen werden gespeichert.

Grüße ... Kiffi
Komisch. Bei mir nicht. Hast du auch selbst was eingegeben?

Also nochmal mein vorgehen (hast du das auch so gemacht)?:

1. Die Variable DropboxPfad$ zu einer bestehenden xls Datei ändern.
2. Code ausführen
3. In den Code unter die schon automatisch eingefügten Zeilen noch irgenwas eingeben
4. Excel Fenster durch x schließen (es sollte keine Meldung kommen)

5. Wenn man nun die Excel Datei wieder öffnet ist nur das gespeichert, was mein Code automatisch eingefügt hat aber nicht meine eingegebenen Zeichen.

Code: Alles auswählen

XIncludeFile "COMatePLUS.pbi"
IncludeFile "ExcelConstants.pbi"
XIncludeFile "ExcelFunktion.pbi"
date$ = FormatDate("%dd/%mm/%yyyy", Date())
Define.COMateObject ExcelObject, WorkBook
Dropbox_Pfad$ = "C:\Users\Joel\Dropbox\Songs_old\Lieder.xls"
ExcelObject = XLSFunc_OpenExcelFile(Dropbox_Pfad$)

If ExcelObject
  If ExcelObject\SetProperty("Visible = #True") = #S_OK
    WorkBook = ExcelObject\GetObjectProperty("ActiveWorkbook")
    If WorkBook
      letzte_Reihe = XLSFunc_GetLastRow(ExcelObject)+3
      ExcelObject\SetProperty("Cells("+Str(letzte_Reihe)+",1) = 'Datum:'")
      ExcelObject\SetProperty("Cells("+Str(letzte_Reihe)+",2) = '" + date$ + "' As DATE")
      ExcelObject\SetProperty("Cells("+Str(letzte_Reihe+2)+",1) = 'Lieder:'")
      
      ExcelObject\SetProperty("Application\DisplayAlerts = #False")
      FFormat=#xlNormal
      ;Workbook\Invoke("SaveAs('" + Dropbox_Pfad$ + "'," + Str(FFormat) + ")")
      Workbook\Invoke("Save")
      ExcelObject\SetProperty("Application\DisplayAlerts = #False")
      WorkBook\Release()
    EndIf
  EndIf
  ExcelObject\Release()
Else
  MessageRequester("Excel Datei erstellen", "Couldn't create the application object!")
EndIf

Re: COMatePlus speichert nicht

Verfasst: 02.02.2013 01:09
von Falko
Hallo Joel,

Da das Excel geöffnet ist, also nicht komplett beendet wird, bis du das X für Close machst, würde ich folgendes
empfehlen. Du kannst folgendes weg lassen und ansonsten deinen Code so belassen:
;Workbook\Invoke("Save") - auskommentieren
:)
Dann wird nach dem Schließen deine aktuelle Eintragung gespeichert, egal ob vom Programm oder nachträglich von Hand
eingetragene Zellen eingetragen wurden.
[EDIT]
Aber.... das folgende muss abgeändert werden.

Code: Alles auswählen

ExcelObject\SetProperty("Application\DisplayAlerts = #False")
auf

Code: Alles auswählen

ExcelObject\SetProperty("Application\DisplayAlerts = #True")
Sonst wird leider nichts gespeichert, da keine Abfrage dazu kommt. Also kannste das Save stehen lassen.


Gruß,
Falko

Re: COMatePlus speichert nicht

Verfasst: 03.02.2013 01:32
von Joel
okay das funktioniert. aber mit dem altert= false wollte ich eigentlich erreichen das diese Meldung nicht kommt. kann ich das nicht hinbekommen das er das mit dem x ohne weiterreden direkt mit allen Änderungen speichert?

Re: COMatePlus speichert nicht

Verfasst: 03.02.2013 03:02
von Falko
Soweit ich sehen kann, geht es nicht, wenn du Alert auf False
setzt. Du machst ja auch kein Close, wenn du die Methode Save benutzt.
Da wird wie beim manuellen Speichern unter dem Menüpunkt Datei erst die
Datei überschrieben. Nicht bei einem Close. Das funktioniert dann wiederum
beim Alert True. Aber vielleicht hat Kiffi hier noch einen Trick parat :wink: .
Ob man in Excel Befehle verbiegen könnte, sodass anstelle eines Close ein Speichern
ausführt, habe ich leider keine Idee dazu. Das wäre vielleicht dann eine Möglichkeit, ohne
Ausgabe einer Speichern-Meldung die Datei zu speichern.

Gruß,
Falko

Re: COMatePlus speichert nicht

Verfasst: 03.02.2013 14:12
von Kiffi
Falko hat geschrieben:Aber vielleicht hat Kiffi hier noch einen Trick parat :wink:
Man kann einen Eventhandler setzen. Hier wird dann ein WorkBookBeforeClose-Event
beim Schließen des Excel-Fensters gemeldet, woraufhin ein Save(As) ausgeführt werden kann.

Hier mal ein Probier-Code (Debug-Ausgaben beachten!):

Code: Alles auswählen

[...]
Global WorkBook.COMateObject
[...]
Procedure ExcelCallback(Object.COMateObject, eventName$, parameterCount) 
  Debug "ExcelEvent: " + eventName$
  If eventName$ = "WorkbookBeforeClose"
    Workbook\Invoke("Save")
  EndIf
EndProcedure

If ExcelObject
	
	ExcelObject\SetEventHandler("", @ExcelCallback())
	
  If ExcelObject\SetProperty("Visible = #True") = #S_OK
    WorkBook = ExcelObject\GetObjectProperty("ActiveWorkbook")
    If WorkBook
      letzte_Reihe = XLSFunc_GetLastRow(ExcelObject)+3
      ExcelObject\SetProperty("Cells("+Str(letzte_Reihe)+",1) = 'Datum:'")
      ExcelObject\SetProperty("Cells("+Str(letzte_Reihe)+",2) = '" + date$ + "' As DATE")
      ExcelObject\SetProperty("Cells("+Str(letzte_Reihe+2)+",1) = 'Lieder:'")
      
      ExcelObject\SetProperty("Application\DisplayAlerts = #False")
      FFormat=#xlNormal
      ;Workbook\Invoke("SaveAs('" + Dropbox_Pfad$ + "'," + Str(FFormat) + ")")
      Workbook\Invoke("Save")
      
      OpenWindow(0, 100, 100, 100, 100, "TestFenster")
      Repeat
      	WWE = WaitWindowEvent()
      Until WWE = #PB_Event_CloseWindow
      
      WorkBook\Release()
      
    EndIf
  EndIf
  ExcelObject\Release()
Else
  MessageRequester("Excel Datei erstellen", "Couldn't create the application object!")
EndIf
Grüße ... Kiffi

Re: COMatePlus speichert nicht

Verfasst: 03.02.2013 17:42
von Joel
super danke! funzt

Re: COMatePlus speichert nicht

Verfasst: 03.02.2013 18:06
von Falko
@Kiffi :allright: und Danke. Hab die Callback-Procedure mit aufgenommen.
MfG Falko