F099 Vlookup関数で参照行の左の列を返す関数

EXCEL自作関数

Excel自作 VBA 関数 

特定のデータを検索するVLOOKUP関数に検索列より左の列の値を抽出できる機能を追加した関数です、これを使えばMATCH関数とINDEX関数を組み合わせて左の列の値を抽出する必要がなくなります。XLOOKUPを目指して作りました。

VBEの標準モジュールに下のコードを登録して「Excelマクロ有効フォーム」で保存してください。
関数の登録方法は⇒♯000 ユーザー定義関数を登録する方法

登録されたら、シート上からユーザー関数「VLOOKUP2」が使用できます。
使い方は 
ワークシート上で = VLOOKUP2(検索値, 範囲, 列番号(-の場合は検索値の列より左列), 検索の型)の関数として使用することで、 選択範囲より左の列の値を抽出できます。

VLOOKUP2(検索値, 範囲, 列番号(-の場合は検索値の列より左列), 検索の型)
特定のデータを検索するVLOOKUP関数で検索列より左の値も抽出できる関数。
検索列より右列を抽出する場合は列番号、左列を検索する場合は-(マイナス)の列番号を指定する。
検索列の1列左は-1,3列左は-3
検索の型 True は近似値 Falseは完全一致

[例]
VLOOKUP2(1,C1:E5,-2,FALSE)
1を完全一致の検索値にして、C1列を検索2列左であるA列の値を抽出する。

Function VLOOKUP2(Value As Variant, Select_Range, Col_index As Long, Optional Range_lookup As Boolean = False)
' 特定のデータを検索するVLOOKUP関数で検索列より左の値も抽出できる関数。
' 検索列より右列を抽出する場合は列番号、左列を検索する場合は-(マイナス)の列番号を指定する。
' VLOOKUP2(検索値, 範囲, 列番号(-の場合は検索値の列より左列), 検索の型)
' 検索列の1列左は-1,3列左は-3
' 検索の型 True は近似値 Falseは完全一致

Dim Select_Range1 As Variant
Dim Select_Range2 As Variant
Dim Select_Cells As String
Dim RS As String
Dim RE As String
Dim AD As String
Dim BookSeet As String
Dim Book As String
Dim Sheet As String
Dim SR As Long
Dim SC As Long
Dim ER As Long
Dim EC As Long
Dim i As Long

On Error GoTo EXITFUN

Select_Cells = Select_Range.Address(ReferenceStyle:=xlR1C1)

AD = Select_Range.Address(External:=True)

If Mid(AD, 3, InStr(AD, ".") - 4) <> ActiveWorkbook.Name Then
Book = Mid(AD, 3, InStr(AD, "]") - 3)
End If

Sheet = Mid(AD, InStr(AD, "]") + 1, InStr(AD, "!") - (InStr(AD, "]") + 1) - 1)

If InStr(Select_Cells, ":") = 0 Then
Select_Cells = Select_Cells & ":" & Select_Cells
End If

RS = Mid(Select_Cells, 1, InStr(Select_Cells, ":") - 1)
RE = Mid(Select_Cells, InStr(Select_Cells, ":") + 1)

If InStr(RS, "R") > 0 And InStr(RS, "C") > 0 Then
 SR = Mid(RS, InStr(RS, "R") + 1, InStr(RS, "C") - InStr(RS, "R") - 1)
 SC = Mid(RS, InStr(RS, "C") + 1)
ElseIf InStr(RS, "C") > 0 Then
 SR = 1
 SC = Mid(RS, InStr(RS, "R") + 1)
ElseIf InStr(RS, "R") > 0 Then
 SR = Mid(RS, InStr(RS, "R") + 1)
 SC = 1
End If

If InStr(RE, "R") > 0 And InStr(RE, "C") > 0 Then
 ER = Mid(RE, InStr(RE, "R") + 1, InStr(RE, "C") - InStr(RE, "R") - 1)
 EC = Mid(RE, InStr(RE, "C") + 1)
ElseIf InStr(RE, "C") > 0 Then
 ER = 1048576
 EC = Mid(RE, InStr(RE, "R") + 1)
ElseIf InStr(RE, "R") > 0 Then
 ER = Mid(RE, InStr(RE, "R") + 1)
 EC = 16384
End If

If SC > 1 Then
 Select_Range2 = range(Workbooks(Book).Sheets(Sheet).Cells(SR, 1), _
 Workbooks(Book).Sheets(Sheet).Cells(ER, SC - 1))
End If

If Abs(Col_index) > UBound(Select_Range2, 2) Then
 GoTo EXITFUN
End If

Select_Range1 = Select_Range

If Range_lookup = False Then

For i = 1 To UBound(Select_Range1, 1)
 If Value = Select_Range1(i, 1) Then
  Exit For
 End If
Next

Else

For i = 1 To UBound(Select_Range1, 1)
 If Value = Select_Range1(i, 1) Then
  Exit For
 ElseIf i > 1 And Value < Select_Range1(i, 1) Then
  i = i - 1
  Exit For
 End If
Next

End If

If SC > 1 And Col_index < 0 Then
VLOOKUP2 = Select_Range2(i, UBound(Select_Range2, 2) + 1 + Col_index)
Else
VLOOKUP2 = Select_Range1(i, Col_index)
End If

Exit Function
EXITFUN:
VLOOKUP2 = CVErr(xlErrNA)
End Function

ここで紹介したコード使用による損害に対しては一切責任は負えません。