繁体   English   中英

vba excel vlookup使用数组

[英]vba excel vlookup using arrays

我有下面的代码,可以工作,但是有点慢,我想做同样的事情,但使用数组

Sub AddValues()
 Dim Srng As Range
 Dim search_value As Variant

  PG = "Data"
  Ln = 2

  Set Srng = Worksheets("Coniguration").Range("_Configuration")
  LastRow = Worksheets("Data").Range("A1").CurrentRegion.Rows.Count

    For Ln = 2 To LastRow
     search_value = Val(ActiveWorkbook.Sheets(PG).Cells(Ln, "A").Value)
      ActiveWorkbook.Sheets("Data").Cells(Ln, "CA").Value = Application.VLookup(search_value, Srng, 3, False)
      ActiveWorkbook.Sheets("Data").Cells(Ln, "CB").Value = Application.VLookup(search_value, Srng, 4, False)
      ActiveWorkbook.Sheets("Data").Cells(Ln, "CC").Value = Application.VLookup(search_value, Srng, 5, False)
      ActiveWorkbook.Sheets("Data").Cells(Ln, "CD").Value = Application.VLookup(search_value, Srng, 6, False)
      ActiveWorkbook.Sheets("Data").Cells(Ln, "CF").Value = Application.VLookup(search_value, Srng, 7, False)

    Next Ln
End Sub

缓慢的一个可靠来源是,您在每次迭代中进行了5次相同的搜索。 相反,您只能找到匹配的行一次,然后从匹配的行中复制单元格。 同样有趣的是,一次获取工作表引用,并避免在每次迭代中都使用Worksheets(name)获取工作Worksheets(name)

Sub AddValues()
  Dim Srng As Range, Ln As Long, matchRow, search_value
  Set Srng = Worksheets("Configuration").Range("_Configuration")

  With Worksheets("Data")
    For Ln = 2 To .Cells(.Rows.count, "A").End(xlUp).row
      search_value = val(.Cells(Ln, "A").Value2)

      ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '
      ' Find matching row only once and copy the results
      matchRow = Application.match(search_value, Srng.Columns(1), 0)
      If IsError(matchRow) Then
        Debug.Print search_value & " : Not found"
      Else
        .Cells(Ln, "CA").Resize(, 4).value = Srng.Cells(matchRow, 3).Resize(, 4).Value2
        .Cells(Ln, "CF").value = Srng.Cells(matchRow, 7).Value2
      End If
    Next Ln
  End With
End Sub

这是一种避免循环的方法。 首先,它在目标单元格中​​输入公式,然后将公式转换为值。

Sub AddValues()

    Dim Srng As Range
    Dim LastRow As Long

    Set Srng = Worksheets("Coniguration").Range("_Configuration")

    With Worksheets("Data")
        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
        With .Range("CA2:CA" & LastRow)
            .FormulaR1C1 = "=VLOOKUP(RC1," & Srng.Address(, , xlR1C1, True) & ", 3, 0)"
            .Value = .Value
        End With
        With .Range("CB2:CB" & LastRow)
            .FormulaR1C1 = "=VLOOKUP(RC1," & Srng.Address(, , xlR1C1, True) & ", 4, 0)"
            .Value = .Value
        End With
        With .Range("CC2:CC" & LastRow)
            .FormulaR1C1 = "=VLOOKUP(RC1," & Srng.Address(, , xlR1C1, True) & ", 5, 0)"
            .Value = .Value
        End With
        With .Range("CD2:CD" & LastRow)
            .FormulaR1C1 = "=VLOOKUP(RC1," & Srng.Address(, , xlR1C1, True) & ", 6, 0)"
            .Value = .Value
        End With
        With .Range("CF2:CF" & LastRow)
            .FormulaR1C1 = "=VLOOKUP(RC1," & Srng.Address(, , xlR1C1, True) & ", 7, 0)"
            .Value = .Value
        End With
    End With

End Sub

非常感谢ASH和Domenic,这两种方法都比我的代码好得多。

最后,我将使用Domenic提供的一种,因为它是最快的一种。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM