• ベストアンサー

Worksheet.functionに関して

VBAでTanhやRoundといったExcelの関数を使いたい場合、 Worksheet.functionという記述を使うことで使用することが可能ですが、 これを使うデメリットはないのでしょうか?自分で関数を定義して使った方が良いということはないのでしょうか? 他の人が書いたVBAのプログラムを見たことがないので分かりませんが、 Worksheet.functionばかり使っていると処理速度が遅くなったりしそうな気がするのですが、そのようなことはないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 >関数内部でエラーが発生して、プロシージャ自体が死んでしまうことになってしまうのでというのはどういうことを指しているのでしょうか? 分からないと思ったので、わざわざエラー処理をしたサンプルコードを、#1で出したのです。エラー処理を外してみればよいと思います。私の書いている話は一般論です。 ワークシート関数の代表的なものに、エラーを返す関数があるはずです。(VBAで使う中では、VLOOKUP, MATCH, INDEXなど) ご自身が使っている関数が、エラーを出したことがないから、どういうことだと言われてもね……。それは、TANH関数など、引数が数値型として決まって、基本的には引数の数値の上限も下限でも、エラーを出さない関数に関しては、別に問題はありませんし、そんな当たり前の説明はいらないはずです。 #1のコードで分からないようでしたら、WorksheetFunction を気兼ねなく使えばよいと思います。今の時点では、私の回答は、ある程度以上のレベルでないと、あまり必要のないアドバイスです。

その他の回答 (1)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答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 '-------------------------------------------

myumyu1234
質問者

お礼

ありがとうございます。 ただ、回答の内容がよく理解出来ませんでした。 WorksheetFunctionが使えるなら、そちらの方が、100倍以上計算スピードが速いです。 というところは理解出来ましたが、 関数内部でエラーが発生して、プロシージャ自体が死んでしまうことになってしまうので というのはどういうことを指しているのでしょうか? 単にWorksheet.function.tanhと記述してエラーが出たことがありませんが、どういうことなのでしょうか?

関連するQ&A

  • VBAで一つのファンクションの中に全部コードを書いてしまいます

    VBAで一つのファンクションの中に全部コードを書いてしまいます Access VBAでプログラムを書いています。私がプログラムを書くと1つのファンクションの中に全てのコードを書いてしまいます。 例えば実行ボタンを押すと、Aテーブルからデータを抽出して、それを加工し、Excelへ出力するといった処理があるとします。他の人のプログラムを見ると、各処理毎にprocedureもしくはfunctionで機能を分けて作っています。私の場合は、1つの関数の中に全て書いてしまいます。 各機能ごとにプログラムを作りたいのですが、何かコツみたいなものはありますでしょうか?教えていただければ嬉しいです。

  • VBA Private Sub Worksheet_Calculate()

    「ユーザー定義関数」で計算されるセルがセルB2にある場合、シートモジュールの Private Sub Worksheet_Calculate()で、他の再計算は無視し、そのユーザー定義関数が計算されたことを判断するためにはどのような記述をすればいいのでしょうか?

  • エクセルVBAではRounddown関数はつかえないのでしょうか?

    Excel2003SP2でVBAを使っています。 AAA = RoundDown(Range("A1"), 0) と入力してコンパイルすると 「コンパイルエラー SubまたはFunctionが定義されていません」 と表示されます。 エクセルVBAではRounddown関数は使用できないのでしょうか? それとも私の記述が何か間違っているのでしょうか

  • actionscriptのfunction関数について

    現在Flashの勉強をしている者です。 超初心者丸出しの質問なのですが調べても納得いく回答にめぐりあわなかったのでここで質問させていただきます(前回もPHPについて質問したら素晴らしい回答があったので!!) Function関数なのですが function 半角英字で任意の文字 () {  以下実行文 } でユーザー定義関数が作られるのはわかったのですが、 本を読みながら勉強をしていてわからないのが this.onRollOver = function () { roll = true; this.nextFrame(); }; という記述で、『マウスがムービークリップ上にあるかの判定処理』という説明がされているのですが恥ずかしながらよくわかりません。 ユーザー定義関数のFunctionと上記のものでは別物なのでしょうか? ちょっと曖昧な質問で申し訳ないのですが どなたが是非よろしくお願いします。。。

    • ベストアンサー
    • Flash
  • Changeイベントの途中にユーザー定義関数が入る

    Excel VBA勉強中のものです ○"A1"に数字を入力する →Worksheet_Changeイベント →"B1"~"B5"にそれぞれ結果が入る →"C1"にユーザー定義関数 =A(B5)がある みたいなことをしようとしているのですが、 やってみると、 ○"A1"に数字を入力する →Worksheet_Changeイベント →Worksheet_Changeイベントの"B1"(1つ目の結果)がでるところで →ユーザー定義関数 Function Aにとぶ →普通にEnd Function →そのまま終了(End subに行かない) となるのですが、Worksheet_Changeに戻って来ないものなのでしょうか? また、Worksheet_Changeの最初のところに Application.EnableEvents = Falseで他のイベントを発生させないように?はしているのですが、終わるまでユーザー定義関数を発生させない命令みたいなのってあるのでしょうか? 上には少なく書いてありますが、実際はたくさんのセルを使用しておりWorksheet_Changeだけだとかなりの長文になりそうで、後半はユーザー定義関数にしたのですが 根本的に考え方が間違っているのでしょうか? なにかいいアドバイスをお願いします。

  • Excel 2003 VBA Worksheet_Changeの動作速度について

    Excel2003を使用しています。 セルに入力した文字列の前後のスペースをカットする為にTRIMを用いて Private Sub Worksheet_Change(ByVal Target As Range) Target.Value = Trim(Target.Text) End Sub と記述したところ、動作は思惑通りなのですが、処理速度が異様に重いです。 私の環境(VISTA Home Premium,Core2 Duo 2.20GHz)では、セル値を変更した後必ず3~5秒処理が固まります。 不本意ですが Private Sub Worksheet_SelectionChange(ByVal Target As Range) Target.Value = Trim(Target.Text) End Sub と、Worksheet_SelectionChangeを使うと全くストレスを感じず処理されますが、セルを再度選択してやらないとTRIMされませんし…。 私の環境だけがWorksheet_Changeでの処理が遅いのでしょうか? よく似た環境のみなさんはどうでしょう? 原因が分からなくて気持ち悪いです… 私個人の環境の問題? Excel2003の問題? 記述の問題? 何かご存じの方居られましたらよろしくお願いします。

  • 【エクセルVBA】Functionの引数として、配列は使えるのでしょうか?

    VBA初心者です。 Function で関数を定義するとき、その引数に配列を使う方法はあるのでしょうか? たとえば Function Test (C as double,n as integer) というFunctionの C に3×3の行列を入れたいのですが…。

  • VBAのFunction内でのセル値書き換え

    Excel上でVBAを使ってある値を求めるユーザー定義関数を 自作しようとしています。 その関数の中でワークシートの中のセル値を書き換えようとしましたが そこでプログラムは停止してしまいます。 エラーメッセージなどは無く、VBAプログラムが終了します。 サブプロシージャの中でなら当然書き換えはできるのですが、 関数の中でセル値を書き換えることはできないのでしょうか? 環境はWinXP SP2, Office 2000です。 どなたか分かる方、教えていただけると幸いです。 よろしくお願いします。

  • SubとFunctionの使い分け方。(Access VBA)

    Sub:実行するとそのまま処理が終わり、特に次の作業に影響しない。 Function:関数と同じように使い、そこでの戻り値をどこかに代入して利用する。 あるテキストにこの様に書いてありました。 この考え方だと、マクロをVBAに変換すると「モジュールオブジェクト」に出来るFunctionプロシージャは、Subの方が理解にしっくりくるのですど・・・ 例えば、「テーブルを開く」(マクロ)だと、ただテーブルを開いて処理を終了するだけなので、SubでVBAが出来るの方が納得するのですけど。 正直、今の認識では、本を読んでいても何となく分かったような気がするだけで、SubとFunctionの使い分けがイマイチ分かりません。 どなたか、SubとFunctionの使い分けの目安をお教えいただけないでしょうか?。 (Access VBA初心者)

  • Excel 2003 ワークシートを検索するには?

    初歩的な質問かな?と思いますが、よろしくお願いします。 シート見出しに勘定科目名を付けたワークシートが複数枚あり、 他に全勘定科目が一覧で見れるシートがあります。 1つ1つリンク貼り付けするのが面倒なので、標準の関数で処理できないか 考えてみましたが、分かりませんでした。 ユーザー定義関数だと、こんな↓感じ(まだ中途半端です)なのですが Public Function Kingaku(Kamoku As String) Kingaku = Sheets(Kamoku).Cells(5, 1).Value End Function これを Excel に標準で組み込まれた関数で処理するためには どのように記述すれば良いですか? ※ユーザー定義関数を使いたくない理由は、マクロをメンテナンス出来る  人が関係者の中にいないからです。