Seite 8 von 8

Verfasst: 03.07.2007 22:00
von Falko
Hast Recht, sieht schöner aus und das Else ... mit Rückgabe = "0" bringt
sowieso nix. Die Deklaration in der Procedure, kann ich doch eigentlich weg lassen,
da sie durch das vorherige Define vorgegeben ist. Zumindestens läuft der Source auch so ohne Fehler :wink:
Shared ExcelApp, Resume
Protected ReturnValue

@Kiffi,
Die Seite kannte ich nur durch meinen Schwager, da er oftmals dort im Forum
wegen Acces und Excel sich gute Tips geholt hatte.
Wie ich die Abfrage zum speichern von Excel nun ausschalten kann, habe
ich dank eurer Tips nun auch bewerkstelligen können. :allright:
; -- End of code
dhPutValue(ExcelApp, ".Application.DisplayAlerts = %b", #False)
dhCallMethod(ExcelApp, ".Quit"); Close Exceltable
dhPutValue(ExcelApp, ".Application.DisplayAlerts = %b", #True)
Grüße ..Falko

Verfasst: 03.07.2007 22:11
von ts-soft
>> Die Deklaration in der Procedure, kann ich doch eigentlich weg lassen
Nein, es sei denn Du hast es global deklariert, was ich nicht empfehlen
würde.
Setz mal EnableExplicit an den CodeAnfang!

Alle Variablen die nur in eine Procedure genutzt werden am besten dort mir
Protected deklarieren.
Variablen die Du sharen möchtes am CodeAnfang mit Define deklarieren!

Gruß
Thomas

Verfasst: 03.07.2007 22:33
von Kiffi
Falko hat geschrieben:

Code: Alles auswählen

; -- End of code
 dhPutValue(ExcelApp, ".Application.DisplayAlerts = %b", #False)
 dhCallMethod(ExcelApp, ".Quit"); Close Exceltable
 dhPutValue(ExcelApp, ".Application.DisplayAlerts = %b", #True)
wenn das sowieso das Ende des Codes ist, brauchst Du DisplayAlerts nicht
noch einmal extra anzuschalten. Wenn Du das ExcelApp-Objekt freigibst, wird
diese Einstellung eh verworfen.

Grüße ... Kiffi

Verfasst: 03.07.2007 22:35
von Falko
ts-soft hat geschrieben:>> Die Deklaration in der Procedure, kann ich doch eigentlich weg lassen
Nein, es sei denn Du hast es global deklariert, was ich nicht empfehlen
würde.
Setz mal EnableExplicit an den CodeAnfang!

Alle Variablen die nur in eine Procedure genutzt werden am besten dort mir
Protected deklarieren.
Variablen die Du sharen möchtes am CodeAnfang mit Define deklarieren!

Gruß
Thomas
Ok, das leuchtet mir ein. Das EnableExplicit habe ich schon am Anfang
stehen gehabt. Erst nachdem ich Shared und Protect gesetzt hatte lief es
auch in der Procedure. Ich bin gerade schnell am Ändern des Sources und
kopiere es nachher über den alten :allright:

Ich habe noch was gefunden, und möchte diese Proceduren auch einbauen. Das mit dem Quitt läuft,
aber das mit dem Workbooks.Close,
da habe ich noch einen Fehler drinne.

Code: Alles auswählen

Procedure CloseExcelAll()
  Shared ExcelApp.l 
  dhPutValue(ExcelApp, ".Application.DisplayAlerts = %b", #False)
  dhCallMethod(ExcelApp, ".Quit"); Close Excel
EndProcedure

Procedure CloseWorkbooks()
 Shared ExcelApp.l,Workbooks.l
  dhPutValue(ExcelApp, ".Application.DisplayAlerts = %b", #False)
  dhCallMethod(Workbooks, ".Close"); Close Exceltable
  dhPutValue(ExcelApp, ".Application.DisplayAlerts = %b", #True)
EndProcedure
Das Workbooks ist doch die aktuelle Tabelle, die offen ist. Oder sehe ich
das verkehrt? Achja, das Beispiel habe ich auch gerade aus
Herbers Excel.



Güße, ...Falko

Verfasst: 03.07.2007 22:52
von Kiffi
Falko hat geschrieben:Das Workbooks ist doch die aktuelle Tabelle, die offen ist. Oder sehe ich das verkehrt?
Das Workbook (ohne s am Ende) ist die in Excel geladene Datei (*.xls).
Wenn mehrere Dateien in Excel geladen sind, dann gibt es eine Workbooks
(mit s am Ende) -Auflistung.

(Sorry, wenn ich hier so korythenmässig drauf bin, aber beim Aufruf
der Objekte musst Du das sehr wohl unterscheiden, denn sonst gibt's
kuddelmuddel.)

Falko hat geschrieben:

Code: Alles auswählen

dhCallMethod(Workbook, ".Close")
... sollte generell richtig sein. Ich vermute mal, dass Dein Workbook kein
gültiges Workbook-Objekt ist.

Code: Alles auswählen

dhGetValue("%o", @Workbook, ExcelApp, ".ActiveWorkbook")
... ermittelt das Workbook-Objekt des aktuell geladenen und aktiven
Dokumentes.

Grüße ... Kiffi

Verfasst: 03.07.2007 23:10
von Falko
OK, dann habe ich das wohl falsch interpretiert, was die Herbers - Seite Zeigt:

Code: Alles auswählen

StandardModule: basMain

Sub AllesBeenden1()
   Application.DisplayAlerts = False
   Workbooks.Close
   Application.DisplayAlerts = True
End Sub

Sub AllesBeenden2()
   Application.DisplayAlerts = False
   Application.Quit
   Application.DisplayAlerts = True
End Sub
                    
Ich dachte, das wäre so, als wenn man nur die aktuelle Tabelle schließt, sodas Excel danach kein Tabellenblatt mehr anzeigt. Ist wirklich verzwickt.
Naja, da ich morgen früh um 5 Uhr aufstehen muß kann ich heute wohl nicht mehr viel schaffen. Versuch mit folgendem beendet ebenfalls Excel komplett. Trotzdem vielen Dank für eure Hilfe. Ich hoffe ich nerve nicht :mrgreen:

Code: Alles auswählen

Procedure CloseWorkbooks()
 Shared ExcelApp.l,Workbooks.l
  dhGetValue("%o", @Workbooks, ExcelApp, ".ActiveWorkbook")
  dhPutValue(ExcelApp, ".Application.DisplayAlerts = %b", #False)
  dhCallMethod(Workbooks, ".Close"); Close Exceltable
  dhPutValue(ExcelApp, ".Application.DisplayAlerts = %b", #True)
EndProcedure
Gruß ...Falko

Verfasst: 03.07.2007 23:33
von Kiffi
Falko hat geschrieben:Versuch mit folgendem beendet ebenfalls Excel komplett.
das sieht nur so aus. Anscheinend meint Excel sich verstecken zu müssen,
wenn das letzte Workbook geschlossen ist. Ein Blick in den Taskmanager
zeigt ein anderes Bild ;-)

Code: Alles auswählen

EnableExplicit

Define.l ExcelApp

Procedure CloseWorkbook()
  
  Shared ExcelApp.l
  Protected Workbook.l
  
  dhGetValue("%o", @Workbook, ExcelApp, ".ActiveWorkbook")
  
  If Workbook
    dhPutValue(ExcelApp, ".Application.DisplayAlerts = %b", #False)
    dhCallMethod(Workbook, ".Close"); Close Exceltable
    dhReleaseObject(Workbook) 
    dhPutValue(ExcelApp, ".Application.DisplayAlerts = %b", #True)
  EndIf
  
EndProcedure

dhToggleExceptions(#True)

ExcelApp = dhCreateObject("Excel.Application")

If ExcelApp
  
  ; Leeres Workbook hinzufügen
  dhCallMethod(ExcelApp, ".Workbooks.Add")
   
  MessageRequester("Guck mal in den Taskmanager", "Da sollte nun mindestens 1 Excel-Instanz zu sehen sein")
  
  ; Aktives Workbook schliessen
  CloseWorkbook()
  
  MessageRequester("Guck mal in den Taskmanager", "Noch immer die gleiche Anzahl von Excel-Instanzen")
  
  ; Excel-Instanz beenden
  dhCallMethod(ExcelApp, ".Quit")
  
  dhReleaseObject(ExcelApp) : ExcelApp = 0
  
  MessageRequester("Guck mal in den Taskmanager", "Nun ist eine Excel-Instanz weniger da.")
  
Else
  
  MessageRequester("PureDispHelper-ExcelDemo", "Couldn't create Excel-Object")
  
EndIf
Wenn Du nach dem CloseWorkbook() noch ein

Code: Alles auswählen

dhPutValue(ExcelApp, ".Visible = %b", #True)
ausführst, dann siehst Du Deine Excel-Instanz wieder.

Wie gesagt: Wenn Du die Close-Methode auf ein einzelnes Workbook
ausführen möchtest, dann musst Du ein korrektes Workbook-Objekt
übergeben.

Wenn Du jedoch mit einem Schlag alle geöffneten Dokumente innerhalb
einer Excel-Instanz schließen willst, dann reicht ein

Code: Alles auswählen

dhCallMethod(ExcelApp, ".Workbooks.Close")

Du siehst: Es ist wichtig, zwischen Workbooks und Workbook zu
unterscheiden. ;-)

Grüße ... Kiffi

Verfasst: 03.07.2007 23:47
von ts-soft
@Falko
Verbesserungsvorschlag, leider nicht getested, da kein Excel installiert. Ich
finde es nicht so praktisch mit dem Shared, ohne kann man es als Include
für versch. ExcelObjecte nutzen. Hab Deinem Code mal nach meinen
Vorstellungen angepaßt, kannste so übernehmen oder wenigstens mal drüber
Nachdenken :wink:

Code: Alles auswählen

EnableExplicit

Procedure.s ReadCellS(*obj, Zeile.l,Spalte.l)
  Protected ReturnValue.l, Resume.s
  dhGetValue("%T", @ReturnValue, *obj, "Cells(%d, %d).Value",Zeile, Spalte) ; read one value
  If ReturnValue
    Resume=PeekS(ReturnValue)
    dhFreeString(ReturnValue)
    ProcedureReturn Resume
  EndIf
EndProcedure


Procedure WriteCellS(*obj, Zeile.l, Spalte.l, NewValue.s)
  dhPutValue(*obj, "Cells(%d, %d).Value = %T", Zeile, Spalte, @NewValue) ; write one value
EndProcedure


Procedure WriteCellZ(*obj, Zeile.l, Spalte.l, NewValueZ.d)
  dhPutValue(*obj, "Cells(%d, %d).Value = %e", Zeile, Spalte, @NewValueZ) ; write one value
EndProcedure

Procedure.s ReadLeftHeader(*obj)
  Protected ReturnValue.l, Resume.s
  dhGetValue("%T", @ReturnValue, *obj, ".ActiveSheet.PageSetup.LeftHeader")
  If ReturnValue
    Resume=PeekS(ReturnValue)
    dhFreeString(ReturnValue)
    ProcedureReturn Resume
  EndIf
EndProcedure


Procedure.s ReadCenterHeader(*obj)
  Protected ReturnValue.l, Resume.s
  dhGetValue("%T", @ReturnValue, *obj, ".ActiveSheet.PageSetup.CenterHeader")
  If ReturnValue
    Resume=PeekS(ReturnValue)
    dhFreeString(ReturnValue)
    ProcedureReturn Resume
  EndIf
EndProcedure


Procedure.s ReadRightHeader(*obj)
  Protected ReturnValue.l, Resume.s
  dhGetValue("%T", @ReturnValue, *obj, ".ActiveSheet.PageSetup.RightHeader")
  If ReturnValue
    Resume=PeekS(ReturnValue)
    dhFreeString(ReturnValue)
    ProcedureReturn Resume
  EndIf
EndProcedure

Procedure.s ReadLeftFooter(*obj)
  Protected ReturnValue.l, Resume.s
  dhGetValue("%T", @ReturnValue, *obj, ".ActiveSheet.PageSetup.LeftFooter")
  If ReturnValue
    Resume=PeekS(ReturnValue)
    dhFreeString(ReturnValue)
    ProcedureReturn Resume
  EndIf
EndProcedure

Procedure.s ReadCenterFooter(*obj)
  Protected ReturnValue.l, Resume.s
  dhGetValue("%T", @ReturnValue, *obj, ".ActiveSheet.PageSetup.CenterFooter")
  If ReturnValue
    Resume=PeekS(ReturnValue)
    dhFreeString(ReturnValue)
    ProcedureReturn Resume
  EndIf
EndProcedure

Procedure.s ReadRightFooter(*obj)
  Protected ReturnValue.l, Resume.s
  dhGetValue("%T", @ReturnValue, *obj, ".ActiveSheet.PageSetup.RightFooter")
  If ReturnValue
    Resume=PeekS(ReturnValue)
    dhFreeString(ReturnValue)
    ProcedureReturn Resume
  EndIf
EndProcedure

Procedure WriteLeftHeader(*obj, Text.s)
  dhPutValue(*obj, ".ActiveSheet.PageSetup.LeftHeader=%T", @Text)
EndProcedure

Procedure WriteCenterHeader(*obj, Text.s)
  dhPutValue(*obj, ".ActiveSheet.PageSetup.CenterHeader=%T", @Text)
EndProcedure

Procedure WriteRightHeader(*obj, Text.s)
  dhPutValue(*obj, ".ActiveSheet.PageSetup.RightHeader=%T", @Text)
EndProcedure

Procedure WriteLeftFooter(*obj, Text.s)
  dhPutValue(*obj, ".ActiveSheet.PageSetup.LeftFooter=%T", @Text)
EndProcedure

Procedure WriteCenterFooter(*obj, Text.s)
  dhPutValue(*obj, ".ActiveSheet.PageSetup.CenterFooter=%T", @Text)
EndProcedure

Procedure WriteRightFooter(*obj, Text.s)
  dhPutValue(*obj, ".ActiveSheet.PageSetup.RightFooter=%T", @Text)
EndProcedure

Procedure CloseExcelAll(*obj)
  dhPutValue(*obj, ".Application.DisplayAlerts = %b", #False)
  dhCallMethod(*obj, ".Quit"); Close Excel
EndProcedure

Procedure CloseWorkbook(*obj)
  Protected Workbook.l
 
  dhGetValue("%o", @Workbook, *obj, ".ActiveWorkbook")
 
  If Workbook
    dhPutValue(*obj, ".Application.DisplayAlerts = %b", #False)
    dhCallMethod(Workbook, ".Close"); Close Exceltable
    dhReleaseObject(Workbook)
    dhPutValue(*obj, ".Application.DisplayAlerts = %b", #True)
  EndIf
 
EndProcedure 
 
Define.l Pattern, ExcelAPP
Define.s StandardFile, sPattern, Datei, StandardFile, Text

StandardFile = ""
sPattern = "Text (*.xls)|*.xls|Alle Dateien (*.*)|*.*"
Pattern = 0
Datei = OpenFileRequester("Bitte eine XLS-Datei auswählen", StandardFile, sPattern, Pattern)
 

dhToggleExceptions(#True); Toggles error messages from DispHelper on or off

ExcelApp = dhCreateObject("Excel.Application")

If ExcelApp
 
  dhCallMethod(ExcelApp, ".Workbooks.Open(%T)", @Datei) ; open ExcelFile
  dhPutValue(ExcelApp, ".Visible = %b", #True) ; Visible Excel
 
; -- Here write your code


MessageRequester("Read_Cells", ReadCellS(ExcelApp, 2, 1))
WriteCellS(ExcelApp, 1, 1, "Hier mein eigener Text")
WriteCellZ(ExcelApp, 1, 7, 20.56)

Text = "Linke Kopfzeile: " + ReadLeftHeader(ExcelApp) + #CRLF$
Text + "Mittlere Kopfzeile: " + ReadCenterHeader(ExcelApp) + #CRLF$
Text + "Rechte Kopfzeile: " + ReadRightHeader(ExcelApp) + #CRLF$
Text + "Linke Fußzeile: " + ReadLeftFooter(ExcelApp) + #CRLF$
Text + "Mittlere Fußzeile: " + ReadCenterFooter(ExcelApp) + #CRLF$
Text + "Rechte Fußzeile: " + ReadRightFooter(ExcelApp)
MessageRequester("Excel_Kopf&Fusszeile", Text)

; -- End of code
CloseWorkbook(ExcelApp); for changing another table, close this table.

;...

;CloseExcelAll(); for end of Excel

 
 dhReleaseObject(ExcelApp) : ExcelApp = 0
 
Else
 
  MessageRequester("PureDispHelper-ExcelDemo", "Couldn't create Excel-Object")
 
EndIf 
Gruß
Thomas

PS: Hab noch ein paar fehlende Spaces übersehen :lol:

Verfasst: 04.07.2007 16:53
von Falko
Hallo Thomas,
danke, ich übernehme deinen Source :allright: . Um das sichtbar zu machen, das Excel noch aktiv ist,
wie Kiffi vorher geschrieben hatte, habe ich das für die Demo noch etwas erweitert.

Ich habe hier die nun fertig editierte ExcelDemo in Tips und Tricks verschoben :wink:

ExcelDemo unter Tips und Tricks

Gruß Falko

Verfasst: 03.09.2008 14:44
von ts-soft
Bekanntmachung:

Weiterentwicklung eingestellt :wink:

Download bleibt weiterhin erhalten, aber für neuere Projekte solltet Ihr
COMate - control COM objects through automation
nutzen, weil:
- leichtere Syntax
- nativer PB-Source
- keine Problem bei neuen PB Versionen, selbst die 64-Bit Version wird mit
dieser Include funktionieren :wink:

Ich hoffe Ihr habt mit COMate von srod genausoviel Spaß wie mit dem
PureDisphelper, jedenfalls der Merlin funktioniert :lol:

Gruß
Thomas