ExcelBanter

ExcelBanter (https://www.excelbanter.com/)
-   Excel Programming (https://www.excelbanter.com/excel-programming/)
-   -   Application.Match on an range defined to a variant array (https://www.excelbanter.com/excel-programming/400971-application-match-range-defined-variant-array.html)

Keith R[_2_]

Application.Match on an range defined to a variant array
 
Sorry for the subject line, I really don't know what to call this...

I'm using the following to assign a range to a variant array in XL2003/WinXP

Option Base 1
Public ExpediteArrayShort As Variant '(1 To x rows, 1 column)

Sub Mysub
Expedite_LastRow = Sheet4.Cells.Find(What:="*", After:=[A1],
SearchDirection:=xlPrevious).Row
ExpediteArrayShort = Sheet4.Range("B1:B" &
CStr(Expedite_LastRow)).Value
End sub

This brings my one column of data in, which is great. However, I need to be
able to use Application.Match against this array, which I believe requires a
1-D array.

I tried syntax variants like
FoundRow = Application.Match(sArray(1, i), ExpediteArrayShort(, 1),
False)
but I get "syntax error" (runtime), and the following gives me a runtime
error 9, subscript out of range:
If IsError(Application.Match(sArray(1, i), ExpediteArrayShort(),
False)) Then
presumably because I haven't specified the second parameter.

Notably, msgbox ExpediteArrayShort(3) returned an error, but
ExpediteArrayShort(3,1) returned the third value in the range. If Excel is
going to see this as a 2-D range, is there a way to (easily) use
Application.Match against this range, or am I forced to loop through and
assign all the values one at a time to a 1D array?

Is there a way to redim preserve this array to turn it into a 1-D array, or
a different way to grab it up front to force it into a 1-D array from the
start (other than looping)?

Thanks!
Keith



Tim Zych

Application.Match on an range defined to a variant array
 
This worked for me:

Dim v As Variant
Dim vCopy As Variant
v = Range("TwoColRng")
vCopy = v
ReDim Preserve vCopy(LBound(v, 1) To UBound(v), 0 To 0)

Debug.Print Application.Match("a", vCopy, 0)

--
Tim Zych
SF, CA

"Keith R" wrote in message
...
Sorry for the subject line, I really don't know what to call this...

I'm using the following to assign a range to a variant array in
XL2003/WinXP

Option Base 1
Public ExpediteArrayShort As Variant '(1 To x rows, 1 column)

Sub Mysub
Expedite_LastRow = Sheet4.Cells.Find(What:="*", After:=[A1],
SearchDirection:=xlPrevious).Row
ExpediteArrayShort = Sheet4.Range("B1:B" &
CStr(Expedite_LastRow)).Value
End sub

This brings my one column of data in, which is great. However, I need to
be able to use Application.Match against this array, which I believe
requires a 1-D array.

I tried syntax variants like
FoundRow = Application.Match(sArray(1, i), ExpediteArrayShort(, 1),
False)
but I get "syntax error" (runtime), and the following gives me a runtime
error 9, subscript out of range:
If IsError(Application.Match(sArray(1, i), ExpediteArrayShort(),
False)) Then
presumably because I haven't specified the second parameter.

Notably, msgbox ExpediteArrayShort(3) returned an error, but
ExpediteArrayShort(3,1) returned the third value in the range. If Excel is
going to see this as a 2-D range, is there a way to (easily) use
Application.Match against this range, or am I forced to loop through and
assign all the values one at a time to a 1D array?

Is there a way to redim preserve this array to turn it into a 1-D array,
or a different way to grab it up front to force it into a 1-D array from
the start (other than looping)?

Thanks!
Keith




Alan Beban[_2_]

Application.Match on an range defined to a variant array
 
Keith R wrote:
. . .
This brings my one column of data in, which is great. However, I need to be
able to use Application.Match against this array, which I believe requires a
1-D array.


Nope. it requires a single "row" or single "column".

Alan Beban

Dave Peterson

Application.Match on an range defined to a variant array
 
This worked in xl2003 for me:

Option Explicit
Sub Mysub()
Dim res As Variant
Dim myArr As Variant
Dim myStr As String

'add some test data
With ActiveSheet.Range("a1:a10")
.Formula = "=cell(""address"",a1)"
myArr = .Value
End With

myStr = "$A$7"

res = Application.Match(myStr, myArr, 0)

If IsError(res) Then
MsgBox "not found"
Else
MsgBox res
End If

End Sub

Maybe your =match() didn't find a match.




Keith R wrote:

Sorry for the subject line, I really don't know what to call this...

I'm using the following to assign a range to a variant array in XL2003/WinXP

Option Base 1
Public ExpediteArrayShort As Variant '(1 To x rows, 1 column)

Sub Mysub
Expedite_LastRow = Sheet4.Cells.Find(What:="*", After:=[A1],
SearchDirection:=xlPrevious).Row
ExpediteArrayShort = Sheet4.Range("B1:B" &
CStr(Expedite_LastRow)).Value
End sub

This brings my one column of data in, which is great. However, I need to be
able to use Application.Match against this array, which I believe requires a
1-D array.

I tried syntax variants like
FoundRow = Application.Match(sArray(1, i), ExpediteArrayShort(, 1),
False)
but I get "syntax error" (runtime), and the following gives me a runtime
error 9, subscript out of range:
If IsError(Application.Match(sArray(1, i), ExpediteArrayShort(),
False)) Then
presumably because I haven't specified the second parameter.

Notably, msgbox ExpediteArrayShort(3) returned an error, but
ExpediteArrayShort(3,1) returned the third value in the range. If Excel is
going to see this as a 2-D range, is there a way to (easily) use
Application.Match against this range, or am I forced to loop through and
assign all the values one at a time to a 1D array?

Is there a way to redim preserve this array to turn it into a 1-D array, or
a different way to grab it up front to force it into a 1-D array from the
start (other than looping)?

Thanks!
Keith


--

Dave Peterson

Keith R[_2_]

Application.Match on an range defined to a variant array
 
Tim-

That worked for me too, and now I've learned a little more about the redim
statement as well (figuring out how this worked).

Thank you!
Keith

"Tim Zych" <tzych@NOSp@mE@RTHLINKDOTNET wrote in message
...
This worked for me:

Dim v As Variant
Dim vCopy As Variant
v = Range("TwoColRng")
vCopy = v
ReDim Preserve vCopy(LBound(v, 1) To UBound(v), 0 To 0)

Debug.Print Application.Match("a", vCopy, 0)

--
Tim Zych
SF, CA

"Keith R" wrote in message
...
Sorry for the subject line, I really don't know what to call this...

I'm using the following to assign a range to a variant array in
XL2003/WinXP

Option Base 1
Public ExpediteArrayShort As Variant '(1 To x rows, 1 column)

Sub Mysub
Expedite_LastRow = Sheet4.Cells.Find(What:="*", After:=[A1],
SearchDirection:=xlPrevious).Row
ExpediteArrayShort = Sheet4.Range("B1:B" &
CStr(Expedite_LastRow)).Value
End sub

This brings my one column of data in, which is great. However, I need to
be able to use Application.Match against this array, which I believe
requires a 1-D array.

I tried syntax variants like
FoundRow = Application.Match(sArray(1, i), ExpediteArrayShort(, 1),
False)
but I get "syntax error" (runtime), and the following gives me a runtime
error 9, subscript out of range:
If IsError(Application.Match(sArray(1, i), ExpediteArrayShort(),
False)) Then
presumably because I haven't specified the second parameter.

Notably, msgbox ExpediteArrayShort(3) returned an error, but
ExpediteArrayShort(3,1) returned the third value in the range. If Excel
is going to see this as a 2-D range, is there a way to (easily) use
Application.Match against this range, or am I forced to loop through and
assign all the values one at a time to a 1D array?

Is there a way to redim preserve this array to turn it into a 1-D array,
or a different way to grab it up front to force it into a 1-D array from
the start (other than looping)?

Thanks!
Keith






Alan Beban[_2_]

Application.Match on an range defined to a variant array
 
Keith R wrote:. . .If Excel
is going to see this as a 2-D range, is there a way to (easily) use
Application.Match against this range, or am I forced to loop through and
assign all the values one at a time to a 1D array?


For a single column or single row 2-d array, just use Application.Match
directly; works fine.

Is there a way to redim preserve this array to turn it into a 1-D array,
or a different way to grab it up front to force it into a 1-D array from
the start (other than looping)?

Thanks!
Keith


For a single-column Variant() array that's not too large (less than
65537 elements in current versions, 5461 elements in earlier versions)

arr = Application.Transpose(arr) will convert it to a 1-based 1-D array.

Alan Beban


All times are GMT +1. The time now is 01:35 PM.

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