Reply
 
LinkBack Thread Tools Search this Thread Display Modes
  #1   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 5
Default 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   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 4,391
Default 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   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 5
Default 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   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 4,391
Default 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   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 5
Default 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   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 5
Default 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   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 415
Default 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   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 1
Default 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
Search this Thread:

Advanced Search
Display Modes

Posting Rules

Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On


Similar Threads
Thread Thread Starter Forum Replies Last Post
Passing a .NET DataSet object to Excel to be used with VBA Teddy Sohnrey Excel Programming 0 August 17th 06 12:07 PM
Passing a Label object to another procedure derobin Excel Programming 1 August 16th 06 10:43 AM
Error 424 Object Required when passing range as parameter carrick Excel Programming 2 June 29th 06 11:05 PM
passing an object mark Excel Programming 2 May 22nd 06 04:37 PM
Passing a named range to a chart/series object CraigBarton Excel Programming 0 May 24th 04 03:45 AM


All times are GMT +1. The time now is 04:19 PM.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright ©2004-2024 ExcelBanter.
The comments are property of their posters.
 

About Us

"It's about Microsoft Excel"