人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

GetOpenFileName(Function)ダイアログを最前面表示させたい。
様々な異なった形式のファイル名を持つ複数のCSVファイルがある中でA_CLS01.CSV,A_CLS02.CSV,・・・と言う様な形式のファイル名を持つCSVファイルだけを複数選択し読込み処理する為に,
Private Declare Function GetOpenFileName Lib "comdlg32.dll" _
Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
を用い、ファイルフィルターを*_CLS*.CSVとしてGetOpenFileNameしています。
userform1にCommandButtonをおいて、そのButtonを押すことでGetOpenFileNameダイアログが起動する様にしています。ファイルの読込みは何とか出来ております。
(※EXCEL のApplication.GetOpenFilenameでは、*_CLS*.CSVと言うファイルフィルターは使用できない)
しかし、この時GetOpenFileNameダイアログは常に最前面に表示させたいのですが、
困ったことにuserform1にフォーカスすることができてしまう為、userform1の裏に入ってしまう場合があり、VBA初心者でありますが、何とかしたいと思いネット検索等でEXCELで使用できるVBAのサンプルコードを探しておりますが見つかりません。この場合の解決策とそのVBA(EXCELで使用できる)コードを教えて戴きたく宜しくお願い申し上げます。

●質問者: hawk007
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● きゃづみぃ
●0ポイント

Formで画面を 作って、それを前面にすることは 出来ますでしょうか?


2 ● oil999
●0ポイント

この時GetOpenFileNameダイアログは常に最前面に表示させたいのですが

これは「モーダル・ダイアログボックス」と呼びます。
逆に、ご質問の状況のように、他のダイアログボックスへ制御を移せてしまうものを「モーダレル・ダイアログボックス」と呼びます。

VBAの場合、フォーム Form1 をモーダルにしたい時は、そのフォームのプロパティを

Form1.Show vbModal

としてやればできます。

そこで、Buttonをクリックしたときにモーダルなフォームが開くようにしておき(VisiblleプロパティをFalseにしておいて構わない)、そこからGetOpenFileNameを呼び出せば目的は達せられるでしょう。


3 ● hissssa
●500ポイント ベストアンサー

GetOpenFileNameのダイアログをモードレスで開いているせいかと思われます。
ダイアログを開く時に、その親となるページのハンドルを指定して開くとモーダルで開かれるため、親ウインドウの下に入り込む事はなくなります。
具体的には、OPENFILENAME構造体のhwndOwnerメンバーに、親ウィンドウにしたいウィンドウ(この場合はuserform1)のウィンドウハンドルを指定してからGetOpenFileName()を呼べば大丈夫です。

ただし、厄介なことにExcel VBAにはユーザーフォームのウィンドウハンドルを取得する方法が提供されていません。取得するには画面上に既に開かれているウィンドウから検索するしかありません。
ウィンドウハンドルの検索は、FindWindow()というWindows APIで可能です。以下のように記述すれば、とりえあず目的は達せられます。

宣言:
Declare Function FindWindow Lib "User32.dll" Alias "FindWindowA" (ByVal ClassName As String, ByVal WindowName As String) As Long

呼出(userform1上で記述):
hwndOwner = FindWindow("ThunderDFrame", Me.Caption)

尚、この方法だとウィンドウタイトルだけで検索することになりますので、同じタイトルのウィンドウが同時に開かれていると混同されてしまいます。厳密に識別しようと思ったらもう一工夫が必要ですのでご注意ください。


hawk007さんのコメント
hissssa様 お世話になっております。 教えていただきました方法をベースにて、なんとか希望していた動作が可能となりました。 GetOpenFileNameのダイアログを閉じた時に、hwndOwner=0としてやらないと マウスのクリックが効かないことも分かり大変勉強になりました。 ありがとうございました。 今後ともご指導宜しくお願い申し上げます。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ