PureDispHelper Userlib - Update Include für Unicode Support

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Falko hat geschrieben:hast du noch ein Beispiel, wie man eine komplette Fusszeile auslesen als auch schreiben kann?
yepp:

Code: Alles auswählen

[...]

dhGetValue("%T", @ReturnValue, ExcelApp, ".ActiveSheet.PageSetup.LeftHeader")
If ReturnValue
  Debug "Kopfzeile links: " + PeekS(ReturnValue)
  dhFreeString(ReturnValue)
EndIf
  
dhGetValue("%T", @ReturnValue, ExcelApp, ".ActiveSheet.PageSetup.CenterHeader")
If ReturnValue
  Debug "Kopfzeile mitte: " + PeekS(ReturnValue)
  dhFreeString(ReturnValue)
EndIf
  
dhGetValue("%T", @ReturnValue, ExcelApp, ".ActiveSheet.PageSetup.RightHeader")
If ReturnValue
  Debug "Kopfzeile rechts: " + PeekS(ReturnValue)
  dhFreeString(ReturnValue)
EndIf
  
dhGetValue("%T", @ReturnValue, ExcelApp, ".ActiveSheet.PageSetup.LeftFooter")
If ReturnValue
  Debug "Fußzeile links: " + PeekS(ReturnValue)
  dhFreeString(ReturnValue)
EndIf
  
dhGetValue("%T", @ReturnValue, ExcelApp, ".ActiveSheet.PageSetup.CenterFooter")
If ReturnValue
  Debug "Fußzeile mitte: " + PeekS(ReturnValue)
  dhFreeString(ReturnValue)
EndIf
  
dhGetValue("%T", @ReturnValue, ExcelApp, ".ActiveSheet.PageSetup.RightFooter")
If ReturnValue
  Debug "Fußzeile rechts: " + PeekS(ReturnValue)
  dhFreeString(ReturnValue)
EndIf

[...]
das schreiben dann analog so:

Code: Alles auswählen

dhPutValue(ExcelApp, ".ActiveSheet.PageSetup.RightFooter=%T", @"Neuer Text für Fußzeile rechts")
Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Sub PartLeftFooter()
Dim intCounter As Integer, intChr As Integer
Dim sTxt As String
sTxt = ActiveSheet.PageSetup.LeftFooter; dhGetValue()
Do Until InStr(sTxt, vbLf) = 0; stringfield
For intCounter = Len(sTxt) To 1 Step -1
If Asc(Mid(sTxt, intCounter, 1)) = 10 Then Exit Do
intChr = Asc(Mid(sTxt, intCounter, 1))
If intCounter = 1 Then Exit Sub
Next intCounter
Loop
sTxt = Right(sTxt, Len(sTxt) - intCounter)
sTxt = Trim(Right(sTxt, Len(sTxt) - InStr(sTxt, ":")))
ActiveSheet.TextBox1.Text = sTxt; dhPutValue()
End Sub
Kannst doch erstmal selbst probieren, wichtige stellen sind fett. Ich kann
leider nicht testen, verzichte somit auf Übersetzung :mrgreen:

Wenn dann noch Fehler kommen, haste es Kiffi schon mal etwas einfacher
gemacht und selbst schon was gelernt (und wenn es nur ist: so gehts nicht)

Gruß
Thomas

// Nachtrag:
Unerwartetes Posting von Peter macht meins überflüssig :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
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 »

Danke, das klappt beides prima unter Excel 2007. :allright:

Sorry, Thomas, ich habe Kiffis Variante genommen, da ich die
einzelnen Funktionen in jeweils eine eigene Procedure einschliessen kann.

Eure Tips sind Goldwert:wink: .
Nun steht unter Excel und Pb nichts mehr im Wege.


Danke vielmals :allright:

Grüße ..Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

ts-soft hat geschrieben:Unerwartetes Posting von Peter
unerwartet? :lol:

@Falko: Der Code, den Du da bei Herber gefunden hast, ist sehr seltsam.
Ich hoffe, ich trete niemanden zu nahe, wenn ich mal so behaupte, dass das
ziemlicher Bullsh*t ist.

Grüße ... Kiffi
a²+b²=mc²
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 »

Hier ist z.B. die Seite: http://www.herber.de

Wegen dem Zunahetreten, ich fühle mich nicht angesprochen :lol:

Das war auch nur ein Auszug aus der CHM, die ich mir mal geladen hatte und
unter Suche zu Kopf- und Fußzeilen habe ich nur den obigen VBA-Source
gefunden.

Ist aber interessant, wie man es in PB nutzen kann.
Vor allem, daß durch eure gute Kenntnisse Excel durch PB nutzbar ist. :allright:

Ich habe mir jetzt aus Deinen und ts-softs Beispielen eine Pbi erstellt, mit der man
nun Zellen sowie die Kopf- und Fußzeilen auslesen und schreiben
kann. Mit dem 'EnableExplicit' und dem Define muss ich mich im Bezug zu
Proceduren und interne Variablendeclarierung noch anfreunden :wink:

Grüße ..Falko :allright:
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 »

Ich hab hier nochmal dank ts-soft und kiffis Hilfe hier einen zusammen-
gefassten Demosource erstellt.

Vielleicht besteht Interesse für eine Zukünftige PB-Lib zum nachträglichen
Bearbeiten von Exceltabellen.

Beispiel: 1600Dateien, welche in der Fußzeile geändert werden müßen,
wäre von Hand in Excel doch sehr mühselig :mrgreen:

Ok, dazu müßte das Quitt ohne eine Speicheranforderung von Excel kommen.

Gruß Falko

[Edit] Source korrigiert und das Quitt ohne Speicheraufforderung von
Excel funktioniert jetzt auch
[/Edit]

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
Zuletzt geändert von Falko am 03.07.2007 23:52, insgesamt 3-mal geändert.
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Leider kleiner Denkfehler :wink:
ProcedureReturn verläßt die Procedure umgehend

Code: Alles auswählen

Procedure.s ReadRightFooter()
  Shared ReturnValue.l,ExcelApp.l
  dhGetValue("%T", @ReturnValue, ExcelApp, ".ActiveSheet.PageSetup.RightFooter")
  If ReturnValue
    ProcedureReturn PeekS(ReturnValue)
    dhFreeString(ReturnValue)
  Else
    ProcedureReturn "0"
  EndIf
EndProcedure 
dhFreeString wird im Erfolgsfalle nie ausgeführt, Du mußt also eine Return-
Variable nutzen, wo Du den String zwischenspeicherst!

Anstatt shared würde ich lieber einen Parameter nutzen (für das object),
und ReturnValue protected setzen!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
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 »

Meinst du das in etwas so?

Code: Alles auswählen

Procedure.s ReadLeftHeader()
Shared ExcelApp.l
Protected ReturnValue.l
  dhGetValue("%T", @ReturnValue, ExcelApp, ".ActiveSheet.PageSetup.LeftHeader")
  If ReturnValue
    Resume=PeekS(ReturnValue)
    dhFreeString(ReturnValue)
  Else
    Resume="0"
    dhFreeString(ReturnValue)
  EndIf
  ProcedureReturn Resume
EndProcedure
Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Falko hat geschrieben:Hier ist z.B. die Seite: http://www.herber.de
joh, kenne ich schon etwas länger. Hat mich nur gewundert, dass es da
solche Codes gibt. Bis jetzt hat man mir dort immer kompetent helfen
können, so dass ich davon ausgegangen bin, dass die Codes dort ein
gewisses Maß an Qualität aufweisen. Wird wohl 'n noch nicht kontrollierter
Ausreißer sein. ;-)

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Falko hat geschrieben:Meinst du das in etwas so?

Code: Alles auswählen

Procedure.s ReadLeftHeader()
Shared ExcelApp.l
Protected ReturnValue.l
  dhGetValue("%T", @ReturnValue, ExcelApp, ".ActiveSheet.PageSetup.LeftHeader")
  If ReturnValue
    Resume=PeekS(ReturnValue)
    dhFreeString(ReturnValue)
  Else
    Resume="0"
    dhFreeString(ReturnValue)
  EndIf
  ProcedureReturn Resume
EndProcedure
Gruß Falko
Ja, so ist es korrekt, aber etwas kürzer:

Code: Alles auswählen

Procedure.s ReadLeftHeader()
  Shared ExcelApp.l
  Protected ReturnValue.l, Resume.s
  dhGetValue("%T", @ReturnValue, ExcelApp, ".ActiveSheet.PageSetup.LeftHeader")
  If ReturnValue
    Resume=PeekS(ReturnValue)
    dhFreeString(ReturnValue)
    ProcedureReturn Resume
  EndIf
EndProcedure
finde ich schöner :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten