none
Visual basic でのForm制御について RRS feed

  • 質問

  • はじめまして

    Visual BasicでのForm制御について質問があります。

     

    [環境]

    ・Microsoft Visual Basic 6.5 in CATIA V5R18

    (CATIAに内蔵されたVBA環境で開発しています)

     

    [行いたいこと]

    ・From上のボタンやコンボボックスを押下/変更し、CAD側のパラメータ更新等を行っている間、

    UI上の操作を不可としたい

     

    [課題]

    ・NewされたUserFromをの中の押下イベントで、

    NewされたFormオブジェクトのEnabledプロパティをFalse→Trueにしても

    Formは触れないまま

     

    [コード]

    UIオープン

     

        Dim uIformObj As UserForm1

        Set uIformObj = New UserForm1

        uIformObj.Show vbModeless

    ボタンクリック時

     

    Private Sub btn1_Click()

    Me.Enabled = false

        Call function1()

    Me.Enabled = True

    End Sub

    上記のコードを記載した場合、ボタン1を押下した後、Formが触れなくなったままとなります。

    (処理は終了しており、Clickイベントも最後まで通過している)

     

    ただし、下のように別のFormをClickイベント内でモーダレスでShowすると

    処理が終了した際にFormは触れるようになることが分かっています

     

    Private Sub btn1_Click()

    AnotherForm.Show vbModeless

    Me.Enabled = false

        Call function1()

    Me.Enabled = True

    End Sub

     

    この場合、AnotherFormはNewしているのではなく、直接、Showしています(複数起動は出来ない)

    (New AnotherFormの場合の結果は未確認)

     

     

    上記の挙動を取る理由/原因が分からず、

    AnotherForm.Show vbModeless

    を展開しても良いか、迷っています。
    何か、理由や原因が分かる方がいらっしゃいましたら、レスを頂ければと思います。

    2011年6月16日 15:57

回答

  • 私の環境であるWindows 7 Ultimate, Excel 2010でも再現しました。

    少し検索してみましたが、

    Private Sub CommandButton1_Click()

        Me.Enabled = False

        Me.Enabled = True

    End Sub

    のコードはExcel97までは期待通りに動いていたようです。とりあえず以下のように2回trueを実行するとうまく動くようです。私の環境でも動きましたが、完璧に対処療法ですね。

    Private Sub CommandButton1_Click()

        Me.Enabled = False

        Me.Enabled = True
        Me.Enabled = True

    End Sub

    代替として、以下のようなコードはいかがでしょうか?

    Private Sub CommandButton1_Click()

        For Each Control In Me.Controls
            Control.Enabled = False
        Next

        For Each Control In Me.Controls
            Control.Enabled = True
        Next
           
    End Sub

    (参考)
    userform Enabled property behavior changes between excel 97 and 2000/3
    http://www.officekb.com/Uwe/Forum.aspx/excel-prog/99228/userform-Enabled-property-behavior-changes-between-excel-97

    Bug With UserForm.Enable Property
    http://www.mrexcel.com/forum/showthread.php?t=186429

    userform.enable
    http://www.ozgrid.com/forum/showthread.php?t=38356&page=1


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク 山本春海 2011年6月29日 8:10
    2011年6月21日 1:42
    モデレータ

すべての返信

  • こちらの質問、いかがでしょうか。

     

    原因追求の方法、あるいは、NewされたForm上のUIで、Click/ValueChangeなどのイベント処理実行中に

    UIからの追加操作を行わせない方法をご存知でしたら、お教え頂ければと思います。

     

    よろしくお願いします。

     

     

     

    2011年6月20日 18:50
  • 問題の原因がコードの書き方にあるのか、VBA のランタイムにあるのか、そのソフトウェアの実装にあるのか、わかりません。
    もし、そのソフトウェアの実装上の問題である場合、VBA の一般的な問題とは言えず、このフォーラムで扱うには不適切となるかもしれません。(あくまで可能性です)

    まずは、再現できることが前提になりますが、たとえば、Excel VBA で再現可能なコードを示すことはできますか?
    その環境で再現できるならばそれを元に議論することができます。逆に再現できないのであれば、第三者に回答は難しいかもしれません。(そのソフトウェアの入手難易度、そのソフトウェアでの再現性にもよりますが)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答の候補に設定 山本春海 2011年6月29日 8:10
    2011年6月20日 21:20
    モデレータ
  • Azuleanさん、

     

    早速、返信いただき、ありがとうございます。

    エクセルで同様のコードを実行してみた結果、再現しましたので、

    そちらのコードを展開します。

     

    ボタンを1つ配置したUserForm1を作成し、クリックイベントに以下の処理を記述

    Private Sub CommandButton1_Click()

        Me.Enabled = False

        Me.Enabled = True

    End Sub

    モジュール内でUIを開く

    Public Sub Main()

        Dim uiFrm As UserForm1

        Set uiFrm = New UserForm1

        uiFrm.Show vbModeless

    End Sub

     

    Mainを実行してUIを起動後、ボタンを押すとUIが触れなくなってしまいます。

    単純な勘違いの可能性もありますが、原因が分かれば、お教え頂ければと思います。

     

    よろしくお願いします。

    2011年6月20日 22:46
  • 私の環境であるWindows 7 Ultimate, Excel 2010でも再現しました。

    少し検索してみましたが、

    Private Sub CommandButton1_Click()

        Me.Enabled = False

        Me.Enabled = True

    End Sub

    のコードはExcel97までは期待通りに動いていたようです。とりあえず以下のように2回trueを実行するとうまく動くようです。私の環境でも動きましたが、完璧に対処療法ですね。

    Private Sub CommandButton1_Click()

        Me.Enabled = False

        Me.Enabled = True
        Me.Enabled = True

    End Sub

    代替として、以下のようなコードはいかがでしょうか?

    Private Sub CommandButton1_Click()

        For Each Control In Me.Controls
            Control.Enabled = False
        Next

        For Each Control In Me.Controls
            Control.Enabled = True
        Next
           
    End Sub

    (参考)
    userform Enabled property behavior changes between excel 97 and 2000/3
    http://www.officekb.com/Uwe/Forum.aspx/excel-prog/99228/userform-Enabled-property-behavior-changes-between-excel-97

    Bug With UserForm.Enable Property
    http://www.mrexcel.com/forum/showthread.php?t=186429

    userform.enable
    http://www.ozgrid.com/forum/showthread.php?t=38356&page=1


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク 山本春海 2011年6月29日 8:10
    2011年6月21日 1:42
    モデレータ
  • 返信が遅くなり、申し訳ありません。

    両方のコードで試して見ます。

    どちらも簡単に出来そうなので。とても助かりました。

     

    ありがとうございます。

     

     

    伊藤

    2011年6月23日 23:56
  • こんにちは、shinobon724 さん。

    MSDN フォーラムのご利用ありがとうございます。オペレーターの山本です。

    有効な情報をいただいているようでしたので、他の方にもこの情報を有効活用していただくよう、勝手ながら私のほうで回答としてマークさせていただきました。
    情報をくださった皆さん、ありがとうございました。

    解決に役立った情報や、参考になった情報には、回答としてマークすることをお願いしています。
    今後、同じ問題でこのスレッドを参照される方にも、有効な情報がわかりやすくなるかと思いますので、ご協力よろしくお願いいたします。

    今後とも、MSDN フォーラムをよろしくお願いいたします。
                                                                
    日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2011年6月29日 8:10
  • 山本様

    お世話になります。アミコと申します。

    上記の件について、マイクロソフトの公式見解を記載したサイトを教えていただけますでしょうか?

    • 回答の候補に設定 アミコ 2020年12月15日 6:11
    • 回答の候補の設定解除 アミコ 2020年12月15日 6:11
    2020年12月15日 6:10