[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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 >
正:
次のコードはコンパイルエラーになります。
Sub test4()
MsgBox Range("A11") = Sum(Range("A1:A10"))
End Sub
よろしくお願いいたします。
(ShowRyaku) 2023/09/05(火) 14:48:38
ご参考
https://oshiete.goo.ne.jp/qa/1341789.html
(ゆたか) 2023/09/05(火) 15:06:46
WorksheetFunction. で利用できるワークシート関数は、 Application. でも利用できると漠然と思っていましたが、違うんですか。 そういう(例外的と私は思っている)代表例を教えていただけますか?
なお、代替できるだけではなくて、ポイントはエラー時の振る舞いが違う、 という点だと理解しています。そのあたりは、質問者さんはご存じなんでしょうか。
(xyz) 2023/09/05(火) 16:22:44
その後、調べたところ、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.