Home |
Search |
Today's Posts |
#1
Posted to microsoft.public.excel.programming
|
|||
|
|||
Passing an Excel Range object to C++ DLL
Hello,
I want to pass an excel selection to a C++ dll in order to get a result an display it in a cell. I could allready do it by copying the content of the Range object into a Double array that is passed by reference to the dll. Now I would like to avoid the copy, and pass the Range object by reference to the C++ dll. Is there a corresponding C++ type (and associated utility functions) for maniuplating the Range object? Any link to detailed documentation/example would be appreciated (I do know really few concerning COM). Thanks in advance Martin |
#2
Posted to microsoft.public.excel.programming
|
|||
|
|||
Passing an Excel Range object to C++ DLL
Martin,
You can call Windows API functions directly from the worksheet, so make your VBA Declare statement something similar. So it would be a standard DLL, not ActiveX. Need to be able to handle Unicode, or at least calling the APIs this way needs the W version not the A version. NickHK "Martin" wrote in message oups.com... Hello, I want to pass an excel selection to a C++ dll in order to get a result an display it in a cell. I could allready do it by copying the content of the Range object into a Double array that is passed by reference to the dll. Now I would like to avoid the copy, and pass the Range object by reference to the C++ dll. Is there a corresponding C++ type (and associated utility functions) for maniuplating the Range object? Any link to detailed documentation/example would be appreciated (I do know really few concerning COM). Thanks in advance Martin |
#3
Posted to microsoft.public.excel.programming
|
|||
|
|||
Passing an Excel Range object to C++ DLL
Hello Nick,
Thanks for replying! I actually allready have the VBA functions that call the C++. I'm binding C++ to VBA with the following statment: Private Declare Sub alterMatrix Lib "TheDLL.dll" Alias "_alter_matrix@12" (ByRef dTab As Double, ByVal lines As Long, ByVal col As Long) And my macro is using it this way: Private Function ModifyDataset(ByRef theCells As Range) Dim dataset() As Double ' Get range dimension nCol = theCells.Columns.Count nRow = theCells.Rows.Count ' Transform the range object into a dataset ReDim dataset(nRow - 1, nCol - 1) ' ????????????????? For r = 0 To nRow - 1 For c = 0 To nCol - 1 ' Check datatype cellVal = theCells(r + 1, c + 1).Value Select Case VarType(cellVal) Case Is = vbInteger dataset(r, c) = CDbl(cellVal) Case Is = vbLong dataset(r, c) = CDbl(cellVal) Case Is = vbSingle dataset(r, c) = CDbl(cellVal) Case Is = vbDouble dataset(r, c) = CDbl(cellVal) Case Else MsgBox "The field " & r + 1 & "," & c + 1 & " contains non numeric data: " & cellVal dataset(r, c) = 0 End Select Next Next ' Call the DLL alterMatrix dataset(0, 0), nRow, nCol ' Get the data back For r = 0 To nRow - 1 For c = 0 To nCol - 1 theCells(r + 1, c + 1).Value = dataset(r, c) Next Next End Function As you may notice, I copy the Range object content (the selected cells) into an array of double. It works perfectly for my C lib that simply consider it as a double*. I also made tests that allow to pass strings, integers to my dll. I now would like to pass the RANGE object, and read it in the C dll in order to avoid copying data... Any advice? I'm trying to read some documentation concerning OLE, but it's lot of readings for a single object information! Martin NickHK wrote: Martin, You can call Windows API functions directly from the worksheet, so make your VBA Declare statement something similar. So it would be a standard DLL, not ActiveX. Need to be able to handle Unicode, or at least calling the APIs this way needs the W version not the A version. NickHK "Martin" wrote in message oups.com... Hello, I want to pass an excel selection to a C++ dll in order to get a result an display it in a cell. I could allready do it by copying the content of the Range object into a Double array that is passed by reference to the dll. Now I would like to avoid the copy, and pass the Range object by reference to the C++ dll. Is there a corresponding C++ type (and associated utility functions) for maniuplating the Range object? Any link to detailed documentation/example would be appreciated (I do know really few concerning COM). Thanks in advance Martin |
#4
Posted to microsoft.public.excel.programming
|
|||
|
|||
Passing an Excel Range object to C++ DLL
Martin,
I don't use C++, but.. I assume your DLL does not have a reference to the Excel library. Hence it has no idea what a Range object and no way to access the values. So it would seem easiest to pass an array of values, either as you are doing or a variant (Set varArray=theCells ) if your DLL can accept that. However, what happens if you pass a range to the DLL that is expecting a variant or an array ? Do you get automatic conversion of the range to an array of value ? But if you are going to check for valid numeric data in VBA, before passing to the DLL, do you need to change it anyway ? NickHK "Martin" wrote in message oups.com... Hello Nick, Thanks for replying! I actually allready have the VBA functions that call the C++. I'm binding C++ to VBA with the following statment: Private Declare Sub alterMatrix Lib "TheDLL.dll" Alias "_alter_matrix@12" (ByRef dTab As Double, ByVal lines As Long, ByVal col As Long) And my macro is using it this way: Private Function ModifyDataset(ByRef theCells As Range) Dim dataset() As Double ' Get range dimension nCol = theCells.Columns.Count nRow = theCells.Rows.Count ' Transform the range object into a dataset ReDim dataset(nRow - 1, nCol - 1) ' ????????????????? For r = 0 To nRow - 1 For c = 0 To nCol - 1 ' Check datatype cellVal = theCells(r + 1, c + 1).Value Select Case VarType(cellVal) Case Is = vbInteger dataset(r, c) = CDbl(cellVal) Case Is = vbLong dataset(r, c) = CDbl(cellVal) Case Is = vbSingle dataset(r, c) = CDbl(cellVal) Case Is = vbDouble dataset(r, c) = CDbl(cellVal) Case Else MsgBox "The field " & r + 1 & "," & c + 1 & " contains non numeric data: " & cellVal dataset(r, c) = 0 End Select Next Next ' Call the DLL alterMatrix dataset(0, 0), nRow, nCol ' Get the data back For r = 0 To nRow - 1 For c = 0 To nCol - 1 theCells(r + 1, c + 1).Value = dataset(r, c) Next Next End Function As you may notice, I copy the Range object content (the selected cells) into an array of double. It works perfectly for my C lib that simply consider it as a double*. I also made tests that allow to pass strings, integers to my dll. I now would like to pass the RANGE object, and read it in the C dll in order to avoid copying data... Any advice? I'm trying to read some documentation concerning OLE, but it's lot of readings for a single object information! Martin NickHK wrote: Martin, You can call Windows API functions directly from the worksheet, so make your VBA Declare statement something similar. So it would be a standard DLL, not ActiveX. Need to be able to handle Unicode, or at least calling the APIs this way needs the W version not the A version. NickHK "Martin" wrote in message oups.com... Hello, I want to pass an excel selection to a C++ dll in order to get a result an display it in a cell. I could allready do it by copying the content of the Range object into a Double array that is passed by reference to the dll. Now I would like to avoid the copy, and pass the Range object by reference to the C++ dll. Is there a corresponding C++ type (and associated utility functions) for maniuplating the Range object? Any link to detailed documentation/example would be appreciated (I do know really few concerning COM). Thanks in advance Martin |
#5
Posted to microsoft.public.excel.programming
|
|||
|
|||
Passing an Excel Range object to C++ DLL
NickHK wrote:
Martin, I don't use C++, but.. I assume your DLL does not have a reference to the Excel library. Hence it has no idea what a Range object and no way to access the values. So it would seem easiest to pass an array of values, either as you are doing or a variant (Set varArray=theCells ) if your DLL can accept that. I know it's easier, since this works :) My goal is to minimize COPY of data. I thus would like to know which Lib, functions, and object I should use to directly control the Range content. However, what happens if you pass a range to the DLL that is expecting a variant or an array ? Do you get automatic conversion of the range to an array of value ? There are no automatic stuffs with c++ :) But if you are going to check for valid numeric data in VBA, before passing to the DLL, do you need to change it anyway ? Don't get what you mean!? If there are non numeric values, I display an error message before calling the DLL. NickHK "Martin" wrote in message oups.com... Hello Nick, Thanks for replying! I actually allready have the VBA functions that call the C++. I'm binding C++ to VBA with the following statment: Private Declare Sub alterMatrix Lib "TheDLL.dll" Alias "_alter_matrix@12" (ByRef dTab As Double, ByVal lines As Long, ByVal col As Long) And my macro is using it this way: Private Function ModifyDataset(ByRef theCells As Range) Dim dataset() As Double ' Get range dimension nCol = theCells.Columns.Count nRow = theCells.Rows.Count ' Transform the range object into a dataset ReDim dataset(nRow - 1, nCol - 1) ' ????????????????? For r = 0 To nRow - 1 For c = 0 To nCol - 1 ' Check datatype cellVal = theCells(r + 1, c + 1).Value Select Case VarType(cellVal) Case Is = vbInteger dataset(r, c) = CDbl(cellVal) Case Is = vbLong dataset(r, c) = CDbl(cellVal) Case Is = vbSingle dataset(r, c) = CDbl(cellVal) Case Is = vbDouble dataset(r, c) = CDbl(cellVal) Case Else MsgBox "The field " & r + 1 & "," & c + 1 & " contains non numeric data: " & cellVal dataset(r, c) = 0 End Select Next Next ' Call the DLL alterMatrix dataset(0, 0), nRow, nCol ' Get the data back For r = 0 To nRow - 1 For c = 0 To nCol - 1 theCells(r + 1, c + 1).Value = dataset(r, c) Next Next End Function As you may notice, I copy the Range object content (the selected cells) into an array of double. It works perfectly for my C lib that simply consider it as a double*. I also made tests that allow to pass strings, integers to my dll. I now would like to pass the RANGE object, and read it in the C dll in order to avoid copying data... Any advice? I'm trying to read some documentation concerning OLE, but it's lot of readings for a single object information! Martin NickHK wrote: Martin, You can call Windows API functions directly from the worksheet, so make your VBA Declare statement something similar. So it would be a standard DLL, not ActiveX. Need to be able to handle Unicode, or at least calling the APIs this way needs the W version not the A version. NickHK "Martin" wrote in message oups.com... Hello, I want to pass an excel selection to a C++ dll in order to get a result an display it in a cell. I could allready do it by copying the content of the Range object into a Double array that is passed by reference to the dll. Now I would like to avoid the copy, and pass the Range object by reference to the C++ dll. Is there a corresponding C++ type (and associated utility functions) for maniuplating the Range object? Any link to detailed documentation/example would be appreciated (I do know really few concerning COM). Thanks in advance Martin |
#6
Posted to microsoft.public.excel.programming
|
|||
|
|||
Passing an Excel Range object to C++ DLL
There seem to be solutions the
http://support.microsoft.com/kb/216686/ http://groups.google.fr/group/micros...dc1572914f7de8 Martin Martin wrote: NickHK wrote: Martin, I don't use C++, but.. I assume your DLL does not have a reference to the Excel library. Hence it has no idea what a Range object and no way to access the values. So it would seem easiest to pass an array of values, either as you are doing or a variant (Set varArray=theCells ) if your DLL can accept that. I know it's easier, since this works :) My goal is to minimize COPY of data. I thus would like to know which Lib, functions, and object I should use to directly control the Range content. However, what happens if you pass a range to the DLL that is expecting a variant or an array ? Do you get automatic conversion of the range to an array of value ? There are no automatic stuffs with c++ :) But if you are going to check for valid numeric data in VBA, before passing to the DLL, do you need to change it anyway ? Don't get what you mean!? If there are non numeric values, I display an error message before calling the DLL. NickHK "Martin" wrote in message oups.com... Hello Nick, Thanks for replying! I actually allready have the VBA functions that call the C++. I'm binding C++ to VBA with the following statment: Private Declare Sub alterMatrix Lib "TheDLL.dll" Alias "_alter_matrix@12" (ByRef dTab As Double, ByVal lines As Long, ByVal col As Long) And my macro is using it this way: Private Function ModifyDataset(ByRef theCells As Range) Dim dataset() As Double ' Get range dimension nCol = theCells.Columns.Count nRow = theCells.Rows.Count ' Transform the range object into a dataset ReDim dataset(nRow - 1, nCol - 1) ' ????????????????? For r = 0 To nRow - 1 For c = 0 To nCol - 1 ' Check datatype cellVal = theCells(r + 1, c + 1).Value Select Case VarType(cellVal) Case Is = vbInteger dataset(r, c) = CDbl(cellVal) Case Is = vbLong dataset(r, c) = CDbl(cellVal) Case Is = vbSingle dataset(r, c) = CDbl(cellVal) Case Is = vbDouble dataset(r, c) = CDbl(cellVal) Case Else MsgBox "The field " & r + 1 & "," & c + 1 & " contains non numeric data: " & cellVal dataset(r, c) = 0 End Select Next Next ' Call the DLL alterMatrix dataset(0, 0), nRow, nCol ' Get the data back For r = 0 To nRow - 1 For c = 0 To nCol - 1 theCells(r + 1, c + 1).Value = dataset(r, c) Next Next End Function As you may notice, I copy the Range object content (the selected cells) into an array of double. It works perfectly for my C lib that simply consider it as a double*. I also made tests that allow to pass strings, integers to my dll. I now would like to pass the RANGE object, and read it in the C dll in order to avoid copying data... Any advice? I'm trying to read some documentation concerning OLE, but it's lot of readings for a single object information! Martin NickHK wrote: Martin, You can call Windows API functions directly from the worksheet, so make your VBA Declare statement something similar. So it would be a standard DLL, not ActiveX. Need to be able to handle Unicode, or at least calling the APIs this way needs the W version not the A version. NickHK "Martin" wrote in message oups.com... Hello, I want to pass an excel selection to a C++ dll in order to get a result an display it in a cell. I could allready do it by copying the content of the Range object into a Double array that is passed by reference to the dll. Now I would like to avoid the copy, and pass the Range object by reference to the C++ dll. Is there a corresponding C++ type (and associated utility functions) for maniuplating the Range object? Any link to detailed documentation/example would be appreciated (I do know really few concerning COM). Thanks in advance Martin |
#7
Posted to microsoft.public.excel.programming
|
|||
|
|||
Passing an Excel Range object to C++ DLL
Martin,
From my limited knowledge, it seems that you DLL needs reference to Excel, so then passing a range would not be a problem. But I thought you were trying to avoid that. NickHK "Martin" egroups.com... There seem to be solutions the http://support.microsoft.com/kb/216686/ http://groups.google.fr/group/micros...dc1572914f7de8 Martin Martin wrote: NickHK wrote: Martin, I don't use C++, but.. I assume your DLL does not have a reference to the Excel library. Hence it has no idea what a Range object and no way to access the values. So it would seem easiest to pass an array of values, either as you are doing or a variant (Set varArray=theCells ) if your DLL can accept that. I know it's easier, since this works :) My goal is to minimize COPY of data. I thus would like to know which Lib, functions, and object I should use to directly control the Range content. However, what happens if you pass a range to the DLL that is expecting a variant or an array ? Do you get automatic conversion of the range to an array of value ? There are no automatic stuffs with c++ :) But if you are going to check for valid numeric data in VBA, before passing to the DLL, do you need to change it anyway ? Don't get what you mean!? If there are non numeric values, I display an error message before calling the DLL. NickHK "Martin" wrote in message oups.com... Hello Nick, Thanks for replying! I actually allready have the VBA functions that call the C++. I'm binding C++ to VBA with the following statment: Private Declare Sub alterMatrix Lib "TheDLL.dll" Alias "_alter_matrix@12" (ByRef dTab As Double, ByVal lines As Long, ByVal col As Long) And my macro is using it this way: Private Function ModifyDataset(ByRef theCells As Range) Dim dataset() As Double ' Get range dimension nCol = theCells.Columns.Count nRow = theCells.Rows.Count ' Transform the range object into a dataset ReDim dataset(nRow - 1, nCol - 1) ' ????????????????? For r = 0 To nRow - 1 For c = 0 To nCol - 1 ' Check datatype cellVal = theCells(r + 1, c + 1).Value Select Case VarType(cellVal) Case Is = vbInteger dataset(r, c) = CDbl(cellVal) Case Is = vbLong dataset(r, c) = CDbl(cellVal) Case Is = vbSingle dataset(r, c) = CDbl(cellVal) Case Is = vbDouble dataset(r, c) = CDbl(cellVal) Case Else MsgBox "The field " & r + 1 & "," & c + 1 & " contains non numeric data: " & cellVal dataset(r, c) = 0 End Select Next Next ' Call the DLL alterMatrix dataset(0, 0), nRow, nCol ' Get the data back For r = 0 To nRow - 1 For c = 0 To nCol - 1 theCells(r + 1, c + 1).Value = dataset(r, c) Next Next End Function As you may notice, I copy the Range object content (the selected cells) into an array of double. It works perfectly for my C lib that simply consider it as a double*. I also made tests that allow to pass strings, integers to my dll. I now would like to pass the RANGE object, and read it in the C dll in order to avoid copying data... Any advice? I'm trying to read some documentation concerning OLE, but it's lot of readings for a single object information! Martin NickHK wrote: Martin, You can call Windows API functions directly from the worksheet, so make your VBA Declare statement something similar. So it would be a standard DLL, not ActiveX. Need to be able to handle Unicode, or at least calling the APIs this way needs the W version not the A version. NickHK "Martin" wrote in message oups.com... Hello, I want to pass an excel selection to a C++ dll in order to get a result an display it in a cell. I could allready do it by copying the content of the Range object into a Double array that is passed by reference to the dll. Now I would like to avoid the copy, and pass the Range object by reference to the C++ dll. Is there a corresponding C++ type (and associated utility functions) for maniuplating the Range object? Any link to detailed documentation/example would be appreciated (I do know really few concerning COM). Thanks in advance Martin |
#8
Posted to microsoft.public.excel.programming
|
|||
|
|||
Passing an Excel Range object to C++ DLL
The easiest way to do this is to use RapidXLL_NET. You can then write native C / C++ library automatically interface it with both Excel and ..NET with a one liner. This tool uses the Excel C/C++ API. It is very fast and works around a union object called an XLOPPER. The original api was created for Excel 95 and has been upgraded a couple of times (newest update for 2007) but has ALWAYS remained backward compatible. You can look for Excel SDK or Excel 95 Framework. Try it free at http://www.RapidXLL.net Sincerely, The RapidXLL Team Martin wrote: Hello, I want to pass an excel selection to a C++ dll in order to get a result an display it in a cell. I could allready do it by copying the content of the Range object into a Double array that is passed by reference to the dll. Now I would like to avoid the copy, and pass the Range object by reference to the C++ dll. Is there a corresponding C++ type (and associated utility functions) for maniuplating the Range object? Any link to detailed documentation/example would be appreciated (I do know really few concerning COM). Thanks in advance Martin |
Reply |
Thread Tools | Search this Thread |
Display Modes | |
|
|
Similar Threads | ||||
Thread | Forum | |||
Passing a .NET DataSet object to Excel to be used with VBA | Excel Programming | |||
Passing a Label object to another procedure | Excel Programming | |||
Error 424 Object Required when passing range as parameter | Excel Programming | |||
passing an object | Excel Programming | |||
Passing a named range to a chart/series object | Excel Programming |