Reply
 
LinkBack Thread Tools Search this Thread Display Modes
  #1   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 41
Default UDF + range object and Offset formula to Value problem

I haven't encountered this one befo

I have just build a UDF which counts cells according to certain criteria
(for other reasons, I want to keep it as a UDF and not put the whole formula
into a cell - which I know how to do.)

Here is the relevant code:
Function DoTheCount(rng as range) as integer

Dim iCol As Integer
Dim aData As Variant

iCol = CInt(rCol.Text)
'rCol is a range object brought in as a parameter. rCol refers to a cell
that itself
'contains a formula =OFFSET(F$91,$R15,0)
' which yields a value, e.g. 37 (which is the column number I want)

Set ws = Worksheets(sht)
'sht is the worksheet I want, e.g. "sheet1"

With ws.Range("A10")
Set rng = Range(.Offset(0, iCol - 1), .Offset(nRows - 1, iCol - 1))
End With

varrayData = rng

'other stuff happens here

DoTheCount = ianswer

End Function
I have two problems:
1. If I try to use rCol.Value (which refers to a cell with an offset
formula), I get '0'
The only way to get the value I want is to use rCol.Text, which will give
me the correct value '37" which I convert to an integer.

2. rng receives the literal values of the range. The first three cells of
the range contain formula (again of the offset(...) kind). Even though they
show a value in the cell, the rng object shows those first three cells as the
literal formula:

'=OFFSET(Std_0!U$5,MATCH($C4,Std_0!$C$6:$C$2912,0) ,0)'

note - the ' ' are added here only to show the result, they are not in
the formula.
the rest of the range has only values in, and these show up correctly in
rng.value or when I dump the whole range into a variant array.

How do I convert the formula in the first three rows of the range to values?
Is there any way I can do it using the straight assignment

varrayData = rng

or do I have to iterate thru the rng cells to extract every value?

Thanks.

  #2   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 35,218
Default UDF + range object and Offset formula to Value problem

rng is the parm that you're passing--not rCol.

Post Tenebras Lux wrote:

I haven't encountered this one befo

I have just build a UDF which counts cells according to certain criteria
(for other reasons, I want to keep it as a UDF and not put the whole formula
into a cell - which I know how to do.)

Here is the relevant code:
Function DoTheCount(rng as range) as integer

Dim iCol As Integer
Dim aData As Variant

iCol = CInt(rCol.Text)
'rCol is a range object brought in as a parameter. rCol refers to a cell
that itself
'contains a formula =OFFSET(F$91,$R15,0)
' which yields a value, e.g. 37 (which is the column number I want)

Set ws = Worksheets(sht)
'sht is the worksheet I want, e.g. "sheet1"

With ws.Range("A10")
Set rng = Range(.Offset(0, iCol - 1), .Offset(nRows - 1, iCol - 1))
End With

varrayData = rng

'other stuff happens here

DoTheCount = ianswer

End Function
I have two problems:
1. If I try to use rCol.Value (which refers to a cell with an offset
formula), I get '0'
The only way to get the value I want is to use rCol.Text, which will give
me the correct value '37" which I convert to an integer.

2. rng receives the literal values of the range. The first three cells of
the range contain formula (again of the offset(...) kind). Even though they
show a value in the cell, the rng object shows those first three cells as the
literal formula:

'=OFFSET(Std_0!U$5,MATCH($C4,Std_0!$C$6:$C$2912,0) ,0)'

note - the ' ' are added here only to show the result, they are not in
the formula.
the rest of the range has only values in, and these show up correctly in
rng.value or when I dump the whole range into a variant array.

How do I convert the formula in the first three rows of the range to values?
Is there any way I can do it using the straight assignment

varrayData = rng

or do I have to iterate thru the rng cells to extract every value?

Thanks.


--

Dave Peterson
  #3   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 41
Default UDF + range object and Offset formula to Value problem

Sorry, I made a mistake in how I wrote out the problem. rCol is the range
param that is passed into the UDF definition. It should have read: Function
DoTheCount(rCol as range) as integer

rng should have been shown as Dim'ed as range object in the function code.
All the other parts of the code are correct.

I still have the problem. Any thoughts?

Thanks.



"Dave Peterson" wrote:

rng is the parm that you're passing--not rCol.

Post Tenebras Lux wrote:

I haven't encountered this one befo

I have just build a UDF which counts cells according to certain criteria
(for other reasons, I want to keep it as a UDF and not put the whole formula
into a cell - which I know how to do.)

Here is the relevant code:
Function DoTheCount(rng as range) as integer

Dim iCol As Integer
Dim aData As Variant

iCol = CInt(rCol.Text)
'rCol is a range object brought in as a parameter. rCol refers to a cell
that itself
'contains a formula =OFFSET(F$91,$R15,0)
' which yields a value, e.g. 37 (which is the column number I want)

Set ws = Worksheets(sht)
'sht is the worksheet I want, e.g. "sheet1"

With ws.Range("A10")
Set rng = Range(.Offset(0, iCol - 1), .Offset(nRows - 1, iCol - 1))
End With

varrayData = rng

'other stuff happens here

DoTheCount = ianswer

End Function
I have two problems:
1. If I try to use rCol.Value (which refers to a cell with an offset
formula), I get '0'
The only way to get the value I want is to use rCol.Text, which will give
me the correct value '37" which I convert to an integer.

2. rng receives the literal values of the range. The first three cells of
the range contain formula (again of the offset(...) kind). Even though they
show a value in the cell, the rng object shows those first three cells as the
literal formula:

'=OFFSET(Std_0!U$5,MATCH($C4,Std_0!$C$6:$C$2912,0) ,0)'

note - the ' ' are added here only to show the result, they are not in
the formula.
the rest of the range has only values in, and these show up correctly in
rng.value or when I dump the whole range into a variant array.

How do I convert the formula in the first three rows of the range to values?
Is there any way I can do it using the straight assignment

varrayData = rng

or do I have to iterate thru the rng cells to extract every value?

Thanks.


--

Dave Peterson

  #4   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 35,218
Default UDF + range object and Offset formula to Value problem

So your function looks more like:

Option Explicit

Function DoTheCount(rCol As Range) As Integer

Dim iCol As Integer
Dim aData As Variant

iCol = CInt(rCol.Text)
Set ws = Worksheets(sht)

With ws.Range("A10")
'added a dot here so that the range refered to ws.range("a10")
Set rng = .Range(.Offset(0, iCol - 1), .Offset(nRows - 1, iCol - 1))
End With

varrayData = rng

'other stuff happens here

DoTheCount = ianswer

End Function

But there's lots of stuff that happens elsewhere--what's sht, what's rng, what's
varraydata?

And for functions to calculate right away, they have to know what they depend
on.

When you write UDFs, the way you tell them what they depend on is by passing
those ranges in the function. Otherwise, they won't recalc when something
important changes.

You can also use:

Function DoTheCount(rCol As Range) As Integer
Application.volatile
....

But that only means that the function will recalc when excel recalcs. You could
be looking at "old" values--you could be a recalc behind.




Post Tenebras Lux wrote:

Sorry, I made a mistake in how I wrote out the problem. rCol is the range
param that is passed into the UDF definition. It should have read: Function
DoTheCount(rCol as range) as integer

rng should have been shown as Dim'ed as range object in the function code.
All the other parts of the code are correct.

I still have the problem. Any thoughts?

Thanks.

"Dave Peterson" wrote:

rng is the parm that you're passing--not rCol.

Post Tenebras Lux wrote:

I haven't encountered this one befo

I have just build a UDF which counts cells according to certain criteria
(for other reasons, I want to keep it as a UDF and not put the whole formula
into a cell - which I know how to do.)

Here is the relevant code:
Function DoTheCount(rng as range) as integer

Dim iCol As Integer
Dim aData As Variant

iCol = CInt(rCol.Text)
'rCol is a range object brought in as a parameter. rCol refers to a cell
that itself
'contains a formula =OFFSET(F$91,$R15,0)
' which yields a value, e.g. 37 (which is the column number I want)

Set ws = Worksheets(sht)
'sht is the worksheet I want, e.g. "sheet1"

With ws.Range("A10")
Set rng = Range(.Offset(0, iCol - 1), .Offset(nRows - 1, iCol - 1))
End With

varrayData = rng

'other stuff happens here

DoTheCount = ianswer

End Function
I have two problems:
1. If I try to use rCol.Value (which refers to a cell with an offset
formula), I get '0'
The only way to get the value I want is to use rCol.Text, which will give
me the correct value '37" which I convert to an integer.

2. rng receives the literal values of the range. The first three cells of
the range contain formula (again of the offset(...) kind). Even though they
show a value in the cell, the rng object shows those first three cells as the
literal formula:

'=OFFSET(Std_0!U$5,MATCH($C4,Std_0!$C$6:$C$2912,0) ,0)'

note - the ' ' are added here only to show the result, they are not in
the formula.
the rest of the range has only values in, and these show up correctly in
rng.value or when I dump the whole range into a variant array.

How do I convert the formula in the first three rows of the range to values?
Is there any way I can do it using the straight assignment

varrayData = rng

or do I have to iterate thru the rng cells to extract every value?

Thanks.


--

Dave Peterson


--

Dave Peterson
  #5   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 41
Default UDF + range object and Offset formula to Value problem

sht = "sheet1" (the name of the sheet with the cell or range to be referred
to by setting the rng (range object), which refers to a single column range
of about 1500 cells. It is set using the

ws = worksheets("sheet1") ' sheet1 contains the range of cells that rng
will refer to.
iCol = 37
nRows = 1500

With ws.Range("A10")
Set rng = .Range(.Offset(0, iCol - 1), .Offset(nRows - 1, iCol - 1))
End With


varrayData is a variant array variable created to store the data for more
efficient manipulation while the UDF is running.

The function works fine EXCEPT for those worksheet cells referred to by the
range object (rng), that contain the offset formula (rather than values).
The cell offset formula (e.g. =offset(A10, 0, 5) does not return a value in
the UDF (but does return a value in the worksheet cell).

In the UDF, rng.cell(1,1).value returns the following "=offset(A10, 0, 5)"
rather than the value of the cell referred to by the offset formula (which
might be 12 or any other number). Where rng.cell(10,1) refers to a value in
the cell, then rng.cell(10,1).value returns the value of that cell.

If you have any suggestions about why this happens (lets assume that the
rest of the function is written perfectly), I'd really appreciate some
guidance on how to resolve this.

thanks.



"Dave Peterson" wrote:

So your function looks more like:

Option Explicit

Function DoTheCount(rCol As Range) As Integer

Dim iCol As Integer
Dim aData As Variant

iCol = CInt(rCol.Text)
Set ws = Worksheets(sht)

With ws.Range("A10")
'added a dot here so that the range refered to ws.range("a10")
Set rng = .Range(.Offset(0, iCol - 1), .Offset(nRows - 1, iCol - 1))
End With

varrayData = rng

'other stuff happens here

DoTheCount = ianswer

End Function

But there's lots of stuff that happens elsewhere--what's sht, what's rng, what's
varraydata?

And for functions to calculate right away, they have to know what they depend
on.

When you write UDFs, the way you tell them what they depend on is by passing
those ranges in the function. Otherwise, they won't recalc when something
important changes.

You can also use:

Function DoTheCount(rCol As Range) As Integer
Application.volatile
....

But that only means that the function will recalc when excel recalcs. You could
be looking at "old" values--you could be a recalc behind.




Post Tenebras Lux wrote:

Sorry, I made a mistake in how I wrote out the problem. rCol is the range
param that is passed into the UDF definition. It should have read: Function
DoTheCount(rCol as range) as integer

rng should have been shown as Dim'ed as range object in the function code.
All the other parts of the code are correct.

I still have the problem. Any thoughts?

Thanks.

"Dave Peterson" wrote:

rng is the parm that you're passing--not rCol.

Post Tenebras Lux wrote:

I haven't encountered this one befo

I have just build a UDF which counts cells according to certain criteria
(for other reasons, I want to keep it as a UDF and not put the whole formula
into a cell - which I know how to do.)

Here is the relevant code:
Function DoTheCount(rng as range) as integer

Dim iCol As Integer
Dim aData As Variant

iCol = CInt(rCol.Text)
'rCol is a range object brought in as a parameter. rCol refers to a cell
that itself
'contains a formula =OFFSET(F$91,$R15,0)
' which yields a value, e.g. 37 (which is the column number I want)

Set ws = Worksheets(sht)
'sht is the worksheet I want, e.g. "sheet1"

With ws.Range("A10")
Set rng = Range(.Offset(0, iCol - 1), .Offset(nRows - 1, iCol - 1))
End With

varrayData = rng

'other stuff happens here

DoTheCount = ianswer

End Function
I have two problems:
1. If I try to use rCol.Value (which refers to a cell with an offset
formula), I get '0'
The only way to get the value I want is to use rCol.Text, which will give
me the correct value '37" which I convert to an integer.

2. rng receives the literal values of the range. The first three cells of
the range contain formula (again of the offset(...) kind). Even though they
show a value in the cell, the rng object shows those first three cells as the
literal formula:

'=OFFSET(Std_0!U$5,MATCH($C4,Std_0!$C$6:$C$2912,0) ,0)'

note - the ' ' are added here only to show the result, they are not in
the formula.
the rest of the range has only values in, and these show up correctly in
rng.value or when I dump the whole range into a variant array.

How do I convert the formula in the first three rows of the range to values?
Is there any way I can do it using the straight assignment

varrayData = rng

or do I have to iterate thru the rng cells to extract every value?

Thanks.

--

Dave Peterson


--

Dave Peterson



  #6   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 35,218
Default UDF + range object and Offset formula to Value problem

I don't really have any guesses.

I'd start by putting either some debug.print or msgbox's in the code so that I
could see that things pointed to what I wanted.


msgbox rng.address(external:=true)
....
even stuff like:
msgbox nRows
msgbox iCol
msgbox ws.Range("A10").Offset(0, iCol - 1).address(external:=true)
msgbox ws.Range("A10").Offset(nRows - 1, iCol - 1).address(external:=true)



Post Tenebras Lux wrote:

sht = "sheet1" (the name of the sheet with the cell or range to be referred
to by setting the rng (range object), which refers to a single column range
of about 1500 cells. It is set using the

ws = worksheets("sheet1") ' sheet1 contains the range of cells that rng
will refer to.
iCol = 37
nRows = 1500

With ws.Range("A10")
Set rng = .Range(.Offset(0, iCol - 1), .Offset(nRows - 1, iCol - 1))
End With

varrayData is a variant array variable created to store the data for more
efficient manipulation while the UDF is running.

The function works fine EXCEPT for those worksheet cells referred to by the
range object (rng), that contain the offset formula (rather than values).
The cell offset formula (e.g. =offset(A10, 0, 5) does not return a value in
the UDF (but does return a value in the worksheet cell).

In the UDF, rng.cell(1,1).value returns the following "=offset(A10, 0, 5)"
rather than the value of the cell referred to by the offset formula (which
might be 12 or any other number). Where rng.cell(10,1) refers to a value in
the cell, then rng.cell(10,1).value returns the value of that cell.

If you have any suggestions about why this happens (lets assume that the
rest of the function is written perfectly), I'd really appreciate some
guidance on how to resolve this.

thanks.

"Dave Peterson" wrote:

So your function looks more like:

Option Explicit

Function DoTheCount(rCol As Range) As Integer

Dim iCol As Integer
Dim aData As Variant

iCol = CInt(rCol.Text)
Set ws = Worksheets(sht)

With ws.Range("A10")
'added a dot here so that the range refered to ws.range("a10")
Set rng = .Range(.Offset(0, iCol - 1), .Offset(nRows - 1, iCol - 1))
End With

varrayData = rng

'other stuff happens here

DoTheCount = ianswer

End Function

But there's lots of stuff that happens elsewhere--what's sht, what's rng, what's
varraydata?

And for functions to calculate right away, they have to know what they depend
on.

When you write UDFs, the way you tell them what they depend on is by passing
those ranges in the function. Otherwise, they won't recalc when something
important changes.

You can also use:

Function DoTheCount(rCol As Range) As Integer
Application.volatile
....

But that only means that the function will recalc when excel recalcs. You could
be looking at "old" values--you could be a recalc behind.




Post Tenebras Lux wrote:

Sorry, I made a mistake in how I wrote out the problem. rCol is the range
param that is passed into the UDF definition. It should have read: Function
DoTheCount(rCol as range) as integer

rng should have been shown as Dim'ed as range object in the function code.
All the other parts of the code are correct.

I still have the problem. Any thoughts?

Thanks.

"Dave Peterson" wrote:

rng is the parm that you're passing--not rCol.

Post Tenebras Lux wrote:

I haven't encountered this one befo

I have just build a UDF which counts cells according to certain criteria
(for other reasons, I want to keep it as a UDF and not put the whole formula
into a cell - which I know how to do.)

Here is the relevant code:
Function DoTheCount(rng as range) as integer

Dim iCol As Integer
Dim aData As Variant

iCol = CInt(rCol.Text)
'rCol is a range object brought in as a parameter. rCol refers to a cell
that itself
'contains a formula =OFFSET(F$91,$R15,0)
' which yields a value, e.g. 37 (which is the column number I want)

Set ws = Worksheets(sht)
'sht is the worksheet I want, e.g. "sheet1"

With ws.Range("A10")
Set rng = Range(.Offset(0, iCol - 1), .Offset(nRows - 1, iCol - 1))
End With

varrayData = rng

'other stuff happens here

DoTheCount = ianswer

End Function
I have two problems:
1. If I try to use rCol.Value (which refers to a cell with an offset
formula), I get '0'
The only way to get the value I want is to use rCol.Text, which will give
me the correct value '37" which I convert to an integer.

2. rng receives the literal values of the range. The first three cells of
the range contain formula (again of the offset(...) kind). Even though they
show a value in the cell, the rng object shows those first three cells as the
literal formula:

'=OFFSET(Std_0!U$5,MATCH($C4,Std_0!$C$6:$C$2912,0) ,0)'

note - the ' ' are added here only to show the result, they are not in
the formula.
the rest of the range has only values in, and these show up correctly in
rng.value or when I dump the whole range into a variant array.

How do I convert the formula in the first three rows of the range to values?
Is there any way I can do it using the straight assignment

varrayData = rng

or do I have to iterate thru the rng cells to extract every value?

Thanks.

--

Dave Peterson


--

Dave Peterson


--

Dave Peterson
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
macro problem: range offset question lacy Excel Discussion (Misc queries) 6 September 4th 09 03:31 PM
Offset function problem-Dynamic range MarkM Excel Discussion (Misc queries) 1 November 11th 06 02:41 AM
Problem with Range.Cells.Offset and Range.Cells( row + offset, column) [email protected] Excel Programming 2 August 22nd 05 05:25 AM
Range Object with Find and Offset Ctal[_2_] Excel Programming 1 March 3rd 05 02:45 PM
Dynamic range offset problem! Majeed[_2_] Excel Programming 2 November 8th 04 09:00 PM


All times are GMT +1. The time now is 11:41 PM.

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

About Us

"It's about Microsoft Excel"