- ベストアンサー
Worksheet.functionに関して
VBAでTanhやRoundといったExcelの関数を使いたい場合、 Worksheet.functionという記述を使うことで使用することが可能ですが、 これを使うデメリットはないのでしょうか?自分で関数を定義して使った方が良いということはないのでしょうか? 他の人が書いたVBAのプログラムを見たことがないので分かりませんが、 Worksheet.functionばかり使っていると処理速度が遅くなったりしそうな気がするのですが、そのようなことはないのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 >関数内部でエラーが発生して、プロシージャ自体が死んでしまうことになってしまうのでというのはどういうことを指しているのでしょうか? 分からないと思ったので、わざわざエラー処理をしたサンプルコードを、#1で出したのです。エラー処理を外してみればよいと思います。私の書いている話は一般論です。 ワークシート関数の代表的なものに、エラーを返す関数があるはずです。(VBAで使う中では、VLOOKUP, MATCH, INDEXなど) ご自身が使っている関数が、エラーを出したことがないから、どういうことだと言われてもね……。それは、TANH関数など、引数が数値型として決まって、基本的には引数の数値の上限も下限でも、エラーを出さない関数に関しては、別に問題はありませんし、そんな当たり前の説明はいらないはずです。 #1のコードで分からないようでしたら、WorksheetFunction を気兼ねなく使えばよいと思います。今の時点では、私の回答は、ある程度以上のレベルでないと、あまり必要のないアドバイスです。
その他の回答 (1)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 「WorksheetFunctionを使うことと、自分で作るユーザー定義関数を使うこと」という件ですが、 WorksheetFunctionが使えるなら、そちらの方が、100倍以上計算スピードが速いです。 ただ、デメリットは、その使い方が難しいのです。関数内部でエラーが発生して、プロシージャ自体が死んでしまうことになってしまうので、On Error トラップを使うわけです。初級の人たちが使っているのを見ますが、ほとんど、コードは間違っています。エラーの発生しない、Count や CountA などは、問題はありません。 WorksheetFunction の書き方は面倒なので、その代わりに、Application.Sum などと、Excel 95 型の書き方にして、戻り値に対して、IsError やIsNumeric を取るようにすれば、分かりやすいです。 ただし、練習では、WorksheetFunction の連発していたのでは、一向にコーディングは上達しません。 なお、ユーザー定義関数や関数プロシージャは、VBAでは、サブルーチンとして使うことが多いように思います。 サンプル '------------------------------------------- 'WorksheetFunction の使い方 Sub SampleFunctionUsage() Dim i As Variant Dim iFind As Long '検索値 Dim ArrayData As Variant ArrayData = Array(10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20) '入力値 iFind = 1 On Error Resume Next i = Empty '変数を初期化(これをしないといけない) i = WorksheetFunction.Match(iFind, ArrayData, 0) On Error GoTo 0 If Not IsEmpty(i) Then MsgBox "検索値:" & iFind & " は、" & i & "番目に見つかりました。" Else MsgBox "検索値:" & iFind & " は、見つかりません。", vbExclamation End If End Sub '------------------------------------------- '古い方法 Sub SampleFunctionUsage_OldType() Dim i As Variant Dim iFind As Long '検索値 Dim ArrayData As Variant ArrayData = Array(10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20) '入力値 iFind = 1 i = Application.Match(iFind, ArrayData, 0) If Not IsError(i) Then MsgBox "検索値:" & iFind & " は、" & i & "番目に見つかりました。" Else MsgBox "検索値:" & iFind & " は、見つかりません。", vbExclamation End If End Sub '-------------------------------------------
お礼
ありがとうございます。 ただ、回答の内容がよく理解出来ませんでした。 WorksheetFunctionが使えるなら、そちらの方が、100倍以上計算スピードが速いです。 というところは理解出来ましたが、 関数内部でエラーが発生して、プロシージャ自体が死んでしまうことになってしまうので というのはどういうことを指しているのでしょうか? 単にWorksheet.function.tanhと記述してエラーが出たことがありませんが、どういうことなのでしょうか?