フォルダの参照ダイアログの表示方法を常に手前にする方法とは?

このQ&Aのポイント
  • エクセルのVBAを使用して、フォルダの参照ダイアログを常に手前に表示させる方法を教えてください。
  • エクセル2000を使用していますが、プログラム内でフォルダの参照ダイアログを表示させる際、ダイアログを常に手前に表示させる方法がわかりません。どのように設定すればよいでしょうか?
  • ダイアログが他のウィンドウに隠れてしまう問題があります。エクセル2000でVBAを使用している場合、フォルダの参照ダイアログを常に手前に表示させる方法を教えてください。
回答を見る
  • ベストアンサー

「フォルダの参照」ダイアログを「常に手前」に表示

下記サンプルを使ってフォルダを指定させています。 Sub Sample2() Dim Shell, myPath Set Shell = CreateObject("Shell.Application") Set myPath = Shell.BrowseForFolder(&O0, "フォルダを選んでください", &H1 + &H10, "C:\") If Not myPath Is Nothing Then MsgBox myPath.Items.Item.Path Set Shell = Nothing Set myPath = Nothing End Sub 上記プログラムで働くダイアログを 常に手前に表示させるか、 モーダルにするか、 他の所がアクティブになっても、すぐに手前に表示させるかしたいのです。 ちなみにプログラムは http://officetanaka.net/excel/vba/tips/tips39.htm を参考にさせてもらっています。 (ちなみに「1.FileDialogオブジェクトを使う方法」はエクセル2002以降の機能らしく実行できませんでした。これを使えるのが一番いいのですが・・・) エクセル 2000を使っています よろしくおねがいします

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

>Options属性で、フォルダ名を表示するテキストエリアを表示 あれはBROWSEINFO構造体のulFlagsへの設定値です。 よって、引数.ulFlags = BIF_RETURNONLYFSDIRS ~ に 追加する形で、BIF_EDITBOXを加算します。 どのフラグを使うとどうなるかは自分で試してください。 シンボルの値は全部書くと以下のようになります。 Const BIF_RETURNONLYFSDIRS   As Long = &H1 Const BIF_DONTGOBELOWDOMAIN   As Long = &H2 Const BIF_STATUSTEXT      As Long = &H4 Const BIF_RETURNFSANCESTORS   As Long = &H8 Const BIF_EDITBOX        As Long = &H10 Const BIF_VALIDATE       As Long = &H20 Const BIF_NEWDIALOGSTYLE    As Long = &H40 Const BIF_BROWSEINCLUDEURLS   As Long = &H80 Const BIF_UAHINT        As Long = &H100 Const BIF_NONEWFOLDERBUTTON   As Long = &H200 Const BIF_NOTRANSLATETARGETS  As Long = &H400 Const BIF_BROWSEFORCOMPUTER   As Long = &H1000 Const BIF_BROWSEFORPRINTER   As Long = &H2000 Const BIF_BROWSEINCLUDEFILES  As Long = &H4000 Const BIF_SHAREABLE       As Long = &H8000 また、RootFolderは同構造体のpidlRootメンバの ことです。

iori16
質問者

お礼

おおお、できましたっ わざわざ構造体の数値まで事細やかに教えてくださってありがとうございます。 おかげで色々いじれるようになりました。

その他の回答 (2)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

以下のプログラムを標準モジュールに置きます。 「フォルダ検索」が本体で、親ウィンドウにExcelの ウィンドウハンドルを指定すればモーダルになります。 ExcelのウィンドウはApplication.Hwndですが、手元に Excel2000が無いので、サポートしているか不明です。 もし、無ければ「親ウィンドウ取得」を使って求めます。 Option Explicit Const BFFM_INITIALIZED   As Long = 1 Const BFFM_SETSELECTIONA  As Long = &H466 Const CSIDL_DESKTOP     As Long = 0 Const BIF_RETURNONLYFSDIRS As Long = &H1 Const BIF_NEWDIALOGSTYLE  As Long = &H40 Private Type BROWSEINFO   hwndOwner    As Long   pidlRoot    As Long   pszDisplayName As String   lpszTitle    As String   ulFlags     As Long   lpfn      As Long   lParam     As Long   iImage     As Long End Type Private Declare Function SHBrowseForFolder Lib "Shell32" _   Alias "SHBrowseForFolderA" _   (引数 As BROWSEINFO) As Long Private Declare Function SHILCreateFromPath Lib "Shell32" _   Alias "#28" _   (ByVal パス名 As Long, ID As Long, ByVal 属性 As Long) As Long Private Declare Function SHGetPathFromIDList Lib "Shell32" _   Alias "SHGetPathFromIDListA" _   (ByVal ID As Long, ByVal パス領域 As String) As Long Private Declare Function CoTaskMemFree Lib "OLE32" _   (ByVal ID As Long) As Long Private Declare Function SetWindowText Lib "USER32" _   Alias "SetWindowTextA" _   (ByVal ウィンドウ As Long, ByVal 表題 As String) As Long Private Declare Function SendMessage Lib "USER32" _   Alias "SendMessageA" _   (ByVal ウィンドウ As Long, ByVal メッセージ As Long, _    ByVal Wパラメータ As Long, ByVal Lパラメータ As Long) As Long Private Declare Function lstrlen Lib "KERNEL32" Alias "lstrlenA" _   (ByVal 文字列 As String) As Long Private Declare Function SysAllocStringByteLen Lib "OleAut32" _   (ByVal 文字列 As String, ByVal バイト数 As Long) As String Private Declare Function GetCurrentProcessId Lib "KERNEL32" () As Long Private Declare Function GetWindowThreadProcessId Lib "USER32" _   (ByVal ウィンドウ As Long, プロセス As Long) As Long Private Declare Function EnumWindows Lib "USER32" _   (ByVal コールバック As Long, Lパラメータ As Long) As Long Private Declare Function GetClassName Lib "USER32" _   Alias "GetClassNameA" _   (ByVal ウィンドウ As Long, ByVal 名前 As String, ByVal 長さ As Long) As Long Private Declare Function GetWindowText Lib "USER32" _   Alias "GetWindowTextA" _   (ByVal ウィンドウ As Long, ByVal 名前 As String, ByVal 長さ As Long) As Long Private 表題 As String Function フォルダ検索( _   Optional ByVal 親ウィンドウ As Long, _   Optional ByVal 初期フォルダ As String, _   Optional ByVal 説明文 As String, _   Optional ByVal タイトル As String) As String Dim 引数 As BROWSEINFO Dim ID  As Long 引数.hwndOwner = 親ウィンドウ 引数.pidlRoot = CSIDL_DESKTOP 引数.pszDisplayName = Space(260) 引数.lpszTitle = 説明文 引数.ulFlags = BIF_RETURNONLYFSDIRS + BIF_NEWDIALOGSTYLE If 初期フォルダ <> "" Then   SHILCreateFromPath StrPtr(初期フォルダ), 引数.lParam, 0 End If 引数.lpfn = アドレス応答(AddressOf フック) 表題 = タイトル ID = SHBrowseForFolder(引数) If ID <> 0 Then   SHGetPathFromIDList ID, 引数.pszDisplayName   フォルダ検索 = SysAllocStringByteLen(引数.pszDisplayName, _                 lstrlen(引数.pszDisplayName))   CoTaskMemFree ID End If If 引数.lParam <> 0 Then CoTaskMemFree 引数.lParam End Function Private Function アドレス応答(ByVal アドレス As Long) As Long アドレス応答 = アドレス End Function Function フック(ByVal ウィンドウ As Long, ByVal メッセージ As Long, _ ByVal Wパラメータ As Long, ByVal Lパラメータ As Long) As Long If メッセージ = BFFM_INITIALIZED Then   If 表題 <> "" Then SetWindowText ウィンドウ, 表題   If Lパラメータ <> 0 Then     SendMessage ウィンドウ, BFFM_SETSELECTIONA, 0, Lパラメータ   End If End If End Function Function 親ウィンドウ取得() As Long Dim 親ウィンドウ As Long EnumWindows AddressOf コールバック, 親ウィンドウ 親ウィンドウ取得 = 親ウィンドウ End Function Private Function コールバック( _   ByVal ウィンドウ As Long, _   親ウィンドウ As Long) As Long Dim プロセス As Long Dim クラス名 As String Dim バイト数 As Long コールバック = 1 GetWindowThreadProcessId ウィンドウ, プロセス If プロセス = GetCurrentProcessId() Then   クラス名 = Space(128)   バイト数 = GetClassName(ウィンドウ, クラス名, Len(クラス名))   クラス名 = SysAllocStringByteLen(クラス名, バイト数)   If クラス名 = "XLMAIN" Then     親ウィンドウ = ウィンドウ     コールバック = 0   End If End If End Function

iori16
質問者

お礼

回答ありがとうございます 今自宅のパソコン(エクセル2007)で試してみて、無事動かせました。エクセル2000は会社の方なので明日試してみます しかし、一つ気になったのが、私が質問文で使っていた ShellObject.BrowseForFolder (Hwnd, Title, Options, [RootFolder]) という関数ですが、これにはOptionsという引数があり Options属性で、フォルダ名を表示するテキストエリアを表示することができました。 これにはそれに該当する引数が見当たらなかったんですが、 これはあきらめるしかないんでしょうか?

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

WindowsのAPIを使うようになります。以下に 方法が記載されています。 http://www.asahi-net.or.jp/~ef2o-inue/download/sub09_020_110.html お好きなように。

iori16
質問者

お礼

回答ありがとうございます 3番目のプログラムが非常に使い勝手がよさそうなのでそれを使わせてもらおうかと思います しかし、一つ気になったのが、私が質問文で使っていた ShellObject.BrowseForFolder (Hwnd, Title, Options, [RootFolder]) という関数ですが、これにはOptionsという引数があり Options属性で、フォルダ名を表示するテキストエリアを表示することができました。 これにはそれに該当する引数が見当たらなかったんですが、 これはあきらめるしかないんでしょうか?

関連するQ&A

  • フォルダ選択と取得したパスの表示

    どうしてもわからないのでご教授お願いします。 コマンドボタンを使用して、フォルダの選択のダイアログを表示し、選択したフォルダのパスを取得することはできたのですが、そこから取得したパスを任意のセルに表示させたいです。 どうすれば表示させることができるでしょうか。 Private Sub commandbutton1_Click() Dim Shell, myPath Set Shell = CreateObject("Shell.Application") Set myPath = Shell.BrowseForFolder(&O0, "フォルダを選んでください", &H1 + &H10, "C:\") If Not myPath Is Nothing Then MsgBox myPath.Items.Item.Path Set Shell = Nothing Set myPath = Nothing End Sub ご教授宜しくお願いします。

  • 【Excel VBA】選択フォルダへの相対パス

    色々なサイトを参考に、Excel VBAにて以下の様なロジックを作りました。 -------------- Dim SHELL, MYPATH Dim TARGETDIR As String Set SHELL = CreateObject("Shell.Application") Set MYPATH = SHELL.BrowseForFolder(&O0, "フォルダを選んでください", &H1 + &H10, ThisWorkbook.Path) If MYPATH Is Nothing Then End TARGETDIR = MYPATH.items.Item.Path Set SHELL = Nothing Set MYPATH = Nothing -------------- ブックのあるパス配下のフォルダを選択して、フルパスを"TARGETDIR"に格納します。 質問は2つです。 (1)"~.items.Item.Path"の構文の意味を教えて下さい。 (2)フルパスではなく"ブックのあるパスから見た、選択したフォルダへの相対パス"を知る方法を教えて下さい。 よろしくお願いします。

  • エクセルVBAで指定フォルダ内の選択ファイル名の取得

    お世話になります。 エクセルVBA昨日から始めた初心者です。 いま、 Private Sub CommandButton1_Click() Dim Shell, myPath Set Shell = CreateObject("Shell.Application") Set myPath = Shell.BrowseForFolder(&O0, "フォルダを選んでください", &H1 + &H10, "\\hk001a24\va\data\ツール") If Not myPath Is Nothing Then MsgBox myPath.Items.Item.Path Set Shell = Nothing Set myPath = Nothing End Sub というの作成したのですが、 これだとフォルダの選択しか出来ませんでした。 \\hk001a24\va\data\ツールの下にあるファイルを選択出来て、その選択したファイル名をVBA取得して保持できる ようにしたいのですが・・・ 急いでいるのでここで質問させて頂きました。 よろしくお願いします。

  • VBScriptでフォルダ参照ダイアログを表示したい

    HTMLファイルの中にVBScriptを記述しています。 内容はボタンが押されたら、フォルダ参照のダイアログ ボックスを表示したいのです。 開発環境は windows2000 IE6.02 スクリプトのところは以下のように記述しています。 Function Getfolder() Set Shell = CreateObject("Shell.Application") Set objFolder = Shell.BrowseForFolder(0, "フォルダを選択してね!", 1) if objFolder is Nothing then  Msgbox("フォルダを選択してください") else  Msgbox(objFolder.Items.Item.Path) end if End Function で、Set objFolder = Shell.BrowseForFolder(0, "フォルダを選択してね!", 1) のところで「書き込みできません」のエラーが表示されてしまいます。 どのようにすればフォルダ参照のダイアログボックスを表示できるのでしょうか?

  • VBAでのフォルダ指定方法について

    EXCELファイルが保存されているディレクトリ配下のフォルダーを指定できるようにしたくていろいろ試してみたのですが、うまくいきません。 どなたか、お知恵をお貸しください。 以下ソースです。 Private Sub CommandButton1_Click() Dim ShellApp As Object Dim oFolder As Object Dim MyPath As String MyPath = ActiveWorkbook.Path Set ShellApp = CreateObject("Shell.Application") Set oFolder = ShellApp.BrowseForFolder(0, "処理ファイルの格納フォルダ選択", 1, MyPath) If Not oFolder Is Nothing Then TextBox1.Value = oFolder.Items.Item.Path End If Set ShellApp = Nothing Set oFolder = Nothing End Sub

  • フォルダ選択でなくフルパスをセルの値から取得したい

    フォルダを選択して写真をシート上に表示するマクロを探すことができました。 LUは, http://programlife.jugem.jp/?eid=48 できれぱセルの値のフルパスを参照して写真を表示したいと思いいろいろ試して見ましたがうまくいきません。最後のフォルダを選択しなけれぱならないようです。 変更前 ' フォルダ選択画面を表示 Set shell = CreateObject("Shell.Application") Set myPath = shell.BrowseForFolder(&O0, "フォルダを選んでください", &H1 + &H10, "C:¥") 変更後 "C:¥") ⇒ Sheets("データ").Cells(4, 1).Value   へ変更 フルパス = Sheets("データ").Cells(4, 1).Value = C:\Users\***\Desktop\写真 ' フォルダ選択画面を表示 Set shell = CreateObject("Shell.Application") Set myPath = shell.BrowseForFolder(&O0, "フォルダを選んでください", &H1 + &H10, Sheets("データ").Cells(4, 1).Value ) どうかよろしくお願いします。

  • perlでdialogのフォルダ指定

    perl勉強中のものです。 perlにてプログラムを作成中ですが、フォルダを ダイアログを使って指定したいです。 参考ページを調べvbsにて以下のプログラムを作ってみました。 ****************************************************************** Set Shell = CreateObject("Shell.Application") Set objFolder = Shell.BrowseForFolder(0, "フォルダを選択してね!", 1, "c:\\") if objFolder is Nothing then Msgbox("ちゃんと選んで頂戴!") else Msgbox(objFolder.Items.Item.Path) end if ****************************************************************** 理解しきれていないのですが、vbsをperlに埋め込む?(変換?)ことができるようで モジュールを使って、上記のプログラムから参考を調べ、見よう見まねでperlで 作ってみましたが、何も表示せず、動作しません。 どこに問題があるか教えていただけないでしょうか? ****************************************************************** use Win32::OLE; my $Shell = Win32::OLE->CreateObject("WScript.Shell"); my $objFolder = $Shell->BrowseForFolder(0,'フォルダを選択してね', 1, 'c:\\' ); unless ($objFolder) { $Shell->MsgBox('ちゃんと選んで頂戴!',undef,'フォルダ選択',1); } else { $Shell->MsgBox("$objFolder->$Items->$Item->$Path"); } ******************************************************************* とんちんかんなプログラムを作っているかもしれませんが、 ご指導よろしくお願いします。

    • ベストアンサー
    • Perl
  • VBAでフォルダの選択時のパスを指定するには?

    VBAでフォルダの選択する時に以下のマクロを使用しています。 これを実行するとデスクトップから表示されますが、任意のフォルダから表示させることはできないでしょうか? 用途としてはある特定のフォルダ配下に複数のフォルダがあり、これを選択させたいのです。 デスクトップからですと、そのフォルダまで辿り着くのが大変です。 また誤ったフォルダを選択する危険もあります。 このShell32を使うことにこだわってはいません。 他に良い方法があれば、それでも構いません。 よろしくお願い申し上げます。 Sub Macro1() MsgBox Folder_Define("フォルダを選択してください") End Sub Function Folder_Define(msg As String) As String Dim mySh As Shell32.Shell Dim myFolder As Shell32.Folder Set mySh = CreateObject("Shell.Application") Set myFolder = mySh.BrowseForFolder(0, msg, 0) If myFolder Is Nothing Then Folder_Define = "" Else Folder_Define = myFolder.Items.Item.Path End If Set myFolder = Nothing Set mySh = Nothing End Function

  • エクセルVBA、フォルダ選択時のパスを指定するには?

    VBAでフォルダを選択する時に以下のマクロを使用しています。 これを実行するとデスクトップから表示されますが、任意のフォルダから表示させることはできないでしょうか? 用途としてはある特定のフォルダ配下に複数のフォルダがあり、これを選択させたいのです。 デスクトップからですと、そのフォルダまで辿り着くのが大変です。 また誤ったフォルダを選択する危険もあります。 このShell32を使うことにこだわってはいません。 他に良い方法があれば、それでも構いません。 よろしくお願い申し上げます。 Sub Macro1() MsgBox Folder_Define("フォルダを選択してください") End Sub Function Folder_Define(msg As String) As String Dim mySh As Shell32.Shell Dim myFolder As Shell32.Folder Set mySh = CreateObject("Shell.Application") Set myFolder = mySh.BrowseForFolder(0, msg, 0) If myFolder Is Nothing Then Folder_Define = "" Else Folder_Define = myFolder.Items.Item.Path End If Set myFolder = Nothing Set mySh = Nothing End Function

  • フォルダをコピー フォルダの中に入れたい FSO

    vbaです。よろしくお願いします。 Sub Sample() Dim myFSO As Object Dim MyPath As String MyPath = "C:\Users\ああああ\Desktop\" Set myFSO = CreateObject("Scripting.FileSystemObject") myFSO.CopyFolder MyPath & "コピーしたフォルダーを入れるフォルダー", MyPath & "コピーするフォルダ" Set myFSO = Nothing End Sub こんな感じで、デスクトップにある、"コピーするフォルダ"をコピーして、 デスクトップにある、"コピーしたフォルダーを入れるフォルダー"の中に入れたいのですが 上記のコードを実行しても何も起きません。 コピーしたフォルダーを入れるフォルダーの中身を見ても、空です。 ”コピーしたフォルダーを入れるフォルダー”の中に、"コピーするフォルダ" を入れる方法を教えてください。

専門家に質問してみよう