ExcelBanter

ExcelBanter (https://www.excelbanter.com/)
-   Excel Programming (https://www.excelbanter.com/excel-programming/)
-   -   Calculation order (https://www.excelbanter.com/excel-programming/388732-calculation-order.html)

Ron Rosenfeld

Calculation order
 
I just came across something interesting, and wonder if someone can point me to
a discussion.

I noted with regard to a UDF I have to convert Roman to Arabic numerals, that
the function call seems to affect the worksheet calculation order.

The original function call was:

Function Arabic (rg as range) as Long


With this call, given the following:

A1: some arabic number
A2: =ROMAN(A1)

A3: =Arabic(A2)

A3 appeared to calculate first. So that making a change in A1 would result in
A3 showing the number that was PREVIOUSLY in A1 instead of the current number.

Moving the cells around did not make a difference.

What did make a difference was eliminating the Type specification (or changing
the type specification to Variant) for the variable in the function call:

Function Arabic (rg) as Long

or

Function Arabic (rg as variant) as long

--ron

Norman Jones

Calculation order
 
Hi Ron.

See the discussion by Charles Williams at:

Excel's Calculation Process
http://www.decisionmodels.com/calcsecretsc.htm


---
Regards,
Norman


"Ron Rosenfeld" wrote in message
...
I just came across something interesting, and wonder if someone can point
me to
a discussion.

I noted with regard to a UDF I have to convert Roman to Arabic numerals,
that
the function call seems to affect the worksheet calculation order.

The original function call was:

Function Arabic (rg as range) as Long


With this call, given the following:

A1: some arabic number
A2: =ROMAN(A1)

A3: =Arabic(A2)

A3 appeared to calculate first. So that making a change in A1 would
result in
A3 showing the number that was PREVIOUSLY in A1 instead of the current
number.

Moving the cells around did not make a difference.

What did make a difference was eliminating the Type specification (or
changing
the type specification to Variant) for the variable in the function call:

Function Arabic (rg) as Long

or

Function Arabic (rg as variant) as long

--ron




Gary''s Student

Calculation order
 
With regard to your Arabic function:

1. Dim rg as Range in the Header
2. Use rg.Value in place of rg.Text
3. insert Application.Volatile near the top
--
Gary''s Student - gsnu200718


"Ron Rosenfeld" wrote:

I just came across something interesting, and wonder if someone can point me to
a discussion.

I noted with regard to a UDF I have to convert Roman to Arabic numerals, that
the function call seems to affect the worksheet calculation order.

The original function call was:

Function Arabic (rg as range) as Long


With this call, given the following:

A1: some arabic number
A2: =ROMAN(A1)

A3: =Arabic(A2)

A3 appeared to calculate first. So that making a change in A1 would result in
A3 showing the number that was PREVIOUSLY in A1 instead of the current number.

Moving the cells around did not make a difference.

What did make a difference was eliminating the Type specification (or changing
the type specification to Variant) for the variable in the function call:

Function Arabic (rg) as Long

or

Function Arabic (rg as variant) as long

--ron


Ron Rosenfeld

Calculation order
 
On Fri, 4 May 2007 13:08:50 +0100, "Norman Jones"
wrote:

Hi Ron.

See the discussion by Charles Williams at:

Excel's Calculation Process
http://www.decisionmodels.com/calcsecretsc.htm


---
Regards,
Norman



Norman,

Thanks for that reference.

It is useful, but I was not able to find the explanation for what I am seeing.

He notes that there is a problem with a UDF not calculating if the precedent
cell is not referred to in the Function argument. However, in my instance, it
seems to be referred to in both types of function calls:

Function Arabic (rg as range) as Long

or

Function Arabic (rg) as Long

or (equivalent)

Function Arabic (rg as Variant) as Long.

Yet the first calculates before "rg" has recalculated, and the latter
calculates after "rg" has calculated.

Within the function, rg seems to be returning a range object in both instances.
--ron

Ron Rosenfeld

Calculation order
 
On Fri, 4 May 2007 13:08:50 +0100, "Norman Jones"
wrote:

Hi Ron.

See the discussion by Charles Williams at:

Excel's Calculation Process
http://www.decisionmodels.com/calcsecretsc.htm


---
Regards,
Norman



Hmmm,

Trying out Gary's S suggestion, which works, it seems what is happening is
that, for some reason, if I use rg.text within the UDF, it screws up the
dependency tree. Whereas if I use rg.value (or just rg) within the UDF, it
does not.

Strange.
--ron

Ron Rosenfeld

Calculation order
 
On Fri, 4 May 2007 05:31:01 -0700, Gary''s Student
wrote:

With regard to your Arabic function:

1. Dim rg as Range in the Header
2. Use rg.Value in place of rg.Text
3. insert Application.Volatile near the top
--
Gary''s Student - gsnu200718



Thanks for that. Adds some insight into the issue.

Application.Volatile does not seem to be required.

For some reason, using rg.text within the UDF, with (rg as range) in the
header, screws up the dependency tree.

Either using rg as variant (or just rg) in the header; or using rg.value within
the UDF, does not screw up the dependency tree.

This seems like Odd behavior.
--ron

Norman Jones

Calculation order
 
Hi Ron,

'------------------
Hmmm,

Trying out Gary's S suggestion, which works, it seems what is happening is
that, for some reason, if I use rg.text within the UDF, it screws up the
dependency tree. Whereas if I use rg.value (or just rg) within the UDF, it
does not.

Strange.
'------------------

In Charles W's discussion of UDF's, did you see
his comments on the use of cell properties other than .
value or .formula?

See:

Referencing cell formatting properties
http://www.decisionmodels.com/calcsecretsj.htm

---
Regards,
Norman



Ron Rosenfeld

Calculation order
 
On Fri, 4 May 2007 14:22:38 +0100, "Norman Jones"
wrote:

Hi Ron,

'------------------
Hmmm,

Trying out Gary's S suggestion, which works, it seems what is happening is
that, for some reason, if I use rg.text within the UDF, it screws up the
dependency tree. Whereas if I use rg.value (or just rg) within the UDF, it
does not.

Strange.
'------------------

In Charles W's discussion of UDF's, did you see
his comments on the use of cell properties other than .
value or .formula?

See:

Referencing cell formatting properties
http://www.decisionmodels.com/calcsecretsj.htm

---
Regards,
Norman


Here's what I saw and, when I read it, I didn't think it was applicable.

-----------------------------------------------
Referencing cell formatting properties

If your UDF references cell properties other than .value or .formula
(ie .Bold) there are some occasions when these properties may be undefined when
your UDF is evaluated. One such occasion is renaming a worksheet in automatic
mode. If this happens you may need to explicitly recalculate your function.
--------------------------------------------

The properties are not undefined. What is happening, according to my
experimentation (using breakpoints within the UDF), is that the UDF is being
calculated prior to the cell referenced in the Function declaration, and is not
recalculated after the precedent cell is calculated.

Within the UDF, changing rg.text to rg.value causes the function precedent cell
to be calculated first.


By the way, I sent a note to Charles W and I seemed to have piqued his
interest. He's planning to look into it.


--ron


All times are GMT +1. The time now is 07:32 AM.

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