おしゃれにいけてる?

散歩やお買い物のことなどを書いています・・・

Entries

 EXCEL VBA TIPs. [ 関数 Function Procedure の作り方。]

 VBA マクロで、 Sub プロシジャーだけでプログラムを書いてると、見通しが悪く、ワケが分かんなくなってくる。

直接実行する以外は、Function Procedure (以下、関数と呼ぶ。)だけで書くぐらいの気持ちでやると、ソースコードも読みやすく整理される。関数定義のとこに、詳しいコメントも書いておけるし。

 関数の値は、関数と同じ名前の変数に値を設定することで、戻り値を返すことが出来る。

  Public Funcion test()
    test = Range("A1").Value
  End Fucntion

ここで注意しないといけないのは、この関数の書き方だと、関数の戻り値が、

  Variant Valiant

になってしまうこと。

関数の型がハッキリ決まらないと、思いがけないエラーの原因になるので、次の様にして、戻り値の型をハッキリ決める様にした方がいい。

たとえ、Variant Valiant 型の方が、ソースコードが短くなろうとも、ゼッタイ!

  'ここに関数の情報を書いておくのがベスト。
  Public Function getNumber()
   getNumber = Range("A1").Value
  End Function

  Sub Macro1()
   Dim ans As Integer
   ans = getNumber() + 1
  End Sub

この例で、Macro1 を実行すると、セル A1 の値が 1とかの数字の場合は問題ない。ところが、"AAA"とかだと、ans = の行で、

   「型が一致しません。」

とエラーになってしまう。

セル A1 の値を取ってるのは getNumber() なので、そこがしっかり Integer を返さないと、至る所にエラー処理を入れなくてはならなくなる。

で、こんな感じで、関数の戻り値の型を返すようにする。

  Public Function getNumber() As Integer
   getNumber = Range("A1").Value
  End Function

(実は、この、Function Procedure の戻り値の型を指定する方法、「 EXCEL VBA TIPs. (エラー処理ざんまい)」の記事を書いた時点では知らなかった。)

このままだと、getNumber() の中でエラーが起こるので、次のようにエラー対策をする。GOTO分を使っても、短い関数の中だと、見通しが良くなってバグになりにくい。

  Public Function getNumber() As Integer
   On Error GoTo ERROR
   getNumber = Range("A1").Value
   Exit Function
  ERROR:
   getNumber test = 0
  End Function

( A1の値を取る前に、データ種別を判別しろよ、って言うのは、別の話題って事で。46)

 関数は、数値を返すだけかと思ってたら、オブジェクトも返してくれる。

  Public Function getArea() As Range
   getArea = Range("A1:B2")
  End Function

こんな感じ。

このオブジェクトを返す方法、他のワークブックをオープンする関数で、Workbook オブジェクトを返すようにすると、かなり便利に使える。

 Funcion Procedure の引数で、忘れやすい TIPs が、

  値渡し:ByVal 変数名 As データ型(デフォルト)
  参照渡し:ByRef 変数名 As データ型(デフォルト)

自分でも手を抜いてやりがちなのが、バッファとか配列、そのアクセスインデックス、をグローバルで定義して、それを関数で処理してしまうこと。

それだと、いろいろな関数から勝手に呼ばれてしまうのでバグの原因になる。ローカル変数として定義して、参照渡しするのがいい。はず。

スポンサードリンク

Comment

Comment_form

管理者のみ表示。

左サイドメニュー

プロフィール

Author:ジョニー

ゆるゆると日々を過ごしてしまう、ダメダメ野郎の航海日記。



クリック (・。・)yoro

このブログ内を検索

最近の記事

カテゴリー

最近のコメント

QRコード

QRコード

月別アーカイブ

右サイドメニュー

カレンダー

02 | 2020/03 | 04
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -

スポンサードリンク

FC2カウンター

#1411