PC Review


Reply
Thread Tools Rate Thread

Counting elements of array and range type data

 
 
=?Utf-8?B?VG9tTGVnYWRv?=
Guest
Posts: n/a
 
      14th Sep 2007
I've got the following function that I would like to make versatile enough
that I can use it within VBA code and as a simple excel worksheet function.
I've pasted the function here where I'm having trouble, I need to figure out
how to count the elements in the range for both types of data. The "Size"
variable where I'm getting the dimension works with the UBound if my data
type is an array or variant, but I have to use Xrange.Count if the data is an
excel workbook range. Neither option works for both instances. Here is my
code:

Sub TestFunc()
Dim Test1(3) As Single, Test2(3) As Single, Value As Single, Value2 As
Single

Test1(1) = 3
Test1(2) = 2
Test1(3) = 1
Test2(1) = 1
Test2(2) = 2
Test2(3) = 3
Value = 2.5

Value2 = interpolate(Value, Test1, Test2)

Worksheets("Input Page").Select
Range("P25") = Value2


End Sub




Function interpolate(Value, xrange, yrange)
' Function linearly interpolates from a given x/y range
' Function allows for extrapolation outside the known range
'
Dim Size As Integer, Cumiminus1 As Single, Cumi As Single
Dim X1 As Single, X2 As Single, Y1 As Single, Y2 As Single
'
' Size = xrange.Count
' Size = 3
Size = UBound(xrange)
'


Thanks, Tom
 
Reply With Quote
 
 
 
 
Alain Vaillancourt
Guest
Posts: n/a
 
      14th Sep 2007
The declaration of xrange must be an array for UBound to work, now it is a
Variant type containing an array.

If xrange is not always containing Single values you can declare it as an
array of Variant like this:
Function interpolate(Value, xrange(), yrange)

If xrange is always containing Single values you are better to declare it as
an array of Single like this:
Function interpolate(Value, xrange() as Single, yrange)



"TomLegado" <(E-Mail Removed)> wrote in message
news:690EFEE5-39B3-44F0-9317-(E-Mail Removed)...
> I've got the following function that I would like to make versatile enough
> that I can use it within VBA code and as a simple excel worksheet
> function.
> I've pasted the function here where I'm having trouble, I need to figure
> out
> how to count the elements in the range for both types of data. The "Size"
> variable where I'm getting the dimension works with the UBound if my data
> type is an array or variant, but I have to use Xrange.Count if the data is
> an
> excel workbook range. Neither option works for both instances. Here is
> my
> code:
>
> Sub TestFunc()
> Dim Test1(3) As Single, Test2(3) As Single, Value As Single, Value2 As
> Single
>
> Test1(1) = 3
> Test1(2) = 2
> Test1(3) = 1
> Test2(1) = 1
> Test2(2) = 2
> Test2(3) = 3
> Value = 2.5
>
> Value2 = interpolate(Value, Test1, Test2)
>
> Worksheets("Input Page").Select
> Range("P25") = Value2
>
>
> End Sub
>
>
>
>
> Function interpolate(Value, xrange, yrange)
> ' Function linearly interpolates from a given x/y range
> ' Function allows for extrapolation outside the known range
> '
> Dim Size As Integer, Cumiminus1 As Single, Cumi As Single
> Dim X1 As Single, X2 As Single, Y1 As Single, Y2 As Single
> '
> ' Size = xrange.Count
> ' Size = 3
> Size = UBound(xrange)
> '
>
>
> Thanks, Tom


 
Reply With Quote
 
=?Utf-8?B?VG9tTGVnYWRv?=
Guest
Posts: n/a
 
      14th Sep 2007
Alain, thank you very much for your quick reply.

OK so I can make it work nicely for the instance that I'm passing an array
in from another sub-routine, but what about the instance where I use the
function as a worksheet function with excel range syntax as the argument.
This is where I'm having trouble because VBA can not give me the bounds on
this variant. Is there any way to make this function work for both cases?

"Alain Vaillancourt" wrote:

> The declaration of xrange must be an array for UBound to work, now it is a
> Variant type containing an array.
>
> If xrange is not always containing Single values you can declare it as an
> array of Variant like this:
> Function interpolate(Value, xrange(), yrange)
>
> If xrange is always containing Single values you are better to declare it as
> an array of Single like this:
> Function interpolate(Value, xrange() as Single, yrange)
>
>
>
> "TomLegado" <(E-Mail Removed)> wrote in message
> news:690EFEE5-39B3-44F0-9317-(E-Mail Removed)...
> > I've got the following function that I would like to make versatile enough
> > that I can use it within VBA code and as a simple excel worksheet
> > function.
> > I've pasted the function here where I'm having trouble, I need to figure
> > out
> > how to count the elements in the range for both types of data. The "Size"
> > variable where I'm getting the dimension works with the UBound if my data
> > type is an array or variant, but I have to use Xrange.Count if the data is
> > an
> > excel workbook range. Neither option works for both instances. Here is
> > my
> > code:
> >
> > Sub TestFunc()
> > Dim Test1(3) As Single, Test2(3) As Single, Value As Single, Value2 As
> > Single
> >
> > Test1(1) = 3
> > Test1(2) = 2
> > Test1(3) = 1
> > Test2(1) = 1
> > Test2(2) = 2
> > Test2(3) = 3
> > Value = 2.5
> >
> > Value2 = interpolate(Value, Test1, Test2)
> >
> > Worksheets("Input Page").Select
> > Range("P25") = Value2
> >
> >
> > End Sub
> >
> >
> >
> >
> > Function interpolate(Value, xrange, yrange)
> > ' Function linearly interpolates from a given x/y range
> > ' Function allows for extrapolation outside the known range
> > '
> > Dim Size As Integer, Cumiminus1 As Single, Cumi As Single
> > Dim X1 As Single, X2 As Single, Y1 As Single, Y2 As Single
> > '
> > ' Size = xrange.Count
> > ' Size = 3
> > Size = UBound(xrange)
> > '
> >
> >
> > Thanks, Tom

>
>

 
Reply With Quote
 
Alan Beban
Guest
Posts: n/a
 
      14th Sep 2007
Assuming that your arrays are 1-based, 1-dimensional (or single column)
arrays, you might consider the folowing snippet:

If IsArray(xrange) Then
If TypeOf xrange Is Range Then
Size = xrange.Count
Else
Size = UBound(xrange)
End If
Else
Msg = "Input must be an array or multi-celled range"
MsgBox Msg, 16
End If

Alan Beban

TomLegado wrote:
> I've got the following function that I would like to make versatile enough
> that I can use it within VBA code and as a simple excel worksheet function.
> I've pasted the function here where I'm having trouble, I need to figure out
> how to count the elements in the range for both types of data. The "Size"
> variable where I'm getting the dimension works with the UBound if my data
> type is an array or variant, but I have to use Xrange.Count if the data is an
> excel workbook range. Neither option works for both instances. Here is my
> code:
>
> Sub TestFunc()
> Dim Test1(3) As Single, Test2(3) As Single, Value As Single, Value2 As
> Single
>
> Test1(1) = 3
> Test1(2) = 2
> Test1(3) = 1
> Test2(1) = 1
> Test2(2) = 2
> Test2(3) = 3
> Value = 2.5
>
> Value2 = interpolate(Value, Test1, Test2)
>
> Worksheets("Input Page").Select
> Range("P25") = Value2
>
>
> End Sub
>
>
>
>
> Function interpolate(Value, xrange, yrange)
> ' Function linearly interpolates from a given x/y range
> ' Function allows for extrapolation outside the known range
> '
> Dim Size As Integer, Cumiminus1 As Single, Cumi As Single
> Dim X1 As Single, X2 As Single, Y1 As Single, Y2 As Single
> '
> ' Size = xrange.Count
> ' Size = 3
> Size = UBound(xrange)
> '
>
>
> Thanks, Tom

 
Reply With Quote
 
Alain Vaillancourt
Guest
Posts: n/a
 
      14th Sep 2007
Sorry I think I answered to quickly, if you need to pass an array or Excel
range you keep it in a Variant and use the IsArray and TypeOf to handle the
difference between them. The next message from Alan in this thread give you
a good example of how to do it...


"TomLegado" <(E-Mail Removed)> wrote in message
news3BBC1EF-C562-43BB-91AF-(E-Mail Removed)...
> Alain, thank you very much for your quick reply.
>
> OK so I can make it work nicely for the instance that I'm passing an array
> in from another sub-routine, but what about the instance where I use the
> function as a worksheet function with excel range syntax as the argument.
> This is where I'm having trouble because VBA can not give me the bounds on
> this variant. Is there any way to make this function work for both cases?
>
> "Alain Vaillancourt" wrote:
>
>> The declaration of xrange must be an array for UBound to work, now it is
>> a
>> Variant type containing an array.
>>
>> If xrange is not always containing Single values you can declare it as an
>> array of Variant like this:
>> Function interpolate(Value, xrange(), yrange)
>>
>> If xrange is always containing Single values you are better to declare it
>> as
>> an array of Single like this:
>> Function interpolate(Value, xrange() as Single, yrange)
>>
>>
>>
>> "TomLegado" <(E-Mail Removed)> wrote in message
>> news:690EFEE5-39B3-44F0-9317-(E-Mail Removed)...
>> > I've got the following function that I would like to make versatile
>> > enough
>> > that I can use it within VBA code and as a simple excel worksheet
>> > function.
>> > I've pasted the function here where I'm having trouble, I need to
>> > figure
>> > out
>> > how to count the elements in the range for both types of data. The
>> > "Size"
>> > variable where I'm getting the dimension works with the UBound if my
>> > data
>> > type is an array or variant, but I have to use Xrange.Count if the data
>> > is
>> > an
>> > excel workbook range. Neither option works for both instances. Here
>> > is
>> > my
>> > code:
>> >
>> > Sub TestFunc()
>> > Dim Test1(3) As Single, Test2(3) As Single, Value As Single, Value2
>> > As
>> > Single
>> >
>> > Test1(1) = 3
>> > Test1(2) = 2
>> > Test1(3) = 1
>> > Test2(1) = 1
>> > Test2(2) = 2
>> > Test2(3) = 3
>> > Value = 2.5
>> >
>> > Value2 = interpolate(Value, Test1, Test2)
>> >
>> > Worksheets("Input Page").Select
>> > Range("P25") = Value2
>> >
>> >
>> > End Sub
>> >
>> >
>> >
>> >
>> > Function interpolate(Value, xrange, yrange)
>> > ' Function linearly interpolates from a given x/y range
>> > ' Function allows for extrapolation outside the known range
>> > '
>> > Dim Size As Integer, Cumiminus1 As Single, Cumi As Single
>> > Dim X1 As Single, X2 As Single, Y1 As Single, Y2 As Single
>> > '
>> > ' Size = xrange.Count
>> > ' Size = 3
>> > Size = UBound(xrange)
>> > '
>> >
>> >
>> > Thanks, Tom

>>
>>

 
Reply With Quote
 
=?Utf-8?B?VG9tTGVnYWRv?=
Guest
Posts: n/a
 
      14th Sep 2007
Alan, thanks that works very well.

"Alan Beban" wrote:

> Assuming that your arrays are 1-based, 1-dimensional (or single column)
> arrays, you might consider the folowing snippet:
>
> If IsArray(xrange) Then
> If TypeOf xrange Is Range Then
> Size = xrange.Count
> Else
> Size = UBound(xrange)
> End If
> Else
> Msg = "Input must be an array or multi-celled range"
> MsgBox Msg, 16
> End If
>
> Alan Beban
>
> TomLegado wrote:
> > I've got the following function that I would like to make versatile enough
> > that I can use it within VBA code and as a simple excel worksheet function.
> > I've pasted the function here where I'm having trouble, I need to figure out
> > how to count the elements in the range for both types of data. The "Size"
> > variable where I'm getting the dimension works with the UBound if my data
> > type is an array or variant, but I have to use Xrange.Count if the data is an
> > excel workbook range. Neither option works for both instances. Here is my
> > code:
> >
> > Sub TestFunc()
> > Dim Test1(3) As Single, Test2(3) As Single, Value As Single, Value2 As
> > Single
> >
> > Test1(1) = 3
> > Test1(2) = 2
> > Test1(3) = 1
> > Test2(1) = 1
> > Test2(2) = 2
> > Test2(3) = 3
> > Value = 2.5
> >
> > Value2 = interpolate(Value, Test1, Test2)
> >
> > Worksheets("Input Page").Select
> > Range("P25") = Value2
> >
> >
> > End Sub
> >
> >
> >
> >
> > Function interpolate(Value, xrange, yrange)
> > ' Function linearly interpolates from a given x/y range
> > ' Function allows for extrapolation outside the known range
> > '
> > Dim Size As Integer, Cumiminus1 As Single, Cumi As Single
> > Dim X1 As Single, X2 As Single, Y1 As Single, Y2 As Single
> > '
> > ' Size = xrange.Count
> > ' Size = 3
> > Size = UBound(xrange)
> > '
> >
> >
> > Thanks, Tom

>

 
Reply With Quote
 
Alan Beban
Guest
Posts: n/a
 
      15th Sep 2007
Two clarifying points.
First, it is not necessary to keep the array in a Variant variable; the
following works fine:

Sub abtest3()
Dim arr() As Single, rng As Range
Set rng = Range("C1:C14")
ReDim arr(1 To rng.Count, 1 To 1)
For i = 1 To rng.Count
arr(i, 1) = rng(i)
Next
Size = getSize(arr)
Debug.Print Size, TypeName(arr) '<----Returns 14 Single()
End Sub
Function getSize(xyz)
If IsArray(xyz) Then
If TypeOf xyz Is Range Then
getSize = xyz.Count
Else
getSize = UBound(xyz)
End If
Else
Msg = "Input must be an array or multi-celled range"
MsgBox Msg, 16
End If
End Function

Second, Alain's first response in this thread included the statement
"The declaration of xrange must be an array for UBound to work, now it
is a Variant type containing an array." In fact, UBound works fine on
either an array contained within a Variant variable or a Variant() type
array (or for that matter, any other type of VBA array, e.g., Integer(),
Single(), etc.).

Sub abtest4()
Dim xrange1, xrange2()
xrange1 = Range("C1:C14")
xrange2 = Range("C1:C14")
'xrange1 is an array contained within a Variant type variable;
'xrange2 is a Variant() type array
Debug.Print UBound(xrange1), UBound(xrange2) '<----Returns 14 14
End Sub

Alan Beban

Alain Vaillancourt wrote:
> Sorry I think I answered to quickly, if you need to pass an array or
> Excel range you keep it in a Variant and use the IsArray and TypeOf to
> handle the difference between them. The next message from Alan in this
> thread give you a good example of how to do it...
>

 
Reply With Quote
 
Alain Vaillancourt
Guest
Posts: n/a
 
      15th Sep 2007
To clarify points:

In that example xyz is a Variant, by default when you don't specify a type
it is of type Variant

Second, UBound only work for arrays so if you don't use type checking like
TypeOf or IsArray you will have a problem using it on an Excel Range...


"Alan Beban" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed)...
> Two clarifying points.
> First, it is not necessary to keep the array in a Variant variable; the
> following works fine:
>
> Sub abtest3()
> Dim arr() As Single, rng As Range
> Set rng = Range("C1:C14")
> ReDim arr(1 To rng.Count, 1 To 1)
> For i = 1 To rng.Count
> arr(i, 1) = rng(i)
> Next
> Size = getSize(arr)
> Debug.Print Size, TypeName(arr) '<----Returns 14 Single()
> End Sub
> Function getSize(xyz)
> If IsArray(xyz) Then
> If TypeOf xyz Is Range Then
> getSize = xyz.Count
> Else
> getSize = UBound(xyz)
> End If
> Else
> Msg = "Input must be an array or multi-celled range"
> MsgBox Msg, 16
> End If
> End Function
>
> Second, Alain's first response in this thread included the statement "The
> declaration of xrange must be an array for UBound to work, now it is a
> Variant type containing an array." In fact, UBound works fine on either
> an array contained within a Variant variable or a Variant() type array (or
> for that matter, any other type of VBA array, e.g., Integer(), Single(),
> etc.).
>
> Sub abtest4()
> Dim xrange1, xrange2()
> xrange1 = Range("C1:C14")
> xrange2 = Range("C1:C14")
> 'xrange1 is an array contained within a Variant type variable;
> 'xrange2 is a Variant() type array
> Debug.Print UBound(xrange1), UBound(xrange2) '<----Returns 14 14
> End Sub
>
> Alan Beban
>
> Alain Vaillancourt wrote:
>> Sorry I think I answered to quickly, if you need to pass an array or
>> Excel range you keep it in a Variant and use the IsArray and TypeOf to
>> handle the difference between them. The next message from Alan in this
>> thread give you a good example of how to do it...
>>

 
Reply With Quote
 
Alan Beban
Guest
Posts: n/a
 
      15th Sep 2007
Alain Vaillancourt wrote:
> To clarify points:
>
> In that example xyz is a Variant, by default when you don't specify a
> type it is of type Variant


If by "that example" you mean the code below in Sub abtest3 and Function
getSize, xyz is of type Single(), as you can see if you insert just
before If IsArray(xyz) the following:

MsgBox Typename(xyz)

xyz is simply a placeholder for the parameter "arr" that is passed from
the sub procedure, and which is of type Single().
>
> Second, UBound only work for arrays so if you don't use type checking
> like TypeOf or IsArray you will have a problem using it on an Excel
> Range...


What it appeared you were saying in the portion of your first response
in this thread that I quoted below was that UBound works only on an
array of a built-in type (e.g., Variant(), Integer(), Single(), etc.)
and not on an array contained within a Variant type variable--which is
incorrect. Perhaps I misunderstood.

Alan Beban
>
>
> "Alan Beban" <(E-Mail Removed)> wrote in message
> news:(E-Mail Removed)...
>
>> Two clarifying points.
>> First, it is not necessary to keep the array in a Variant variable;
>> the following works fine:
>>
>> Sub abtest3()
>> Dim arr() As Single, rng As Range
>> Set rng = Range("C1:C14")
>> ReDim arr(1 To rng.Count, 1 To 1)
>> For i = 1 To rng.Count
>> arr(i, 1) = rng(i)
>> Next
>> Size = getSize(arr)
>> Debug.Print Size, TypeName(arr) '<----Returns 14 Single()
>> End Sub
>> Function getSize(xyz)
>> If IsArray(xyz) Then
>> If TypeOf xyz Is Range Then
>> getSize = xyz.Count
>> Else
>> getSize = UBound(xyz)
>> End If
>> Else
>> Msg = "Input must be an array or multi-celled range"
>> MsgBox Msg, 16
>> End If
>> End Function
>>
>> Second, Alain's first response in this thread included the statement
>> "The declaration of xrange must be an array for UBound to work, now it
>> is a Variant type containing an array." In fact, UBound works fine on
>> either an array contained within a Variant variable or a Variant()
>> type array (or for that matter, any other type of VBA array, e.g.,
>> Integer(), Single(), etc.).
>>
>> Sub abtest4()
>> Dim xrange1, xrange2()
>> xrange1 = Range("C1:C14")
>> xrange2 = Range("C1:C14")
>> 'xrange1 is an array contained within a Variant type variable;
>> 'xrange2 is a Variant() type array
>> Debug.Print UBound(xrange1), UBound(xrange2) '<----Returns 14 14
>> End Sub
>>
>> Alan Beban
>>
>> Alain Vaillancourt wrote:
>>
>>> Sorry I think I answered to quickly, if you need to pass an array or
>>> Excel range you keep it in a Variant and use the IsArray and TypeOf
>>> to handle the difference between them. The next message from Alan in
>>> this thread give you a good example of how to do it...
>>>

 
Reply With Quote
 
Alain Vaillancourt
Guest
Posts: n/a
 
      15th Sep 2007
Yes I was meaning your code below. Type variable xyz is a Variant type,
Variant are container of other types and if you look at the documentation
about the TypeName function they say that the required varname argument is a
Variant.

As I said in the second post I replied too quickly and was not meaning that
UBound was not working with Variant at all but only with the Variant
containing an array so if he would only use an array as a parameter it would
have been better to declare it as an array.

Since he want to also use an Excel Range as the parameter then the Variant
is more appropriate with the use of IsArray, TypeOf or TypeName because
UBound would not work with an Excel Range.



"Alan Beban" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed)...
> Alain Vaillancourt wrote:
>> To clarify points:
>>
>> In that example xyz is a Variant, by default when you don't specify a
>> type it is of type Variant

>
> If by "that example" you mean the code below in Sub abtest3 and Function
> getSize, xyz is of type Single(), as you can see if you insert just before
> If IsArray(xyz) the following:
>
> MsgBox Typename(xyz)
>
> xyz is simply a placeholder for the parameter "arr" that is passed from
> the sub procedure, and which is of type Single().
>>
>> Second, UBound only work for arrays so if you don't use type checking
>> like TypeOf or IsArray you will have a problem using it on an Excel
>> Range...

>
> What it appeared you were saying in the portion of your first response in
> this thread that I quoted below was that UBound works only on an array of
> a built-in type (e.g., Variant(), Integer(), Single(), etc.) and not on an
> array contained within a Variant type variable--which is incorrect.
> Perhaps I misunderstood.
>
> Alan Beban
>>
>>
>> "Alan Beban" <(E-Mail Removed)> wrote in message
>> news:(E-Mail Removed)...
>>
>>> Two clarifying points.
>>> First, it is not necessary to keep the array in a Variant variable; the
>>> following works fine:
>>>
>>> Sub abtest3()
>>> Dim arr() As Single, rng As Range
>>> Set rng = Range("C1:C14")
>>> ReDim arr(1 To rng.Count, 1 To 1)
>>> For i = 1 To rng.Count
>>> arr(i, 1) = rng(i)
>>> Next
>>> Size = getSize(arr)
>>> Debug.Print Size, TypeName(arr) '<----Returns 14 Single()
>>> End Sub
>>> Function getSize(xyz)
>>> If IsArray(xyz) Then
>>> If TypeOf xyz Is Range Then
>>> getSize = xyz.Count
>>> Else
>>> getSize = UBound(xyz)
>>> End If
>>> Else
>>> Msg = "Input must be an array or multi-celled range"
>>> MsgBox Msg, 16
>>> End If
>>> End Function
>>>
>>> Second, Alain's first response in this thread included the statement
>>> "The declaration of xrange must be an array for UBound to work, now it
>>> is a Variant type containing an array." In fact, UBound works fine on
>>> either an array contained within a Variant variable or a Variant() type
>>> array (or for that matter, any other type of VBA array, e.g., Integer(),
>>> Single(), etc.).
>>>
>>> Sub abtest4()
>>> Dim xrange1, xrange2()
>>> xrange1 = Range("C1:C14")
>>> xrange2 = Range("C1:C14")
>>> 'xrange1 is an array contained within a Variant type variable;
>>> 'xrange2 is a Variant() type array
>>> Debug.Print UBound(xrange1), UBound(xrange2) '<----Returns 14 14
>>> End Sub
>>>
>>> Alan Beban
>>>
>>> Alain Vaillancourt wrote:
>>>
>>>> Sorry I think I answered to quickly, if you need to pass an array or
>>>> Excel range you keep it in a Variant and use the IsArray and TypeOf to
>>>> handle the difference between them. The next message from Alan in this
>>>> thread give you a good example of how to do it...
>>>>

 
Reply With Quote
 
 
 
Reply

Thread Tools
Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

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


Similar Threads
Thread Thread Starter Forum Replies Last Post
Counting the Number of Elements in an Array Confused_in_Houston Microsoft Excel Misc 3 1st Oct 2008 11:05 PM
Array loses data type when placed into range Mbtch@. Microsoft Excel Programming 2 7th Jun 2005 09:23 PM
Counting the number of elements within an array that have data ExcelMonkey Microsoft Excel Programming 5 26th May 2004 05:14 PM
Comparing ARRAY elements with RANGE data and created a 2nd array JimP Microsoft Excel Worksheet Functions 2 10th Mar 2004 07:29 PM
Array elements - counting john sutor Microsoft C# .NET 1 7th Aug 2003 02:09 PM


Features
 

Advertising
 

Newsgroups
 


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