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
...
On Error Resume Nextがあるからじゃないですか?
http://t_shun.at.infoseek.co.jp/My_Page/Excel-VBA/vba_page21.htm
Endでいいですね。
もっと良いリファレンス本を買った方が良さそうですね。
基本的なことを知るのに苦しんでます(^^;
VBAのスタイルがどうもわかりづらく、
(ユーザ定義型の要素値を取得するのに要素名を
静的に指定しなければならない、というのには驚きました)
なんとなく良い指摘が来ないかと、終了を先送りしてしまいました。
失礼いたしました。
ただし3行目
getWorksheetByName = book.Worksheets(name)
は
Set getWorksheetByName = book.Worksheets(name)
としなければなりません。
また、4行目
If getWorksheetByName Is Nothing Then
は
If 0<>Err.Number Then
とする手もあります。(VBAはErrオブジェクトでエラー情報を取得できます)
前者の書き方ですと、再帰呼び出しのように見えてしまい混乱の元です。
(実際には再帰呼び出しはされません。見た目上の問題だけです)
ただ、有効なコメントが付くとキャンセルしづらくはあります。
普通は関数でエラーを返してあげて その関数を呼んでる側で エラーだったら終了するという作り方にする。
ご指南ありがとうございます!
set オブジェクト は未だ何度も間違えます。
> If 0<>Err.Number Then
> とする手もあります。(VBAはErrオブジェクトでエラー情報を取得できます)
> 前者の書き方ですと、再帰呼び出しのように見えてしまい混乱の元です。
> (実際には再帰呼び出しはされません。見た目上の問題だけです)
ぜひそうしようと思います。
見た目上の問題はとても重要ですよね。
関数名も getWorksheetByNameOrDie() としました。
takntさま
ありがとうございます。このようなご指摘を待っていました。
> 関数内でプログラムを終了させるなんて変な作り方はしない
> 普通は関数でエラーを返してあげて その関数を呼んでる側で エラーだったら終了するという作り方にする。
となると、パラメタだけが異なる処理も、毎回同じエラー対処を
書いていかなければならないのですね。
結構たいへんですね...