Re: vlookup items in an array

Tech-Archive recommends: Repair Windows Errors & Optimize Windows Performance



The other thing is that VLookup won't work with arrays of more than 65336 rows.
Just to show that a binary search is indeed much faster (but the array will hvae to be sorted) this code:

Option Explicit
Private lStartTime As Long
Private lEndTime As Long
Private Declare Function timeGetTime Lib "winmm.dll" () As Long

Sub StartSW()
lStartTime = timeGetTime()
End Sub

Sub StopSW(Optional ByRef strMessage As Variant = "")
lEndTime = timeGetTime()
MsgBox "Done in " & lEndTime - lStartTime & " msecs", , strMessage
End Sub

Sub speedtest()

Dim i As Long
Dim c As Long
Dim r As Long
Dim lValue As Long
Dim arr2() As Long

On Error GoTo ERROROUT

r = 65536
lValue = 30000

ReDim arr2(1 To r, 1 To 2) As Long

For i = 1 To r
For c = 1 To 2
arr2(i, c) = i + c - 1
Next
Next

StartSW
lValue = arr2(BinarySearchLong(lValue, 1, arr2), 2)
StopSW lValue

lValue = 30000

StartSW
For i = 1 To r
If arr2(i, 1) = lValue Then
lValue = arr2(i, 2)
Exit For
End If
Next
StopSW lValue

lValue = 30000

StartSW
lValue = WorksheetFunction.VLookup(lValue, _
arr2, _
2, _
True)
StopSW lValue

Exit Sub
ERROROUT:

MsgBox Err.Description & vbCrLf & _
"Error number: " & Err.Number, , ""

End Sub

Function BinarySearchLong(ByVal lLookFor As Long, _
ByVal lSearchCol As Long, _
ByRef lArray As Variant, _
Optional ByVal lNotFound As Long = -1) As Long

Dim lLow As Long
Dim lMid As Long
Dim lHigh As Long

On Error GoTo ERROROUT

'Assume we didn't find it
BinarySearchLong = lNotFound

'Get the starting positions
lLow = LBound(lArray)
lHigh = UBound(lArray)

Do
'Find the midpoint of the array
lMid = (lLow + lHigh) \ 2

If lArray(lMid, lSearchCol) = lLookFor Then
'We found it, so return the location and quit
BinarySearchLong = lMid
Exit Do
Else
If lArray(lMid, lSearchCol) > lLookFor Then
'The midpoint item is bigger than us - throw away the top half
lHigh = lMid - 1
Else
'The midpoint item is smaller than us - throw away the bottom half
lLow = lMid + 1
End If
End If

'Continue until our pointers cross
Loop Until lLow > lHigh

ERROROUT:

End Function


RBS


"Spike" <Spike@xxxxxxxxxxxxxxxxxxxxxxxxx> wrote in message news:25C72FEA-66FA-4920-9985-444C49003F6B@xxxxxxxxxxxxxxxx
i have a long list of codes in one column and would like to convert them to
new codes by looking them up in a separate worksheet. As i am pushed for
memory i thought i would change to the new codes by putting the old codes
into an array, then looking up each item in the array and then placing the
new codes back on the worksheet in place of old code that was originally
looked up. The problem as i see it is that it is a sort of circular
reference so i do not think it will work. I can get the items into and out
of the array no problem, it is just the code for the one line part when the
element of the array looks itself up using a vlookup that i would be grateful
for, if it will indeed work! something along the following lines

NewCodes(intA) = vlookup(NewCodes(intA), variable holding spreadsheet range
etc, 2,false)

Any ideas will be very gratefully received.

with kind regards

Spike

.



Relevant Pages

  • Re: Dynamic Array not response
    ... Dim TargetRng As Range ... After several attempts to run the codes below, ... last row of data only (ie only response to last row in this array ... Dim iNextRow As Long ...
    (microsoft.public.excel.programming)
  • Re: A few VBA questions - long post!
    ... Dave Peterson wrote: ... Dim MarginString As String ... >> letter codes above are airport codes. ... I have an array of these codes ...
    (microsoft.public.excel.misc)
  • Re: vlookup items in an array
    ... The other thing to mention here is that just looping through the array is much faster than doing a VLookup. ... Then run the Sub speedtest. ... Dim lValue As Long ... new codes by looking them up in a separate worksheet. ...
    (microsoft.public.excel.programming)
  • Re: vlookup items in an array
    ... Dim i As Long ... End Sub ... new codes by looking them up in a separate worksheet. ... into an array, then looking up each item in the array and then placing the ...
    (microsoft.public.excel.programming)
  • How to output an array in Excel with a user-defined function?
    ... I want to write a user-defined function to output an array. ... know its codes. ... Function MyFunction ... dim X As Integer ...
    (microsoft.public.excel)