Home » excel » excel – How can I do my index/match to work in VBA?

excel – How can I do my index/match to work in VBA?

Posted by: admin April 23, 2020 Leave a comment

Questions:

I’m trying to create a macro that uses Index/match functions to match and pull data from one sheet into another. I did it in Excel and it works perfect. However the reports are “dynamic” (the size changes) so I need the last row of my code to be dynamic as well.
The following is what I have done. I’m NOW getting a “type mismatch” error (I emphasize “now” since every time I find a solution for one error another pop’s up).

   Dim prosheet As Worksheet

   Dim prosheet2 As Worksheet

   Set prosheet2 = ThisWorkbook.Sheets("shipstation")

   Set prosheet = ThisWorkbook.Sheets("macrotestfb")

   lr1 = prosheet.Cells(Rows.Count, 1).End(xlUp).Row

   lr2 = prosheet2.Cells(Rows.Count, 1).End(xlUp).Row

   lrship = prosheet.Cells(Rows.Count, 10).End(xlUp).Row

   lrindex = prosheet2.Cells(Rows.Column, 14).End(xlUp).Row

   'CALCULATE SHIPPING COST

   For x = prosheet.range("j6") To lrship

       x = Application.WorksheetFunction.Index(prosheet2.range("a1:n" &  lrindex), Application.WorksheetFunction.Match(prosheet.range("a6:a" & lr1), prosheet2.range("a1:a" & lr2), 0), prosheet2.range("f2"))

   Next x
How to&Answers:

Match, in its non array form, only likes one value in the first criterion and not a range.

Also WorksheetFunction.Match will throw an error that will stop the code if a match is not found.

I like to pull the match into its own line and test for the error.

I also adjusted your For statement.

There is no detriment to searching an entire column so I got rid of a few of you last row searches as they are not needed.

Dim prosheet As Worksheet
Dim prosheet2 As Worksheet
Dim x As Long
Dim t As Long
Set prosheet2 = ThisWorkbook.Sheets("shipstation")
Set prosheet = ThisWorkbook.Sheets("macrotestfb")

lrship = prosheet.Cells(Rows.Count, 1).End(xlUp).Row

'CALCULATE SHIPPING COST

For x = 6 To lrship
    t = 0
    On Error Resume Next
        t = Application.WorksheetFunction.Match(prosheet.Range("A" & x), prosheet2.Range("A:A"), 0)
    On Error GoTo 0
    If t > 0 Then
        prosheet.Cells(x, "J").Value = prosheet2.Range("F"&t)
    Else
        prosheet.Cells(x, "J").Value = "Item does not Exist"
    End If
Next x

Answer:

Note:

Instead of an Index/Match combo which you might use on the worksheet, you can use Application.Match in VBA. Something like this:

Sub GetMatch
    Dim indexRng As Range, matchRng as Range

    Set indexRng = ThisWorkbook.Worksheets("Sheet1").Range("A1:A10")
    Set matchRng = ThisWorkbook.Worksheets("Sheet1").Range("B1:B10")

    debug.print indexRng.Cells(Application.Match("something",matchRng,0)).Value
End Sub