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関数に関しては、引数が最大で、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なんか嫌い!
- ネットで調べても情報がない!
必ず作動するコードが、ここにあります。