[[20230905144009]] 『VBA WorksheetFunctionの省略』(ShowRyaku) ページの最後に飛ぶ

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

 

『VBA WorksheetFunctionの省略』(ShowRyaku)

VBAワークシート関数でWorksheetFunctionが省略できるとは思っていませんでした。
しかし、WorksheetFunction.を省略した次のコードは正しく動作します。
Sub test3()
MsgBox Application.Sum(Range("A1:A10"))
End Sub

次の3つのコードはいずれも正しく動作します。
Sub test1()
MsgBox Application.WorksheetFunction.Sum(Range("A1:A10"))
End Sub

Sub test2()
MsgBox WorksheetFunction.Sum(Range("A1:A10"))
End Sub

Sub test3()
MsgBox Application.Sum(Range("A1:A10"))
End Sub

次のコードはコンパイルエラーになります。
Sub test4()
Range("A11") = Sum(Range("A1:A10"))
End Sub

CountAやAverageについても同様に3パターンのコードが正しく動作します。
WorksheetFunction.を省略できないものも多数あります。

そこで質問です。
WorksheetFunction.省略のルールがあるのでしょうか。

よろしくお願いいたします。

< 使用 Excel:Excel2019、使用 OS:Windows10 >


(ShowRyaku)です。
すみません。一部誤りがありますので訂正します。
誤:
次のコードはコンパイルエラーになります。
Sub test4()
Range("A11") = Sum(Range("A1:A10"))
End Sub

正:
次のコードはコンパイルエラーになります。
Sub test4()
MsgBox Range("A11") = Sum(Range("A1:A10"))
End Sub

よろしくお願いいたします。
(ShowRyaku) 2023/09/05(火) 14:48:38


Application.Sumは古いVersionのものだそうです。
互換性のために、今でもその書き方で使えるのでしょうけれど、
その当時になかった関数は使えないのではないでしょうか?

ご参考
https://oshiete.goo.ne.jp/qa/1341789.html

(ゆたか) 2023/09/05(火) 15:06:46


 WorksheetFunction. で利用できるワークシート関数は、
 Application. でも利用できると漠然と思っていましたが、違うんですか。
 そういう(例外的と私は思っている)代表例を教えていただけますか?

 なお、代替できるだけではなくて、ポイントはエラー時の振る舞いが違う、
 という点だと理解しています。そのあたりは、質問者さんはご存じなんでしょうか。

(xyz) 2023/09/05(火) 16:22:44


皆さん、コメントありがとうございます。
質問の発端は、Application.Sumなど、WorksheetFunctionのないコードを見かけたことです。
それで、単純にWorksheetFunctionが省略できるのか、と思ったのです。
エラーの振る舞いについては知りませんでした。

その後、調べたところ、WorksheetFunctionオブジェクトはExcel 97で追加されたようですね。

次の参考サイトが見つかりました。
https://okwave.jp/qa/q8008851.html
https://excel-ubara.com/excelvba4/EXCEL207.html
https://www.relief.jp/docs/001834.html
https://www.moug.net/tech/exvba/0150125.html

ありがとうございました。
(ShowRyaku) 2023/09/05(火) 16:53:32


 追記しておきます。

 > 互換性のために、今でもその書き方で使えるのでしょうけれど、
 > その当時になかった関数は使えないのではないでしょうか?
 そうでしょうか。
 例えばENCODEURL関数は、Excel2013で導入されたもののようで、明らかにExcel97以降のものです。
 にもかかわらず、Application.ENCODEURLは動作しますから、
 その説は正しくないように思います。

 【エラー時の動作について】
 Match関数を例にとると、ヒットしないときに、
 ・WorksheetFunction.Matchはエラーとなり、コード実行が止まります。
   On Error ステートメントを書いて対応する必要があります。
 ・一方で、Application.Matchは、そういう場合でも止まらずにエラー値を返すだけなので、
   IsErrorとかIsNumericで判定が可能です。
 どちらかと言えば、後者のほうが簡便と受け止める人が多いと見えて、
 相変わらず Application.Match系を使う人も多いです。

 ( 例えば、こちらのサイトの全文検索をすると、
    ・Application.Match は       1,011件がヒットするのに対し、
    ・WorksheetFunction.Matchは、  290件だけです。)
 両者の機能には明確な差があるので、
 新しいものに統一しようとしてもなかなか理屈どおりにいかないようです。
(xyz) 2023/09/05(火) 17:21:48

 Application.〜のもう一つの違いについて
 以前、他板でappleさんから教わりました。

 良い使用例が思いつきませんが
 下記の場合、WorksheetFunction.〜では、 
 MatchもIsNumberも配列が扱えずエラーになります。

 Sub test()
    Dim a, v

    a = [{3,5}]
    v = Application.Match(a, [{3,5,8}], 0)
    v = Application.IsNumber(v)

    MsgBox Join(v, vbLf)

 End Sub
(マナ) 2023/09/05(火) 19:50:38

 有難うございます。
 それは知りませんでした。
 確かにWorksheetFunctionだとMatchもエラーになりますね。

 ちなみに、処理速度はWorksheetFunctionのほうが速いそうです。
 まあ、速度だけではないですから、総合的判断になるものと思います。

(xyz) 2023/09/05(火) 20:46:15


例えばENCODEURL関数は、Excel2013で導入されたもののようで、明らかにExcel97以降のものです。 にもかかわらず、Application.ENCODEURLは動作しますから、 その説は正しくないように思います。

そうなんですね。
すいません。思いつきです。

そう言われて思い出しましたが、WroksheetFunctionの話ではないのだけれど、
InputboxにもApplication.Inputboxというのがあって、
Inputboxとは挙動が違う(入力種別を指定できる)というのがありましたね。
(ゆたか) 2023/09/06(水) 08:52:48


コメント返信:

[ 一覧(最新更新順) ]


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