【Excel VBA】Function の中で死ぬことはしないのでしょうか?


Function 内でエラー発生した場合、メッセージを出して終了してほしいのですが、一般的にはどのように行っているのでしょうか?

''' 存在しないシート名ならわかりやすく死んでほしい
Public Function getWorksheetByName(name As String, book As Workbook) As Worksheet
On Error Resume Next
getWorksheetByName = book.Worksheets(name)

If getWorksheetByName Is Nothing Then
MsgBox "シート[" & name & "]が存在しません!"
die() ' そんな関数は無い。End Function では Sub に戻って継続してしまう
End If
End Function


死にたければ Sub で実装するのでしょうか?
Public Sub setWorksheetFor(ByRef ws As Worksheet, name As String, book As Workbook)
...
End Sub

Sub test()
Dim ws As Worksheet
setWorksheetFor ws, "あるシート", ThisWorkbook
...

回答の条件
  • 1人2回まで
  • 登録:2009/12/05 23:20:15
  • 終了:2009/12/06 00:36:58

ベストアンサー

id:SALINGER No.1

SALINGER回答回数3454ベストアンサー獲得回数9692009/12/05 23:24:31

ポイント60pt

On Error Resume Nextがあるからじゃないですか?

http://t_shun.at.infoseek.co.jp/My_Page/Excel-VBA/vba_page21.htm

id:nannde

die()の代わりにEndが使えるようですね。

2009/12/05 23:34:36
  • id:SALINGER
    エラーメッセージが出ないってことかと思ったら、終了しないってことでしたか。
    Endでいいですね。
  • id:nannde
    そうなんです。すみません。
    もっと良いリファレンス本を買った方が良さそうですね。
    基本的なことを知るのに苦しんでます(^^;
  • id:Kityo
     VBAにも「end」コマンドあるんですね。勉強になりました。
  • id:Kityo
     nanndeさんがこの質問を終了されないのは、単に強制終了する方法を知りたかっただけではなくて「一般的にはどのように行っているの」に対する回答を待っている。「endは判ったが、こんなに知られていないものが一般的とも思えない」と言った意図でしょうか?
  • id:nannde
    まさに、そんな感じです。

    VBAのスタイルがどうもわかりづらく、
    (ユーザ定義型の要素値を取得するのに要素名を
    静的に指定しなければならない、というのには驚きました)
    なんとなく良い指摘が来ないかと、終了を先送りしてしまいました。
    失礼いたしました。
  • id:mystashes
    御認識の通りEndで良いです。
    ただし3行目
    getWorksheetByName = book.Worksheets(name)

    Set getWorksheetByName = book.Worksheets(name)
    としなければなりません。
    また、4行目
    If getWorksheetByName Is Nothing Then

    If 0<>Err.Number Then
    とする手もあります。(VBAはErrオブジェクトでエラー情報を取得できます)
    前者の書き方ですと、再帰呼び出しのように見えてしまい混乱の元です。
    (実際には再帰呼び出しはされません。見た目上の問題だけです)
  • id:SALINGER
    検討違いの回答だったので、キャンセルで良かったのですが。
    ただ、有効なコメントが付くとキャンセルしづらくはあります。
  • id:taknt
    一般的に関数内でプログラムを終了させるなんて変な作り方はしない。
    普通は関数でエラーを返してあげて その関数を呼んでる側で エラーだったら終了するという作り方にする。
  • id:nannde
    mystashesさま!

    ご指南ありがとうございます!
    set オブジェクト は未だ何度も間違えます。

    > If 0<>Err.Number Then
    > とする手もあります。(VBAはErrオブジェクトでエラー情報を取得できます)
    > 前者の書き方ですと、再帰呼び出しのように見えてしまい混乱の元です。
    > (実際には再帰呼び出しはされません。見た目上の問題だけです)
    ぜひそうしようと思います。
    見た目上の問題はとても重要ですよね。
    関数名も getWorksheetByNameOrDie() としました。


    takntさま
    ありがとうございます。このようなご指摘を待っていました。
    > 関数内でプログラムを終了させるなんて変な作り方はしない
    > 普通は関数でエラーを返してあげて その関数を呼んでる側で エラーだったら終了するという作り方にする。
    となると、パラメタだけが異なる処理も、毎回同じエラー対処を
    書いていかなければならないのですね。
    結構たいへんですね...


この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません