VBA100本ノック 62本目を動画で解説しています。Excelの神髄さんの模範解答はコチラ
問題
#VBA100本ノック62本目
VLOOKUPは条件合致の先頭が取得されます。
この取得順番を指定できる関数を作成します。
ZLOOKUP(検索値,範囲,列番号,順番)
順番→0:先頭,-1:最後,>=1:その順番
※当該順がない場合は空白””を返す
※検索値がない場合は#N/Aを返す
※完全一致のみ対応、検索値は単一セル値限定
解答
Function ZLOOKUP(検索値, 範囲 As Range, 列番号 As Long, 順番 As Long)
ZLOOKUP = CVErr(xlErrNA)
Dim 該当数 As Long
該当数 = WorksheetFunction.CountIf(範囲.Columns(1), 検索値)
If 該当数 < 1 Then Exit Function
If 該当数 < 順番 Then ZLOOKUP = "": Exit Function
If 列番号 <= 0 Then Exit Function
If 順番 = 0 Then 順番 = 1
If 順番 < -1 Then Exit Function
If 順番 = -1 Then 順番 = 該当数
Dim i As Long, n As Long
For i = 1 To 範囲.Rows.Count
If 範囲.Cells(i, 1).Value = 検索値 Then
ZLOOKUP = 範囲.Cells(i, 列番号).Value
n = n + 1
End If
If n = 順番 Then Exit For
Next i
End Function
■考え方・流れ
0:00 冒頭・問題確認
2:31 ZLOOKUPというファンクションを作成
5:12 ファンクションを抜ける条件を決める
7:18 ZLOOKUP関数を完成させる
普通のVLOOKUPでは上からしか取得できないけど…
上から何番目に合致したかを判定する関数を作りたいってこった!


面白そうな問題ですね!

そうか?
吉本新喜劇のほうが面白そうだぞ!

…
ZLOOKUPというファンクションを作成
さて!じゃあまずは…
ZLOOKUPっていう関数を作成するぞ!!
ファンクションプロシージャを作ればよかったな!

型も決めるぞ!!
範囲だけはRangeで確定な!!他はVariantでもいいかなぁ~

そしたらお次は…
まずはエラーをぶち込んで上げとこう!
エラーってのは表示してあげた方が親切だからな!!

実行結果↓

そしたらまずは…
検索範囲にいくつ検索値があるかどうかを変数にして…

該当する個数が1未満だった場合は速攻でファンクションを抜ける!

後はこんな感じで…
どんどん条件を書いていってあげりゃOKっすわ!!

ファンクションを抜ける条件を決める
よし!そしたらここからは!
ファンクションを抜ける条件をガンガンに決めていっちゃうぞ!!
色んな計算が入る前に抜けたい!!その方が若干処理が早くなるかもね!

順番がマイナス2以下だった時も抜けとこう!!

よし!ここからは問題文の条件を実装していくぞ!!!
まずは…順番が該当数未満だった場合…
こういう場合は、エラーにせず、空白をZLOOKUPに代入してからファンクションを抜けよう!

後はだな…後々使う”順番”って変数に、ちょこっと工夫してあげてターンエンド!!

ZLOOKUP関数を完成させる
よし!最後に!!
ZLOOKUP関数を完成させて終わりにするぞ!!!
基本的にはVLOOKとおんなじなんだけど…
Zダカラネ!少し工夫しなければ!

ま、これは書き終わったコードを見たほうがイメージつきやすいと思う!!
ドドドっと進めるぞ!!



実行結果↓

こんな感じでサササッと作れるようになるとアツいですね~!

お疲れさ麻婆豆腐!

お疲れさまでした!
あとがたり
おはこんばんちは。uぷ主です。
62本目、VLOOKUPの強化版の関数を作成する問題でした!
ま、強化版とは言っても…
こちとら素人がダラダラとコードを書いてるだけだから…
本家のVLOOKUPのほどの速度も出ないでしょうし…
本家にゃ~遠く及ばないっすね。
だがしかし!!
シート上で使えるファンクションを自作できるってところが大事だからね!!
今までも職場でかなり生きてきたからね!!
だけど…こういうのって職場で共有しても、
マクロを強制的に使用しない設定にしてる人が多くて…
NAME?的なエラーになることが多いんですけどね…
マクロに対する温度感の違いってやつか…
コメント