目次
VBAでIndex Match関数を再現する
こんにちは。伊川(@naonaoke)です。
上の記事、動画ですが、結構な勢いで再生されました。
現時点で、視聴回数 236,624回です。
一発屋なのですね。
今回は、関数をVBAで再現します。
問題提起
(株)IKAWAの柄久 瀬瑠子(エク セルコ)は上司から下記の依頼を受けました。
VBAでVLOOKUP関数のようなことはできないのか?
どのよなコードを記載するのか?
解決策
・Application.WorksheetFunctionで、ワークシート関数を使う。
Application.WorksheetFunction
Applicationは省略できます。
しかし、すべてのワークシート関数が使えるわけではありません。
WorksheetFunctionというクラスに、WorksheetFunctionメンバーに格納されている関数が使えます。
今回は、XLOOKUPを赤枠で囲みました。
XLOOKUPは、当初は、VBAで使えなかったようですが、WorksheetFunctionメンバーに格納されていて、びっくりです。
ちなみに、この辺の知識は、クラスモジュールにつながります。
WorksheetFunctionを使う 作成手順その1 データ ベース確認
上の数式をVBAで再現します。
WorksheetFunctionを使う 作成手順その2 コード解説
Sub test2() Dim ws As Object Dim ws2 As Object Set ws = Worksheets("原本") 'wsというObjectにWorksheets("原本")をセット Set ws2 = Worksheets("転記") 'ws2というObjectにWorksheets("転記")をセット 'WithステートメントでApplication.WorksheetFunctionを、まとめる With Application.WorksheetFunction 'VBAでワークシート関数を使うおまじない myR = .Index(ws.Range("A:A"), .Match(ws2.Range("A1"), ws.Range("B:B"), 0)) '=INDEX(原本!$A:$A,MATCH(転記!A:A,原本!B:B,0)) 関数で記載する If IsError(myR) = True Then 'エラー判定が出たら、 ws2.Range("B1") = "該当無" '該当無と表示する Else ws2.Range("B1") = myR 'そうじゃなかったら、myRを表示する End If End With End Sub
WorksheetFunctionを使う 作成手順その3 WorksheetFunctionの欠点
WorksheetFunctionは、確かに便利なのす。
ただし、この辺りを使いすぎると、VBAを使いこなすことができません。
考え方が、ワークシート関数と同じだからです。
なるべく、配列等で記載することが、VBAスキルアップにつながります。
コードを記載していくと理解できるのですが、コードが長くなり、利便性を感じません。
きっちり、コンピュータ言語的に記載していくことが、大切です。
ここがポイント
VBAを使いこなそうとするときに、関数をVBAで表現したら、どうなるのか考えましょう。WorksheetFunctionが慣れてきたら、配列等で表現できるように考えましょう。
まとめ
今回は、伊川の人気?の動画をVBAで表現しました。VBAのスキルアップのために、伊川と一緒にがんばりましょう。。
今回のサンプルファイルは、No115です。
わからない事を延々と考えるのは、無駄です。
- なんで作動かないの?
- もうやだ!VBAなんか嫌い!
- ネットで調べても情報がない!
必ず作動するコードが、ここにあります。