ExcelBanter

ExcelBanter (https://www.excelbanter.com/)
-   Excel Programming (https://www.excelbanter.com/excel-programming/)
-   -   application.match with multi-dimensional arrays (syntax request) (https://www.excelbanter.com/excel-programming/392301-application-match-multi-dimensional-arrays-syntax-request.html)

Keith R

application.match with multi-dimensional arrays (syntax request)
 
I have two large arrays (which are actually worksheets that have been loaded
into memory for faster processing); I cycle through every 'row' in the first
array to get a source value, then I cycle through every value in one
'column' of the second array to find /every/ match of that value.

Due to the size of my arrays, this takes a long time (about 10 minutes). It
seems that if I could use application.match, this could speed things up
considerably.

Can anyone suggest syntax for using application.match against a
multidimensional array, and even better, how to iterate from the last found
match to the end of the array each time?

I'm thinking something like:

Dim SourceArray (1 to 10,000, 1 to 50)
Dim CheckArray (1 to 40,000, 1 to 100)

'load the sheets, then:

For MySourceRow = 1 to 10000
SourceValue = SourceArray (MySourceRow, 14)
FoundMatchRow = Application.Match(SourceValue, CheckArray(?,31),False)
....etc

The two problems I need to overcome are (a) how do I refer to a single
dimension of a multidimensional array (where the questionmark is- match
against all of column 31), and (b) if I find a match, how do I make a
subsequent loop only search for matches from there forward, e.g. if a match
is found in row 27,418, then I want to do another application.match with the
same SourceValue for rows 27,419 through 40,000 for column 31 in my
CheckArray table.

Thanks for any help and advice!
Keith



Dave Peterson

application.match with multi-dimensional arrays (syntax request)
 
On Sheet1, I put this in A1:
=cell("address",a1)

I copied down 50 rows and across 10 columns (A1:J50).

Then I used this and it worked ok for me:

Option Explicit
Sub testme()
Dim myArr As Variant
Dim myRow As Variant
Dim myCol As Variant
Dim myColKey As String
Dim myRowKey As String

myArr = Worksheets("sheet1").Range("a1:J50").Value

myRowKey = "$a$37"
myColKey = "$e$1"

With Application
myRow = .Match(myRowKey, .Index(myArr, 0, 1), 0)
myCol = .Match(myColKey, .Index(myArr, 1, 0), 0)
If IsNumeric(myRow) _
And IsNumeric(myCol) Then
MsgBox myArr(myRow, myCol)
Else
MsgBox "at least one missing match"
End If
End With
End Sub

I got $E$37 back and that's what I expected.



Keith R wrote:

I have two large arrays (which are actually worksheets that have been loaded
into memory for faster processing); I cycle through every 'row' in the first
array to get a source value, then I cycle through every value in one
'column' of the second array to find /every/ match of that value.

Due to the size of my arrays, this takes a long time (about 10 minutes). It
seems that if I could use application.match, this could speed things up
considerably.

Can anyone suggest syntax for using application.match against a
multidimensional array, and even better, how to iterate from the last found
match to the end of the array each time?

I'm thinking something like:

Dim SourceArray (1 to 10,000, 1 to 50)
Dim CheckArray (1 to 40,000, 1 to 100)

'load the sheets, then:

For MySourceRow = 1 to 10000
SourceValue = SourceArray (MySourceRow, 14)
FoundMatchRow = Application.Match(SourceValue, CheckArray(?,31),False)
....etc

The two problems I need to overcome are (a) how do I refer to a single
dimension of a multidimensional array (where the questionmark is- match
against all of column 31), and (b) if I find a match, how do I make a
subsequent loop only search for matches from there forward, e.g. if a match
is found in row 27,418, then I want to do another application.match with the
same SourceValue for rows 27,419 through 40,000 for column 31 in my
CheckArray table.

Thanks for any help and advice!
Keith


--

Dave Peterson

Keith R

application.match with multi-dimensional arrays (syntax request)
 
Dave- that is a brilliant solution to finding the first match! I've pulled
the .Match(myRowKey, .Index(myArr, 0, 1), 0) apart to understand how it
works, but I'm not clear on how to force the index on subsequent loops to
only check rows that are past the last found match (looking for multiples).
Is it just an index parameter change that I'm not understanding (for part
(b) below)?

Is it possible to put in a range for one of the index values, for example
(using your example) to look for subsequent matches, it could be
..Match(myRowKey, .Index(myArr, 37 to 50, 1), 0)?

Thanks!!
Keith

"Dave Peterson" wrote in message
...
On Sheet1, I put this in A1:
=cell("address",a1)

I copied down 50 rows and across 10 columns (A1:J50).

Then I used this and it worked ok for me:

Option Explicit
Sub testme()
Dim myArr As Variant
Dim myRow As Variant
Dim myCol As Variant
Dim myColKey As String
Dim myRowKey As String

myArr = Worksheets("sheet1").Range("a1:J50").Value

myRowKey = "$a$37"
myColKey = "$e$1"

With Application
myRow = .Match(myRowKey, .Index(myArr, 0, 1), 0)
myCol = .Match(myColKey, .Index(myArr, 1, 0), 0)
If IsNumeric(myRow) _
And IsNumeric(myCol) Then
MsgBox myArr(myRow, myCol)
Else
MsgBox "at least one missing match"
End If
End With
End Sub

I got $E$37 back and that's what I expected.



Keith R wrote:

I have two large arrays (which are actually worksheets that have been
loaded
into memory for faster processing); I cycle through every 'row' in the
first
array to get a source value, then I cycle through every value in one
'column' of the second array to find /every/ match of that value.

Due to the size of my arrays, this takes a long time (about 10 minutes).
It
seems that if I could use application.match, this could speed things up
considerably.

Can anyone suggest syntax for using application.match against a
multidimensional array, and even better, how to iterate from the last
found
match to the end of the array each time?

I'm thinking something like:

Dim SourceArray (1 to 10,000, 1 to 50)
Dim CheckArray (1 to 40,000, 1 to 100)

'load the sheets, then:

For MySourceRow = 1 to 10000
SourceValue = SourceArray (MySourceRow, 14)
FoundMatchRow = Application.Match(SourceValue,
CheckArray(?,31),False)
....etc

The two problems I need to overcome are (a) how do I refer to a single
dimension of a multidimensional array (where the questionmark is- match
against all of column 31), and (b) if I find a match, how do I make a
subsequent loop only search for matches from there forward, e.g. if a
match
is found in row 27,418, then I want to do another application.match with
the
same SourceValue for rows 27,419 through 40,000 for column 31 in my
CheckArray table.

Thanks for any help and advice!
Keith


--

Dave Peterson




Dave Peterson

application.match with multi-dimensional arrays (syntax request)
 
You may find it easier to keep the data in the range, then use excel's/VBA's
..Find command to search for what you're using.

I think that the other choice is to offset/resize the array for each subsequent
search. And I'm not sure that you would be saving time that way.

Keith R wrote:

Dave- that is a brilliant solution to finding the first match! I've pulled
the .Match(myRowKey, .Index(myArr, 0, 1), 0) apart to understand how it
works, but I'm not clear on how to force the index on subsequent loops to
only check rows that are past the last found match (looking for multiples).
Is it just an index parameter change that I'm not understanding (for part
(b) below)?

Is it possible to put in a range for one of the index values, for example
(using your example) to look for subsequent matches, it could be
.Match(myRowKey, .Index(myArr, 37 to 50, 1), 0)?

Thanks!!
Keith

"Dave Peterson" wrote in message
...
On Sheet1, I put this in A1:
=cell("address",a1)

I copied down 50 rows and across 10 columns (A1:J50).

Then I used this and it worked ok for me:

Option Explicit
Sub testme()
Dim myArr As Variant
Dim myRow As Variant
Dim myCol As Variant
Dim myColKey As String
Dim myRowKey As String

myArr = Worksheets("sheet1").Range("a1:J50").Value

myRowKey = "$a$37"
myColKey = "$e$1"

With Application
myRow = .Match(myRowKey, .Index(myArr, 0, 1), 0)
myCol = .Match(myColKey, .Index(myArr, 1, 0), 0)
If IsNumeric(myRow) _
And IsNumeric(myCol) Then
MsgBox myArr(myRow, myCol)
Else
MsgBox "at least one missing match"
End If
End With
End Sub

I got $E$37 back and that's what I expected.



Keith R wrote:

I have two large arrays (which are actually worksheets that have been
loaded
into memory for faster processing); I cycle through every 'row' in the
first
array to get a source value, then I cycle through every value in one
'column' of the second array to find /every/ match of that value.

Due to the size of my arrays, this takes a long time (about 10 minutes).
It
seems that if I could use application.match, this could speed things up
considerably.

Can anyone suggest syntax for using application.match against a
multidimensional array, and even better, how to iterate from the last
found
match to the end of the array each time?

I'm thinking something like:

Dim SourceArray (1 to 10,000, 1 to 50)
Dim CheckArray (1 to 40,000, 1 to 100)

'load the sheets, then:

For MySourceRow = 1 to 10000
SourceValue = SourceArray (MySourceRow, 14)
FoundMatchRow = Application.Match(SourceValue,
CheckArray(?,31),False)
....etc

The two problems I need to overcome are (a) how do I refer to a single
dimension of a multidimensional array (where the questionmark is- match
against all of column 31), and (b) if I find a match, how do I make a
subsequent loop only search for matches from there forward, e.g. if a
match
is found in row 27,418, then I want to do another application.match with
the
same SourceValue for rows 27,419 through 40,000 for column 31 in my
CheckArray table.

Thanks for any help and advice!
Keith


--

Dave Peterson


--

Dave Peterson

Alan Beban

application.match with multi-dimensional arrays (syntax request)
 
If the functions in the freely downloadable file at
http://home.pacbell.net/beban are available to your workbook, the
following will cycle through the row numbers:

x = Application.Count(ArrayMatch(SourceValue, _
Application.Index(CheckArray, 0, CheckArrayColNo)))
For i = 1 To x / 2
Debug.Print ArrayMatch(SourceValue, CheckArray)(i, 1)
Next

Alan Beban

Dave Peterson wrote:
You may find it easier to keep the data in the range, then use excel's/VBA's
.Find command to search for what you're using.

I think that the other choice is to offset/resize the array for each subsequent
search. And I'm not sure that you would be saving time that way.



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

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