ExcelFunktionen COMatePlus

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Lord
Beiträge: 313
Registriert: 21.01.2008 19:11

Re: ExcelFunktionen COMatePlus

Beitrag von Lord »

Hallo Falko!

Danke für Deine schnelle Antwort.
Es funktioniert auf Anhieb. :allright:

Ein riesengroßes "Danke schön" auch für die Bereitstellung
Deiner ExcelFunktionen für COMate. Ich kann diese jetzt
gerade sehr gut in einem kleinen privaten Programm ge-
brauchen.
Bild
Benutzeravatar
Falko
Admin
Beiträge: 3531
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.0
Kontaktdaten:

Re: ExcelFunktionen COMatePlus

Beitrag von Falko »

Das freut mich, das die Excelfunctionslib immer noch beliebt ist. :allright:

Da hier schon mal eine Frage war, wie man in Excel ein Bild aus dem Speicher
einfügen kann, habe ich noch was probiert. GetClipboardImage() eignet sich dafür ganz gut.
Aber auch für den xinclude etc. könnte man dann CatchImage() benutzen, um dann das Bild für
Excel in die Zwischenablage zu kopieren.

Folgende Funktion habe ich hinzugefügt:

Code: Alles auswählen

Procedure XLSFunc_PasteFromClipboard(ExcelObject.COMateObject,ImgNr,Width,Height,Prop=#msoFalse); This function put any Images from Clipboard. 
  If GetClipboardImage(ImgNr)
    ExcelObject\Invoke("ActiveSheet\Paste")
    ExcelObject\SetProperty("Selection\ShapeRange\LockAspectRatio = "+Str(Prop));msoTrue = Proportional
    ExcelObject\SetProperty("Selection\ShapeRange\Height="+Str(Height))
    ExcelObject\SetProperty("Selection\ShapeRange\Width="+Str(Width))
  Else
    MessageRequester("Achtung","Es liegt keine Bildkopie im Zwischenspeicher vor!")
  EndIf
EndProcedure

Kleiner Beispielssource hier, wobei man beachten muss, erst ein Bild in die Zwischenablage zu kopieren.
Erst dann wird das Bild in Excel mit einstellbarer Größe auch eingefügt bzw. angezeigt.

Code: Alles auswählen

XIncludeFile "ExcelFunktion.pbi"
;-Defines
Define NewExcelObject
Define CSIDL_DESKTOP
Define UserDesktop.s
Define Result.l
Define FFormat.l
Define Ext_xl.l
Define Extend.s
Define MyComment.s

Procedure.s GetSpecialFolder(CSIDL); Codeschnipsel from german Forum

  Protected *itemid.ITEMIDLIST
  Protected location.s = Space(#MAX_PATH)

  If SHGetSpecialFolderLocation_ (0, CSIDL, @*itemid) = #NOERROR
    If SHGetPathFromIDList_(*itemid, @location)
      CoTaskMemFree_(*itemid)
      If Right(location, 1) <> "\" : location + "\" : EndIf
      ProcedureReturn location
    EndIf
  EndIf

; Liste zu den Konstanten: http://msdn.microsoft.com/en-us/library/bb762494.aspx

EndProcedure
Result=MessageRequester("Bitte korrekt beantworten","Ist Dein Excel älter als Excel2007?", #PB_MessageRequester_YesNo )

If Result = #PB_MessageRequester_Yes
  Extend="xls"
  Ext_xl.l= #xlNormal
ElseIf Result = #PB_MessageRequester_No
  Extend="xlsx"
  Ext_xl.l= #xlOpenXMLWorkbook
EndIf
UserDesktop=GetSpecialFolder(CSIDL_DESKTOP)
CreateDirectory(UserDesktop+"ExcelProgramm")

NewExcelObject=XLSFunc_CreateExcelFile(UserDesktop+"ExcelProgramm"); Create a new Excelfile to this Path.
Debug COMate_GetLastErrorDescription()+"  XLSFunc_CreateExcelFile"
XLSFunc_ExcelVisible(NewExcelObject,#True); Nothing to see Excel
Debug COMate_GetLastErrorDescription()+"  XLSFunc_ExcelVisible"
XLSFunc_WriteCellS(NewExcelObject, 1,2, "Test1 Paste Bild")
Debug COMate_GetLastErrorDescription()+"  XLSFunc_WriteCellS"
XLSFunc_SelectCells(NewExcelObject, "C3")
Debug COMate_GetLastErrorDescription()+"  XLSFunc_SelectCells"
XLSFunc_PasteFromClipboard(NewExcelObject,0,100,100)
Debug COMate_GetLastErrorDescription()+"  XLSFunc_PasteMemImage"
XLSFunc_CloseWorkbook(NewExcelObject)
ClearClipboard()
Debug COMate_GetLastErrorDescription()+"  XLSFunc_CloseWorkbook"
XLSFunc_CloseExcelAll(NewExcelObject); End of Excel
Debug COMate_GetLastErrorDescription()+"  XLSFunc_CloseExcelAll"
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Benutzeravatar
Falko
Admin
Beiträge: 3531
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.0
Kontaktdaten:

Re: ExcelFunktionen COMatePlus

Beitrag von Falko »

Folgende Funktion für das Lesen von Kommentaren zur Verfügung gestellt von FrW

Code: Alles auswählen

Procedure.s XLSFunc_ReadCommentWithWorksheet(ExcelObject.COMateObject,Name.s,Zeile.l, Spalte.l)
 Protected ReturnValue.s
 ReturnValue=ExcelObject\GetStringProperty("Worksheets('"+Name+"')\Cells("+Str(Zeile)+","+Str(Spalte)+")\Comment\Text")
 ProcedureReturn ReturnValue
EndProcedure
Danke @FrW
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Lord
Beiträge: 313
Registriert: 21.01.2008 19:11

Re: ExcelFunktionen COMatePlus

Beitrag von Lord »

Hallo Falko!

Wie lassen sich in einer Tabelle z.B. die Spaltenköpfe
auf "read only" setzen, also schützen? Die restlichen
Zellen sollen weiterhin veränderbar sein.

Bespiel:

Code: Alles auswählen

Spalte 1  Spalte 2  Spalte 3  Spalte 4
Wert 1    Wert 2    Wert 3    Wert 4
Wert 5    Wert 6    Wert 7    Wert 8
Zellen Spalte 1 bis Spalte 5 -> geschützt
alle anderen Zellen -> edierbar

Läßt sich das mit COMate realisieren?
Bild
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ExcelFunktionen COMatePlus

Beitrag von Kiffi »

Lord hat geschrieben:Läßt sich das mit COMate realisieren?
prinzipiell ja. Ist aber nicht so intuitiv, wie man meinen sollte: http://www.office-loesung.de/ftopic269708_0_0_asc.php

Von diesem Vorgang kann man vielleicht ein Macro aufnehmen. Dieses muss dann nur noch in COMate-Syntax konvertiert werden.

Grüße ... Peter
Hygge
Lord
Beiträge: 313
Registriert: 21.01.2008 19:11

Re: ExcelFunktionen COMatePlus

Beitrag von Lord »

So sähe das Excel-Makro aus:

Code: Alles auswählen

Sub Makro1()
'
' Makro1 Makro
' Makro am 02.12.2015 aufgezeichnet
'
' Tastenkombination: Strg+s
'
    Columns("A:H").Select
    Selection.Locked = False
    Selection.FormulaHidden = False
    Range("A1:H1").Select
    Selection.Locked = True
    Selection.FormulaHidden = False
    Range("A1").Select
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub
Würde das bitte jemand nach COMate "übersetzen"?
Bild
Lord
Beiträge: 313
Registriert: 21.01.2008 19:11

Re: ExcelFunktionen COMatePlus

Beitrag von Lord »

So, der erste Teil des Makros läuft:

Code: Alles auswählen

  Range.s= "A:H"
  ExcelObject\Invoke("Range('" +Range+ "')\Select" )
  Debug "Set Range A:H: "+comate_getlasterrordescription()
  
  ExcelObject\setproperty("Selection\Locked = #False")
  Debug "Set Locked = #False: "+comate_getlasterrordescription()
  
  ExcelObject\setproperty("Selection\FormulaHidden = #False")
  Debug "Set FormulaHidden = #False: "+comate_getlasterrordescription()
  
  Range.s= "A1:H1"
  ExcelObject\Invoke("Range('" +Range+ "')\Select" )
  Debug "Set Range A1:H1: "+comate_getlasterrordescription()
  
  ExcelObject\setproperty("Selection\Locked = #True")
  Debug "Set Locked = #True: "+comate_getlasterrordescription()
  
  ExcelObject\setproperty("Selection\FormulaHidden = #False")
  Debug "Set FormulaHidden =#False: "+comate_getlasterrordescription()
  
  Range.s= "A1"
  ExcelObject\Invoke("Range('" +Range+ "')\Select" )
  Debug "Set Range A1: "+comate_getlasterrordescription()
Mir fehlt jetzt "nur" noch die letzte Zeile des Makros:

Code: Alles auswählen

ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Bin für jede Hilfestellung dankbar.
Bild
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ExcelFunktionen COMatePlus

Beitrag von Kiffi »

Lord hat geschrieben:Mir fehlt jetzt "nur" noch die letzte Zeile des Makros:

Code: Alles auswählen

ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Der Protect-Befehle hat eine Menge optionaler Parameter. IN VBA kann man Parameter direkt mit Namen angeben ("ParameterName:ParameterWert"), so dass man, wenn man beispielsweise nur 'AllowUsingPivotTables' setzen möchte, die vorigen Parameter nicht angeben muss.

Der komplette Aufruf sieht so aus (Excel-Hilfe):

Code: Alles auswählen

Ausdruck.Protect(Password, DrawingObjects, Contents, Scenarios, UserInterfaceOnly, AllowFormattingCells, AllowFormattingColumns, AllowFormattingRows, AllowInsertingColumns, AllowInsertingRows, AllowInsertingHyperlinks, AllowDeletingColumns, AllowDeletingRows, AllowSorting, AllowFiltering, AllowUsingPivotTables)
Jeder Parameter, den Du nicht angeben möchtest (oder kannst), wird in COMate mit #Optional oder #Opt angegeben.

Das wären dann bei Dir die Parameter: #Opt, #True, #True, #True (Password hast Du ja nicht angegeben).

Reicht das vorerst an Erklärung? Wenn nicht, nachfragen.

Grüße ... Peter
Hygge
Lord
Beiträge: 313
Registriert: 21.01.2008 19:11

Re: ExcelFunktionen COMatePlus

Beitrag von Lord »

Mit diesem Codeteil

Code: Alles auswählen

  Protected.COMateObject ActiveSheet
  ActiveSheet = ExcelObject\GetObjectProperty("ActiveSheet")
  Debug "ActiveSheet: "+comate_getlasterrordescription()
  If ActiveSheet
    ActiveSheet\setproperty("ActiveSheet\Protect Password=#Opt, DrawingObjects=#True, Contents=#True, Scenarios=#True"); mit und ohne Komma gleiches Ergebnis
    Debug "Protect: "+comate_getlasterrordescription()
    ActiveSheet\Release()
    Debug "Release: "+comate_getlasterrordescription()
  Else
    Debug "No ActiveSheet"    
  EndIf
erhalte ich diese Meldungen:
Debug hat geschrieben:ActiveSheet: Okay.
Active: 2313280
Protect: One or more arguments are invalid. Possibly a numerical overflow or too many nested objects, -if so, try splitting your method call into two or more subcalls.
Release: One or more arguments are invalid. Possibly a numerical overflow or too many nested objects, -if so, try splitting your method call into two or more subcalls.
Was ist falsch im COMate-Aufruf?
Bild
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ExcelFunktionen COMatePlus

Beitrag von Kiffi »

Lord hat geschrieben:Was ist falsch im COMate-Aufruf?
ich kann das jetzt hier nicht ausprobieren, aber COMate unterstützt keine Parameternamen (genau aus diesem Grund gibt es den #Opt - Parameterwert). Deshalb sollte das hier:
Lord hat geschrieben:

Code: Alles auswählen

ActiveSheet\setproperty("ActiveSheet\Protect Password=#Opt, DrawingObjects=#True, Contents=#True, Scenarios=#True")
... eher so aussehen:

Code: Alles auswählen

ActiveSheet\setproperty("ActiveSheet\Protect #Opt, #True, #True, #True")
Allerdings scheint mir Protect eher ein auszuführender Befehl zu sein. Folglich:

Code: Alles auswählen

ActiveSheet\Invoke("ActiveSheet\Protect(#Opt, #True, #True, #True)")
Grüße ... Peter
Hygge
Antworten