Home |
Search |
Today's Posts |
#1
Posted to microsoft.public.excel.programming
|
|||
|
|||
[Excel][DLL] Writing a DLL custom function for Excel with Delphi
Hi,
Sorry for my language... Here are results about my searches (Win98SE, Excel 2000, Delphi 5): 1. ----------------------------------------------------------- * Creating an VBA-Excel Custom function which calls the DLL : The purpose is to convert the Range-Type parameters to arrays of Variant to : - get faster access, - allocate memory for the result, - give this parameters ti the DLL function. a) +++++++++ VBA : Declare Function DLL_Matrix_Evolutions Lib "ExcelProd_Functions.dll" _ (ByRef avHeader As Variant, ByRef avTable As Variant, _ ByRef avDeparts As Variant, ByRef avResults As Variant) As Boolean Function Matrix_Evolutions( arHeader As Range, arTable As Range, _ arDeparts As Range) As Variant Dim laHeader() As Variant, laTable() As Variant, Dim laDeparts() As Variant Dim liLoRow&, liHiRow, i& laHeader = arHeader 'Copy to variant to get faster access laTable = arTable laDeparts = arDeparts liLoRow = LBound(laTable) liHiRow = UBound(laTable) ReDim laResults(liLoRow To liHiRow, 1 To 2) DLL_Matrix_Evolutions laHeader, laTable, laDeparts, laResults Matrix_Evolutions = laResults End Function b) +++++++++ Delphi : function DLL_Matrix_Evolutions( var avHeader : OleVariant; var avTable : OleVariant; var avDeparts: OleVariant; var avResults : OleVariant): Boolean; stdcall; var liLoRow, liHiRow, liRow : Integer; begin liLoRow:= VarArrayLowBound( avTable, 1); liHiRow:= VarArrayHighBound( avTable, 1); for liRow := liLoRow to liHiRow do avResults[ liRow, 1]:= liRow + liHiRow/100000; Result:= true; end; 2. ----------------------------------------------------------- * Creating and calling directly a DLL custom function a) +++++++++ VBA : Declare Function DLL_Evolutions Lib "ExcelProd_Functions.dll" _ (ByRef avHeader As Variant, ByRef avTable As Variant, _ ByRef avDeparts As Variant) As Variant b) +++++++++ Delphi : function DLL_Evolutions( var avHeader : OleVariant; var avTable : OleVariant; var avDeparts: OleVariant) : OleVariant; stdcall; var liCols, liRows, i, j: Integer; lvValue: OleVariant; lsStr: String; begin liCols:= 2; liRows:= avTable.Rows.Count; result:= VarArrayCreate( [1, liRows, 1, liCols], varVariant); for i:= 1 to liCols do for j:= 1 to liRows do begin lvValue:= avTable.Cells.Item[ j, 1].Value; lsStr:= lvValue; lsStr:= IntToStr( j) + '.' + IntToStr( i) + ':'+ lsStr; result[ j, i]:= lsStr; end; end; It runs ! c) +++++++++ The problem and question : How does work memory management ? Is the 'result'-variable created by VarArrayCreate freed by Delphi or by Excel or by ??? Thank you for your help. -- ** Anti-Spam : ajouter [usenet] dans l'objet pour ne pas être rejeté. Cordialement, Stéphane *** http://www.team-santonum.com Loisirs, nature, arts, technologie : accueil en Charente-Maritime |
Reply |
Thread Tools | Search this Thread |
Display Modes | |
|
|
Similar Threads | ||||
Thread | Forum | |||
#VALUE! error with custom excel vba function | Excel Discussion (Misc queries) | |||
Excel custom function dialog | Excel Worksheet Functions | |||
Automation with Delphi | Excel Programming | |||
Adding a custom function to the default excel function list | Excel Programming | |||
Excel Custom Function with Select Case | Excel Programming |