Functionは、決して、消費税の計算や、合否判定を行うためにあるわけではありません。
ルーティンワークで、必ず活躍してくれるのが、Functionです。
目次
Functionで、コードを短くする
こんにちは。伊川(@naonaoke)です。
今回は前回の続きになります。
記事差し込み
引数が、複数の場合、戻り値がある場合など、
むしろ、普通にコードを記載したほうが、コードが短くなる場合が多かったですね。
しかし、今を見るのではなく、3ヶ月先を見るのです。
その3ヶ月後に、きっとスキルは上がっています。
VBAはもともと、究極のルーティンワークをExcelに実行させるのです。
だから、繰り返しは、ループ、同じことを実行させるのは、Function です。
このブログはこんな人にお勧め
- ExcelVBAを勉強している人
- Functionを勉強している人
- Functionが、イマイチ理解できていない人
このブログを、読み終わるころには・・・・
世の中の例えがよくないと思います。
Functionの利用方法は、もっと便利なはずです。
その作成方法を理解できると思います。
Functionの作成
前回は、企画的カンタンなものを紹介しました。
今回は少しだけ難しくなります。
でも、ほんの少しだけなので、頑張っていきましょう。
できるだけ、わかりやすく説明したいと思います。
Functionでコードを短くする 作業手順 その1 戻り値にオブジェクトを指定する方法
戻り値は、今までは、Hello VBA!でした。
この戻り値を、オブジェクトに変更します。
この場合は、Setステートメントを使用します。
Sub macro5() Dim str As String Dim range As range str = "A1" Set range = obj(str) range.Value = "Hello VBA!" End Sub Function obj(ByVal str As String) As range Set obj = range(str) End Function
このコードを実行すると、セルA1にHello VBA!と表示されます。
このコードに何の意味があるのか謎だと思います。
Range(“A1”)の、A1をFunctionで記載しています。
Range(“A1”)=” Hello VBA!” と記載すれば済むので、実務では、意味がないと思います。
では、少しアレンジしてみましょう。
Sub macro5() Dim str As String Dim Range As Range Dim i As Long maxrow = Cells(Rows.Count, "A").End(xlUp).Row For i = 1 To maxrow str = "B" & i Set Range = obj(str) Range.Value = "Hello VBA!" Next i End Sub Function obj(ByVal str As String) As Range Set obj = Range(str) End Function
赤枠は、同じ意味になります。
そもそも、Range自体が、オブジェクトなので、このような指定をします。
Functionでコードを短くする 作業手順 その2 Functionを作成する
本来でしたら、参考にしたサイトでは、配列とFncutionの解説になります。
しかし、良いサンプルを作成できなかったので、実際にFncutionを作成してみようと思います。
長いコードをどれだけ短くできるか、堪能してみてください。
Functionでコードを短くする 作業手順 その3 引数ってなんだ?
引数って言うから、数字のような気がしますよね。
違います。
私の場合は、ここが最初は理解できませんでした。
例えば、IF関数の場合は、Excelで上記のように表示されます。引数とは、関数を利用するために、必要最低限の情報です。
IF関数に関しては、引数が最大で、3つあります。
中には、引数を省略できる関数もあります。
つまり、数字ではないということに、気が付かないとFncutionはいつまでたっても利用できません。
自作する関数にどのようなルーティンワークをさせたいのかを考えます。
Functionでコードを短くする 作業手順 その4 サンプルコードを考える
サンプルコードの内容は、
A列の中で、特定の文字を探す。
特定の文字を発見したら、そのセルを選択する
その選択したセルの、1つ右隣を、シート2の特定のセルへ転記する
この内容です。
では、関数を作動させるための、根幹となる動きはどの部分でしょうか?
それは、A列の中で、特定の文字を探す、です。
転記、セルを選択するというのは、オプションで、サラダバーや、ドリンクバーのようなもので、引数にはなりません。
Functionでコードを短くする 作業手順 その5 実際のコード
Sub test2() Worksheets("sheet2").Range("B9").Value = _ Found("AAAA", Worksheets("Sheet1").Range("A:A")).Value Worksheets("sheet2").Range("B10").Value = _ Found("bbbbb", Worksheets("Sheet1").Range("A:A")).Value End Sub Function Found(xWord As String, xRange As Range) As Range Set Found = xRange.Find(xWord, LookAt:=xlWhole).Offset(, 1) End Function
このようなコードになります。
このように対比してみたら、理解できると思います。
ここがポイント
サンプルコードから、わずか4行になりました。
そして、汎用性もできました
こんなにも、短くなるなんて!
これって感動じゃないですか?
今回も、コードの可読性がないと、正解にたどり着けないですよね。
外国語と一緒で、初めから理解できる人はいません。
外国語は、ヒヤリングが効果的ですが、コードをヒヤリングはできません。
だから、コードを理解できなくても、見る事、眺める事が重要なのです。
まとめ
今回のコードは、Findを利用しているため、あまりお勧めできるコードではありません。
つまり、他のコードに比べて、時間がかかります。
また、やっていることは、VLOOKUPと同じです。
私は、VLOOKUPが嫌いなので・・・・・・・・
今回も最後まで読んでいただきありがとうございました。
今回のサンプルファイルは、No261です。
わからない事を延々と考えるのは、無駄です。
- なんで作動かないの?
- もうやだ!VBAなんか嫌い!
- ネットで調べても情報がない!
必ず作動するコードが、ここにあります。