トップ回答者
Excel2016でのUserForm操作について

質問
-
EXCEL2016で質問させてください。
1ヶ月ほど前にEXCEL2016を購入し使っていますがUserFormの操作で困っています。
現象としては [ブックA] を新たに開きUserForm1 を作成します。
UserForm1 では別の[ブックB] のシートの任意のセルを選択しコマンドボタンを押すとそのセルのデータをテキストボックスに取得するようになっています。
Q1.
ここでUserForm1 は [ブックB] の上に表示されていなければなりませんが、それが最前面に表示されず、[ブックB] の下に隠れていて操作できません。これを最前面に表示するにはどうすればよいのでしょうか?
Q2.
この件に関してネットで検索した結果 VBE のForm_Activate にAPI を 書いて何とか [ブックB] の上に表示できたのですがその状態でUserForm1 をクリックすると [ブックA] が最前面に表示され [ブックB] が操作できません。
このような状況で業務ができませんので何とか解決したいのですがどのようにすればよいのかわかりません。どうか御教示を賜りたくよろしくお願いします。
因みに環境は Windows7 で UserForm1 はプロパティ画面から ShowModal = False に設定してあります。また Office は 2010 がインストールされています。 EXCEL2010 では以上のような現象は見られません。
どうかよろしくお願いします。
回答
-
検索しただけですが、以下のようなことをされたのでしょうか?
Keep a UserForm on Top of All Other Windows
http://www.mrexcel.com/forum/excel-questions/725372-keep-userform-top-all-other-windows.htmlKeep userform on top at all times
http://www.vbaexpress.com/forum/showthread.php?5071-Solved-Keep-userform-on-top-at-all-times★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 回答としてマーク ochiayu 2016年5月11日 20:26
-
御回答ありがとうございました。
お教えいただいたサイトで確認しました。
私もここに投稿する前に API を以下のように書いて実行してみましたが、今度は UserForm をクリックすると ブックA がアクティブになってしまい結局使えませんでした。
また上記サイトは全文英語なので残念ながら十分な理解ができません。もし日本語で解説されているところがありましたお教えください。
お手数お掛けし申し訳ありません。
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, _
ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const HWND_TOPMOST As Long = -1
Private Const SWP_NOSIZE As Long = &H1&
Private Const SWP_NOMOVE As Long = &H2&Private Sub UserForm_Activate()
Call SetWindowPos(GetForegroundWindow, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
End Sub- 回答としてマーク ochiayu 2016年5月11日 20:25
-
試されているコードは、32bitでしか動かないのかもしれません。
私が上で紹介した、
Keep a UserForm on Top of All Other Windows
http://www.mrexcel.com/forum/excel-questions/725372-keep-userform-top-all-other-windows.htmlにも、そのようなことが書かれており、64bitで動作するように紹介されたコードを作り直し、動作するようなったようです。
ただ、Excelのバージョンに依存する部分があるのかもしれませんので、何とも言えません。
私も詳しくなく、ネット上の情報のみで答えていますので、自信が無くてごめんなさい。★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 回答としてマーク ochiayu 2016年5月11日 20:25
すべての返信
-
検索しただけですが、以下のようなことをされたのでしょうか?
Keep a UserForm on Top of All Other Windows
http://www.mrexcel.com/forum/excel-questions/725372-keep-userform-top-all-other-windows.htmlKeep userform on top at all times
http://www.vbaexpress.com/forum/showthread.php?5071-Solved-Keep-userform-on-top-at-all-times★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 回答としてマーク ochiayu 2016年5月11日 20:26
-
御回答ありがとうございました。
お教えいただいたサイトで確認しました。
私もここに投稿する前に API を以下のように書いて実行してみましたが、今度は UserForm をクリックすると ブックA がアクティブになってしまい結局使えませんでした。
また上記サイトは全文英語なので残念ながら十分な理解ができません。もし日本語で解説されているところがありましたお教えください。
お手数お掛けし申し訳ありません。
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, _
ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const HWND_TOPMOST As Long = -1
Private Const SWP_NOSIZE As Long = &H1&
Private Const SWP_NOMOVE As Long = &H2&Private Sub UserForm_Activate()
Call SetWindowPos(GetForegroundWindow, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
End Sub- 回答としてマーク ochiayu 2016年5月11日 20:25
-
試されているコードは、32bitでしか動かないのかもしれません。
私が上で紹介した、
Keep a UserForm on Top of All Other Windows
http://www.mrexcel.com/forum/excel-questions/725372-keep-userform-top-all-other-windows.htmlにも、そのようなことが書かれており、64bitで動作するように紹介されたコードを作り直し、動作するようなったようです。
ただ、Excelのバージョンに依存する部分があるのかもしれませんので、何とも言えません。
私も詳しくなく、ネット上の情報のみで答えていますので、自信が無くてごめんなさい。★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 回答としてマーク ochiayu 2016年5月11日 20:25