tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルcommondialogのエラーについて
記事No15882
投稿日: 2014/04/03(Thu) 13:13
投稿者小村
私はいまさらですが、VB6を勉強し始めた者です。
質問の意味が理解できないことも多々あると思いますが、
なにとぞ、よろしくお願いいたします。
今回、Commondialogを使ってファイル選択しようと思っておりますが、
なぜか、キャンセルボタンを押すとエラートラップに飛びません。
普通のエラーメッセージボックスが表示されます。なぜでしょうか?
ソースを抜粋しましたので、何かアドバイス等あればお願いします。
※環境Windows7、VB6(SP6)、Excel2010

    Dim xlApp As Excel.Application
    Dim xlBook As Excel.Workbook
    Dim xlSheet As Excel.Worksheet
    Set xlApp = CreateObject("Excel.Application")
    With CommonDialog1
        .DialogTitle = "ファイルを選択して下さい。"
        .InitDir = "D:\"
        .FileName = ""
        .Filter = "すべての Excel(xls)ファイル|*.xls|すべての ファイル|*.*"
        .FilterIndex = 1
        .CancelError = True
        .Flags = .Flags Or FileOpenConstants.cdlOFNFileMustExist
        .Flags = .Flags Or FileOpenConstants.cdlOFNPathMustExist
        .Flags = .Flags Or FileOpenConstants.cdlOFNNoChangeDir
        .Flags = .Flags Or FileOpenConstants.cdlOFNHideReadOnly
    End With
    On Error GoTo CANCEL2
    Call CommonDialog1.ShowOpen
    Exit Sub
'
'***** キャンセル *****
CANCEL2:
    X = 0: MSG = ""
    MSG = Err.Description & Chr(&HD) & _
        "メイン画面に戻ります。"
    X = MsgBox(MSG, vbInformation + vbOKOnly, "キャンセル")

出来ればキャンセル処理(cancel2)にループして欲しいです。
すみませんが、よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: commondialogのエラーについて
記事No15883
投稿日: 2014/04/03(Thu) 14:08
投稿者魔界の仮面弁士
コードエディタを右クリックして、[設定/解除]をクリックしてみてください。
もしかしたら、『エラー発生時に中断』が選択されていませんか?

>    MSG = Err.Description & Chr(&HD)
「MSG = Err.Description & vbCrLf」
もしくは
「MSG = Err.Description & vbNewLine」
の方が良いと思います。

vbCr だけでも間違いではありませんが、本来は vbCrLf が望ましいです。
(メッセージボックスは一応、Cr と CrLf とを区別して表示しています)


>    X = MsgBox(MSG, vbInformation + vbOKOnly, "キャンセル")
ここは「+」ではなく「Or」が望ましいです。
CommonDialog の Flags と同様に。


> 出来ればキャンセル処理(cancel2)にループして欲しいです。
「ループ」では無いですよね。

[ツリー表示へ]
タイトルRe^2: commondialogのエラーについて
記事No15884
投稿日: 2014/04/03(Thu) 14:44
投稿者小村
魔法の仮面弁士様、さっそくのアドバイス、ありがとうございます。
言われた通り見てみたら、エラー発生時に・・・が選択されていました。
それで、クラスモジュールもしくはエラー処理対象外どちらに設定
した方がベストなのでしょうか?どちらも、うまく出来たのですが
どちらがベストなのかイマイチ理解出来ていません・・・。
重ね重ねすみませんが、よろしくお願いいたします。

>    MSG = Err.Description & Chr(&HD)
「MSG = Err.Description & vbCrLf」
もしくは
「MSG = Err.Description & vbNewLine」
・・・上記の方で対応したいと思います。

>    X = MsgBox(MSG, vbInformation + vbOKOnly, "キャンセル")
ここは「+」ではなく「Or」が望ましいです。
・・・初めて知りました。今後は、ORを使ってみます。


> 出来ればキャンセル処理(cancel2)にループして欲しいです。
「ループ」では無いですよね。
・・・すみません。言い間違えました。

今後とも、簡単なことを質問すると思いますが、ある程度はヘルプ等を
参考にして、それでもわからなければ質問させて頂きます。
ありがとうございました。

[ツリー表示へ]
タイトルRe^3: commondialogのエラーについて
記事No15885
投稿日: 2014/04/03(Thu) 19:46
投稿者魔界の仮面弁士
> 言われた通り見てみたら、エラー発生時に・・・が選択されていました。
[ツール]-[オプション]の[全般]タブにて切り替えられます。

規定値は『クラス モジュールで中断』ですが、
これはクラスモジュールを使っていない場合、
『エラー処理対象外のエラーで中断』と同義となります。


> それで、クラスモジュールもしくはエラー処理対象外どちらに設定
> した方がベストなのでしょうか?どちらも、うまく出来たのですが

違いについては、ヘルプの『クラス モジュールのデバッグ』の項に
具体例つきで書かれていますので、そちらを参照してみてください。

長々と説明するよりも、実際にサンプルで試してみた方が分かりやすいと思いますし。


[Visual Basic ドキュメント]
└[Visual Basic の使用方法]
 └[プログラミング ガイド]
  └[Visual Basic を使ってできること]
   └[オブジェクト]
    └[独自のクラスの作成]
     └[クラス モジュールのデバッグ]★


> どちらがベストなのかイマイチ理解出来ていません・・・。

「クラス モジュール」や「ユーザーコントロール」などで
エラーが発生した場合に、それらの中で停止させるのが
『クラス モジュールで中断』です。

『エラー処理対象外のエラーで中断』の場合は、
「クラス モジュール」や「ユーザーコントロール」などで
発生したエラーでは停止せず、それらの呼び出し元となった
「フォーム モジュール」や「標準モジュール」上で停止します。

ただしいずれも、エラートラップ処理が行われている場合には停止しません。


そして『エラー発生時に中断』は、エラートラップの有無に
関係なく、エラー発生箇所で停止します。


> >    X = MsgBox(MSG, vbInformation + vbOKOnly, "キャンセル")
> ここは「+」ではなく「Or」が望ましいです。
> ・・・初めて知りました。今後は、ORを使ってみます。

たとえば、
 a = vbInformation Or vbModal
とした場合、この値は「65」となります。そして、
 a = vbInformation + vbModal
とした場合も「65」です。


それではここで、さらに
 a = a Or vbInformation
とした場合はどうなるでしょうか。

vbInformation が 2 回付与されたわけですが、結果は変わらず「65」のままとなります。
一方、+ で加算してしまうと、65 から 129 へと変化してしまう、というわけです。


各フラグを 1 回しか加えない場合は、+ でも結果は一緒なのですが、
本来の意味から言えば、Or で繋ぐのが適切であるということになります。

[ツリー表示へ]
タイトルRe^4: commondialogのエラーについて
記事No15886
投稿日: 2014/04/04(Fri) 08:17
投稿者小村
魔界の仮面弁士様
 返事が遅くなり申し訳ございませんでした。
 細かくアドバイスして頂き、すごく理解出来ました。
 なんとなく使っていたことや知らずに使っていたこと、
 これからは少しずつでも理解しながらプログラムを
 作成していきたいと思います。
 今回は、本当にありがとうございました。

[ツリー表示へ]