Excel實戰技巧53: 在VBA程式碼中使用工作表公式更有效地實現查找

  • 2019 年 10 月 5 日
  • 筆記

excelperfect

在工作表中查找值是很常見的操作,我們可以使用VLOOKUP函數、MATCH函數、INDEX函數等來查找值。當使用VBA程式碼在大量的數據中進行查找操作時,靈活運用工作表公式,往往能夠提高效率。

下圖1所示的工作表,要在列G中查找列A中的值,如果找到則將G列中相應行對應的列H中的值複製到列A中相應行的列B中。

圖1

例如,單元格A2中的「磚基礎」與單元格G3中的值相同,則將單元格H3中的值複製到單元格B2中,如下圖2所示。

圖2

首先,定義一個動態名稱,以便列G中添加項目時能夠自動更新。

名稱:LookupRange

引用位置:=OFFSET(Sheet1!$G$2,0,0,COUNTA(Sheet1!$G:$G)-1)

接著,在VBE的標準模組中輸入程式碼:

Sub CopyData()

Dim lLastRowA As Long

Dim rngA As Range

Dim rngValueA As Range

Dim lRow As Long

'列A中有數據的最後一行的行號

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

'設置需要處理的數據區域

Set rngA = Range("A2:" &"A" & lLastRowA)

'遍歷需要處理的數據區域

For Each rngValueA In rngA

'使用工作表函數查找數據所在的行並返回行號

lRow = Application.WorksheetFunction. _

Match(rngValueA, [LookupRange], 0) +1

'如果找到則進行相應的操作

If lRow > 0 Then

Range("B" &rngValueA.Row) = Range("H" & lRow)

lRow = 0

End If

Next

End Sub

常規操作是使用兩個循環來查找值,即在第一個For Each循環中再使用一個For Each循環遍歷列G中的內容來查找,但使用工作表公式使得程式程式碼更簡潔,效率更高。

說明:本文的例子只是演示公式在VBA中的運用。其實,本例在工作表中使用VLOOKUP函數也很容易。