ExcelBanter

ExcelBanter (https://www.excelbanter.com/)
-   Excel Programming (https://www.excelbanter.com/excel-programming/)
-   -   Returning Arrays, emulating standard function behavior (https://www.excelbanter.com/excel-programming/360693-returning-arrays-emulating-standard-function-behavior.html)

algorimancer

Returning Arrays, emulating standard function behavior
 
I'm developing an add-in for Excel (in C#) to provide vector (numeric,
not stl)
and quaternion functions within spreadsheets. Typical standard Excel
function behavior is such that, you select a cell where you'd like the
results of a function, press the "=" button, select the desired
function, select the cell range(s) needed by the function, click OK,
and the single result appears in the initially selected cell. I can
emulate this behavior with a function like:

//Returns magnitude of vector selected as Range
public double GetMagnitude(object Range)
{
Excel.Range rangeThis = Range as Excel.Range;

double dS = 0.0;
Object[,] arrayThis;
arrayThis = (Object[,])rangeThis.Value2;
//this is overkill, but handles vectors arranged as rows or
columns, or even matrices
for (int i = arrayThis.GetLowerBound(0); i <=
arrayThis.GetUpperBound(0); i++)
{
for (int j = arrayThis.GetLowerBound(1); j <=
arrayThis.GetUpperBound(1); j++)
{
dS += ((double)arrayThis[i, j]) *
((double)arrayThis[i, j]);
}
}
return Math.Sqrt(dS);
}

This works great. However, sometimes (mostly) the result of a vector
or quaternion operation is not a single scalar value, but an array of
values. I have tried returning an array of doubles, but all that shows
up in Excel is the first element of the array. For example, here's a
(pointless) function to return a given range, doubled:

public double[] DoubleCells(object Range)
{
Excel.Range rangeThis = Range as Excel.Range;

Object[,] arrayThis;
arrayThis = (Object[,])rangeThis.Value2;
double[] dResult = new double[rangeThis.Count];
int iIndex=0;
for (int i = arrayThis.GetLowerBound(0); i <=
arrayThis.GetUpperBound(0); i++)
{
for (int j = arrayThis.GetLowerBound(1); j <=
arrayThis.GetUpperBound(1); j++)
{
dResult[iIndex] = ((double)arrayThis[i, j]) * 2.0;
++iIndex;
}
}
return dResult;
}

Problem is, it just fills a single cell with the initial array value
upon return. Even if I select a range of cells to be filled with the
result, all that appears is the first element of the arrray.

I know that one possible solution would be to define a specific range
in the worksheet and write the resulting array into that range, but
this is very inflexible. I gather that it is feasible to do things
like offsets to a range, but I don't want the result in a fixed offset
to the input range, I want it to appear as an offset to the cell where
I pushed the "=" button.

Any helpful suggestions would be appreciated; I'm predominantly a
C++/OpenGL/numerics programmer, and am new to this Excel/C# stuff.
Thanks :)


Tim Williams

Returning Arrays, emulating standard function behavior
 
When testing, are you returning the results to a vertical or horizontal range?
I seem to recall it makes a difference...

--
Tim Williams
Palo Alto, CA


"algorimancer" wrote in message ups.com...
I'm developing an add-in for Excel (in C#) to provide vector (numeric,
not stl)
and quaternion functions within spreadsheets. Typical standard Excel
function behavior is such that, you select a cell where you'd like the
results of a function, press the "=" button, select the desired
function, select the cell range(s) needed by the function, click OK,
and the single result appears in the initially selected cell. I can
emulate this behavior with a function like:

//Returns magnitude of vector selected as Range
public double GetMagnitude(object Range)
{
Excel.Range rangeThis = Range as Excel.Range;

double dS = 0.0;
Object[,] arrayThis;
arrayThis = (Object[,])rangeThis.Value2;
//this is overkill, but handles vectors arranged as rows or
columns, or even matrices
for (int i = arrayThis.GetLowerBound(0); i <=
arrayThis.GetUpperBound(0); i++)
{
for (int j = arrayThis.GetLowerBound(1); j <=
arrayThis.GetUpperBound(1); j++)
{
dS += ((double)arrayThis[i, j]) *
((double)arrayThis[i, j]);
}
}
return Math.Sqrt(dS);
}

This works great. However, sometimes (mostly) the result of a vector
or quaternion operation is not a single scalar value, but an array of
values. I have tried returning an array of doubles, but all that shows
up in Excel is the first element of the array. For example, here's a
(pointless) function to return a given range, doubled:

public double[] DoubleCells(object Range)
{
Excel.Range rangeThis = Range as Excel.Range;

Object[,] arrayThis;
arrayThis = (Object[,])rangeThis.Value2;
double[] dResult = new double[rangeThis.Count];
int iIndex=0;
for (int i = arrayThis.GetLowerBound(0); i <=
arrayThis.GetUpperBound(0); i++)
{
for (int j = arrayThis.GetLowerBound(1); j <=
arrayThis.GetUpperBound(1); j++)
{
dResult[iIndex] = ((double)arrayThis[i, j]) * 2.0;
++iIndex;
}
}
return dResult;
}

Problem is, it just fills a single cell with the initial array value
upon return. Even if I select a range of cells to be filled with the
result, all that appears is the first element of the arrray.

I know that one possible solution would be to define a specific range
in the worksheet and write the resulting array into that range, but
this is very inflexible. I gather that it is feasible to do things
like offsets to a range, but I don't want the result in a fixed offset
to the input range, I want it to appear as an offset to the cell where
I pushed the "=" button.

Any helpful suggestions would be appreciated; I'm predominantly a
C++/OpenGL/numerics programmer, and am new to this Excel/C# stuff.
Thanks :)




algorimancer

Returning Arrays, emulating standard function behavior
 
I've tried it both ways. Neither works.


Randy Harmelink

Returning Arrays, emulating standard function behavior
 
Even if I select a range of cells to be filled with the result, all that appears is the first element of the arrray. <<

Just to clarify -- you are array-entering the formula, right? That is,
using Ctrl-Shift-Enter instead of just Enter.


algorimancer

Returning Arrays, emulating standard function behavior
 
Yes.


Tim Williams

Returning Arrays, emulating standard function behavior
 
Yes what?

Please *quote* what you're replying to. Not everyone is using web "forums" to view this newsgroup, and it gets tedious having to
switch back and forth between views to see what non-quoting post are referring to.

--
Tim Williams
Palo Alto, CA


"algorimancer" wrote in message ups.com...
Yes.




algorimancer

Returning Arrays, emulating standard function behavior
 
Uh, sir? ;) Sorry about that, and anyway I was incorrect.

You had asked,

Quote...
Even if I select a range of cells to be filled with the result, all that appears is the first element of the arrray. <<


Just to clarify -- you are array-entering the formula, right? That is,
using Ctrl-Shift-Enter instead of just Enter.
....Quote

And the correct answer is, no, I'd never heard of using
Ctrl-Shift-Enter in Excel. After trying it (it was also suggested by
Stephen Bullen in the ms.p.vsnet.vstools.office group), that seems to
have solved that part of the problem. Thank you :)



All times are GMT +1. The time now is 12:25 PM.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
ExcelBanter.com