No.1
- 回答日時:
こんばんは。
「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と記述してエラーが出たことがありませんが、どういうことなのでしょうか?
No.2ベストアンサー
- 回答日時:
こんばんは。
>関数内部でエラーが発生して、プロシージャ自体が死んでしまうことになってしまうのでというのはどういうことを指しているのでしょうか?
分からないと思ったので、わざわざエラー処理をしたサンプルコードを、#1で出したのです。エラー処理を外してみればよいと思います。私の書いている話は一般論です。
ワークシート関数の代表的なものに、エラーを返す関数があるはずです。(VBAで使う中では、VLOOKUP, MATCH, INDEXなど)
ご自身が使っている関数が、エラーを出したことがないから、どういうことだと言われてもね……。それは、TANH関数など、引数が数値型として決まって、基本的には引数の数値の上限も下限でも、エラーを出さない関数に関しては、別に問題はありませんし、そんな当たり前の説明はいらないはずです。
#1のコードで分からないようでしたら、WorksheetFunction を気兼ねなく使えばよいと思います。今の時点では、私の回答は、ある程度以上のレベルでないと、あまり必要のないアドバイスです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excel VBAで並べ替えをしたい 3 2023/02/25 09:31
- JavaScript functionはhtmlやjsに2度使えませんか 2 2022/08/03 19:55
- Visual Basic(VBA) VBAでfunctionを利用しようとしたときに「引数は省略できません」というエラーが出ます 1 2022/10/15 16:30
- Excel(エクセル) エクセルシート中の全角英数字を半角に変換したい 4 2022/07/07 13:14
- Visual Basic(VBA) vbaエクセルマクロについて RemoveDuplicatesを使わずに、重複行を削除すらマクロを作 3 2023/03/02 22:03
- Excel(エクセル) エクセルで書式設定とフィルタの組み合わせでうまく行かないのですが 4 2022/10/07 10:02
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Excel(エクセル) ユーザー関数の自動計算(excel2003) 1 2023/02/06 06:46
- Visual Basic(VBA) VBAでファイル名を指定して保存するとき 4 2023/03/26 21:55
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルエラー13型が一致しま...
-
実行時エラー 438になった時の...
-
ExcelVBA Range クラスの Page...
-
エクセルVBAで以下のようなコー...
-
プロシージャ名の取得
-
なぜこんな初歩的なVBAのIf文で...
-
エラー1004 PDFの保存ができま...
-
VBAがブレークモードになっ...
-
ADODB.Streamを使用してUTF-8を...
-
INSERT INTOステートメント構文...
-
Outlook.ApplicationをCreateOb...
-
実行時エラー -'-2147417848
-
【Excel VBA】マクロをボタンに...
-
VB6 エラー:438 (InputBoxに値)
-
Invalid procedure call or arg...
-
Application.ActiveInspectorで...
-
vbaのvlookup関数エラー原因を...
-
EXCEL VBAマクロ中断でデバッグ...
-
VBAのコードがエラーになっ...
-
VBA 別シートのセルから、文字...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実行時エラー 438になった時の...
-
エクセルエラー13型が一致しま...
-
【Excel VBA】マクロをボタンに...
-
なぜこんな初歩的なVBAのIf文で...
-
VBAでのエラー
-
マクロについて教えてください...
-
ExcelVBA Range クラスの Page...
-
実行時エラー3001「引数が間違...
-
VBS実行時エラー オブジェクト...
-
VBAがブレークモードになっ...
-
OLEDB.NETで接続できない
-
プロシージャ名の取得
-
EXCEL VBAマクロ中断でデバッグ...
-
VBSで変数の宣言はできないので...
-
ADODB.Streamを使用してUTF-8を...
-
実行時エラー -'-2147417848
-
AccessVBAでExcelを起動し、罫...
-
VB6+SQL サーバー 2000 で 実行...
-
Outlook.ApplicationをCreateOb...
-
Application.ActiveInspectorで...
おすすめ情報