none
カーソルを移動を促して新しい位置を取得したい. RRS feed

  • 質問

  • 現在のカーソルの位置をrangeオブジェクト1にセットし,次に別の位置にカーソル移動を促して新しい位置をrangeオブジェクト2に設定したいのです.

    カーソル移動を促すダイアログ表示にMSGBOX関数を使うとモーダル表示で文書自身を操作できません.

    rangeオブジェクト1にセット後にユーザーフォームをモードレスで表示するコードですとカーソル移動を未確認のまま次の処理(rangeオブジェクト2にセット)に進んでしまいます.

    文書を操作可能なままでユーザーフォームを表示しつつカーソル移動の終了後にOKボタンを押すまで(rangeオブジェクト2にセット)に進まないコードにできないでしょうか.

    rangeオブジェクト2にセット以降の処理をOKボタンのコードにする案もありますが,ある条件の場合にのみユーザフォームの表示を行うので,コードの分岐は回避したくもとのコードでの継続処理にしたいのですが,可能でしょうか.

    エクセルのようにapplication.inputBoxが使えればいいのですが,ワードでは使えないので別案をさがしていまs.

    2022年9月22日 5:01

回答

  • matushiro97 さま

    魔界の仮面弁士 様の回答のように MsgWaitForMultipleObjects API を使った方が
    待ち合わせるのに良いと思いますが、 Sleep で待つサブルーチンを作成してみました、
    Sleep している間は操作ができないので反応が遅いかもしれません。

    ① ユーザーフォームをモードレスで表示する。
    ② ユーザーフォームが閉じられるまでループして待つ、
    ③ ユーザーフォームでOKボタンを押されたかの確認は標準モジュールの変数で行う。

    UserForm1OK 変数を共通の変数としています。

    標準モジュール

    Option Explicit
    
    Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    
    Public UserForm1OK As Boolean
    
    Sub ShowAndWaitForUserForm1()
        UserForm1OK = False
        ' 
        UserForm1.Show vbModeless
        Do
            DoEvents
            Sleep (100)
            If UserForm1.Visible = False Then
                Exit Do
            End If
        Loop
    End Sub
    
    UserForm1
    Option Explicit
    
    Private Sub OKCommandButton_Click()
        UserForm1OK = True
        Unload Me
    End Sub

    呼び出しの処理
    Sub Test()
        Call ShowAndWaitForUserForm1
        MsgBox "終了しました " & UserForm1OK
    End Sub
    

    以上。参考になれば幸いです。

    • 回答としてマーク matushiro97 2022年9月28日 12:10
    2022年9月22日 17:23

すべての返信

  • 以前の質問で提供した疑似モーダル画面で対応できないでしょうか?
    2022年9月22日 6:35
  • ありがとうございます.

    前回もご教示いただきましたが,難しくて挫折しました.

    何度も同じテーマに直面するので理解するように再度トライいたします.

    2022年9月22日 13:51
  • matushiro97 さま

    魔界の仮面弁士 様の回答のように MsgWaitForMultipleObjects API を使った方が
    待ち合わせるのに良いと思いますが、 Sleep で待つサブルーチンを作成してみました、
    Sleep している間は操作ができないので反応が遅いかもしれません。

    ① ユーザーフォームをモードレスで表示する。
    ② ユーザーフォームが閉じられるまでループして待つ、
    ③ ユーザーフォームでOKボタンを押されたかの確認は標準モジュールの変数で行う。

    UserForm1OK 変数を共通の変数としています。

    標準モジュール

    Option Explicit
    
    Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    
    Public UserForm1OK As Boolean
    
    Sub ShowAndWaitForUserForm1()
        UserForm1OK = False
        ' 
        UserForm1.Show vbModeless
        Do
            DoEvents
            Sleep (100)
            If UserForm1.Visible = False Then
                Exit Do
            End If
        Loop
    End Sub
    
    UserForm1
    Option Explicit
    
    Private Sub OKCommandButton_Click()
        UserForm1OK = True
        Unload Me
    End Sub

    呼び出しの処理
    Sub Test()
        Call ShowAndWaitForUserForm1
        MsgBox "終了しました " & UserForm1OK
    End Sub
    

    以上。参考になれば幸いです。

    • 回答としてマーク matushiro97 2022年9月28日 12:10
    2022年9月22日 17:23
  • motosan

    非常にわかりやすいコードありがとうございます.

    実用的だと思います.

    利用させていただきます.

    2022年9月28日 12:10