[[20110903041138]] 『ワークシート関数の使用方法』(ム所十) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ワークシート関数の使用方法』(ム所十)
 エクセルのヘルプや解説本をみますと、ワークシート関数をマクロ上で使用する場合
 application.worksheetfunctionと書いてありますが、application.でも支障ないよう
 です。ExecuteExcel4macro.でもいいようです。(後の二つはここで教えていただきま
 した。改めて、お礼申し上げます。)どこが違って、どのように使い分けれ
 ばいいのでしょうか。拙のコード程度では気にする必要はなさそうですが、どうにも
 気になります。(我ながらつまらない性格です) よろしくご教授お願いします。
 (毎度のことですが、あまり難しくない範囲でお願いします。)


 Application.WorksheetFunction.関数名 という書き方は、(時々)見かけるし、間違ってはいない。
というか、正式には、この記述が正しいんだけど、普通は、単に、WorksheetFunction.関数名 と書くし
そのほうが、Application.関数名 と書くものと、見た目で区別しやすくわかりやすい。
ここでいうApplicationとはエクセルのこと。で、エクセルVBAで使う様々なものは、ほとんどが
エクセルが提供してくれる「箱」に入っている。この箱のことを「クラス」といったり「コレクション」
といったりする。(「クラス」モジュールのクラスとは、ちょっと違う。まぎらわしいけど)

 ちょっと脱線。
山田さんの家に遊びに行って、そこにリカちゃんという女の子がいたとする。
会話の中で、「ねぇねぇ、リカちゃん・・」と呼びかけることはあっても
「ねぇねぇ山田さんちのリカちゃん・・・」と呼びかけはしないね。一般的に。

 で、このApplicationクラスという、大きな箱の中には、様々な材料の他に、「小箱」もあって
その「小箱」にも様々な材料がはいっている。この小箱の1つにWorksheetFunctionクラスがある。

 当初は、このWorksheetFunctionクラスは存在せず、VBAで使える関数は、すべてApplicationクラスという
大箱に直接はいっていた。(もちろん、今もある)
で、いつのころか、それら関数を別の小箱を作って整理しようということでWorksheetFunctionクラスを作って
「その中にも」いれた。

 で、ここからはMSの開発者じゃないので「推測」
従来Applicationクラスにあった関数を、そのままWorksheetFunctionクラスにも持って行けばいいのに
ちょっと違うものをもっていった。
(あるいは同じものを持って行ったんだけど、クラスの性格で違いがでてしまうというのが正しいかな)

 エクセル上で関数を書くと、もちろん結果がでるわけだけど、その結果が #VALUE! とか #N/A といいうような
「エラー値」になることがあるよね。これはVBAで使っても、そうなる。
で、WorksheetFunctionクラスの関数の場合、「実行時エラー」となって、処理が中断する。
(多くの人が「デバッグになる」と、間違って表現している、あの状態)
一方、Applicationクラスの関数の場合は、エラー中断せず、戻り値として「エラー値」が返ってくる。
なので、後続のコードでエラーをチェックしてロジック分岐ができる。
(Matchなんかで検索して、あったかなかったかを判定できる)
エラー値の返らない関数は、両者、まったく同じものと考えてもいい。

 こんなことでご理解いただけたかな?

 (ぶらっと)


 ム所十さん、
 WorksheetFunction 関数 メソッドは xl97 からの拡張機能で、
 Application 関数 メソッドは xl95 以前のものと互換性を保つために
 残されています。
 ですので Application 関数名 メソッドは今後実装されるかどうか
 (VBA自体も)不明です。

 その他にも、Evaluate メソッドもあります。

 大きな違いは、Match/LookUp関数等で検索値が無い場合のエラー処理
 があります。

 Application 関数 メソッド/Evaluate メソッドはエラー値を返しますが
 WorksheetFunction/ExecuteExcel4Macro では実行時エラー(Runtime Error)
 が発生します。
 (seiya)

 >application.worksheetfunctionと書いてありますが、application.でも支障ないようです。

 全く同じと云う訳ではないです。 
 片一方はエラーになり、もう一方は値をチャンと返す場合もあります。

 Sub test()
 Dim aa    ’配列格納用
 Dim bb, cc  ' 返り値格納用

     aa = Array(2, 5, 9)

     '同じと感じるケース
     bb = Application.Match(5, aa)
     cc = WorksheetFunction.Match(5, aa)

     '全然違う結果が出るケース
     bb = "初期値"
     cc = "初期値"

     On Error Resume Next                      'エラーの場合、無視して処理を継続
         bb = Application.Match(aa, aa)        '配列 {1,2,3} が返ります
         cc = WorksheetFunction.Match(aa, aa)  'エラーになるので、CCは"初期値"のまま
     On Error GoTo 0

 End Sub

 (半平太) 2011/09/03 15:42

 なるほど・・・・
 拙が組めるマクロ程度では、やはり気にしなくてもいいようです。
 勉強して出直して参ります。
 ありがとうございました。

 ”エラー値を返す”と”実行時エラー”はまったく別モノということを再確認しまた。

 >後続のコードでエラーをチェックしてロジック分岐ができる。
 エラーが出ると、深呼吸してパソコンを呪詛する言葉を呟くのが拙のヤリカタですが、
 パソコンに謝っておきましょう 

 >エラー値の返らない関数は、両者、まったく同じものと考えてもいい。
 ひとつの計算結果をだすのに、いろいろな方法があるのはよいことだと思うものの
 エクセルの場合、少し多すぎて、過ぎたるはナントヤラという気がしないでもない
 とくに、初心者にとっては迷う元になっているような・・・
 (拙だけではないですよね   ~~;)

(ム所十)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.