• ベストアンサー

フォルダ指定ダイアログ(Excel97VBA)

とあるサイトで、下記のようにして、フォルダを指定するダイアログを表示させるコードを見つけました。 Set objKng = CreateObject("Shell.Application") Set dirKng = objKng.BrowseForFolder(0, "フォルダを選択してください。", 0) 上記2行についてどなたか解説して頂けないでしょうか? 特に、("Shell.Application")の""内の意味・他に何ができるのか、(0,"・・・",0)のゼロが分かりません。 また、このダイアログで、IF文を使って条件分岐させるにはどうすればいいのでしょうか? 以下のような感じで作りたいのですが。 If キャンセル押下時 then Exit Sub Else 実行 End If 宜しくお願いします。

noname#1997
noname#1997

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

  • ベストアンサー
  • sgh
  • ベストアンサー率61% (75/121)
回答No.3

>しかし、使い方が分かりません。(^^ゞ すいません。説明不足でした。 まず、EXCELのVBEから「挿入」「標準モジュール」を選択します。 Module1というウインドウが表示されます。 そこに#1で回答した<標準モジュール>以下<呼び出し側>以前までコピーして貼り付けます。 貼り付けた下の行に以下のサンプルコードをコピーして貼り付けます。 <サンプルコード> Sub test() Dim FolderStr As String FolderStr = ComdlgGetFolderStr("フォルダを指定してください。") If FolderStr = "" Then   Exit Sub Else   Debug.Print FolderStr End If End Sub イミディエイトウインドウに"test"と入力し、エンターを押します。 すると見たことのあるフォルダー選択画面が出てきますので選択して「OK」をクリックします。 イミディエイトウインドウに選択したフォルダーのパスが表示されます。 >APIって何? 私も詳しくないのですが、OSとの橋渡し的存在だと思っています。違っていたらご指摘ください。

noname#1997
質問者

お礼

お礼が大変遅くなり申し訳ありませんでした。 手元にファイルがないので、後日試してみます。 ありがとうございました。

その他の回答 (2)

回答No.2

Set objKng = CreateObject("Shell.Application") でobjKngにShellオブジェクトをセットします。これでエクスプローラーの機能を使用する事ができます。 >(0,"・・・",0)のゼロが分かりません。 最初の方はウインドのハンドルです。ここに指定したハンドル(ウインドに付けられた識別番号)のウインドがフォルダ選択ダイアログボックスの親ウインドになります。例えばここにExcelのハンドルを指定すると、ダイアログボックスを閉じるまでExcelの操作に戻れなくなります。0はデスクトップを表します。 後の方はフォルダ選択ダイアログボックスのオプションです。これでダイアログボックスのスタイルを設定します。 条件分岐は、 If dirKng Is Nothing Then  Exit Sub Else  '実行 end if で良いと思います。

noname#1997
質問者

お礼

お礼が大変遅くなり申し訳ありませんでした。 大変よく分かりました。 手元にファイルがないので、後日試してみます。 Nothingは試したつもりだったのですが・・・。 isではなく=にしてたのかも。(^^ゞ ありがとうございました。

  • sgh
  • ベストアンサー率61% (75/121)
回答No.1

こんにちは ご質問の内容とは全く関係ないかもしれませんが、APIを使うことで 実現できます。 実は私もAPIについてはほとんど知らないのですが、他の人が作った 以下のサンプルがありますので、参考になればと思いレスします。 一応WIN2000の環境では動きます。 <標準モジュール> 'フォルダ指定ダイアログ表示の宣言部 Public 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 Public Const C_RF_DESKTOP = &H0 'デスクトップ Public Const C_RF_PERSONAL = &H5& 'My Documents Public Const C_RF_DRIVES = &H11& 'マイコンピュータ Public Const BIF_BROWSEFORCOMPUTER = 1 Public Declare Function SHBrowseForFolder Lib "shell32.dll" _   Alias "SHBrowseForFolderA" (lpBROWSEINFO As BROWSEINFO) As Long Public Declare Function SHGetPathFromIDList Lib "shell32.dll" _   Alias "SHGetPathFromIDListA" _   (ByVal pidl As Long, ByVal pszPath As String) As Long Public Declare Function FindWindow Lib "user32" _   Alias "FindWindowA" _   (ByVal lpClassName As String, ByVal lpWindowName As Long) As Long Public Declare Function CoTaskMemFree Lib "OLE32.dll" _   (ByVal pv As Long) As Long 'フォルダ指定ダイアログ表示 Function ComdlgGetFolderStr(msgStr As String) As String   Dim typBROWSEINFO As BROWSEINFO   Dim lngFoldPointer As Long   Dim strPathName As String   Dim m As Long   Dim n As Long   Dim tmp As String   ComdlgGetFolderStr = ""   With typBROWSEINFO    .hwndOwner = FindWindow("XLMAIN", 0)    .pidlRoot = C_RF_DESKTOP    'ルートフォルダを変更したいときは    '.pidlRoot = C_RF_PERSONAL のように書き換える    .lpszTitle = msgStr    .ulFlags = BIF_BROWSEFORCOMPUTER   End With   lngFoldPointer = SHBrowseForFolder(typBROWSEINFO)   strPathName = String$(128, vbNullChar)   SHGetPathFromIDList lngFoldPointer, strPathName   If Left(strPathName, 1) <> vbNullChar Then    m = Len(strPathName)    For n = m To 1 Step -1     If Asc(Mid(strPathName, n, 1)) <> 0 Then Exit For    Next n    strPathName = Mid(strPathName, 1, n)    ComdlgGetFolderStr = CStr(strPathName)   End If   Call CoTaskMemFree(lngFoldPointer) End Function <呼び出し側> FolderStr = ComdlgGetFolderStr

noname#1997
質問者

お礼

ありがとうございます。 しかし、使い方が分かりません。(^^ゞ APIって何? そこからちょっと勉強してみます。

関連するQ&A

  • 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でフォルダの選択時のパスを指定するには?

    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

  • 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でのフォルダ指定方法について

    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

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

    下記サンプルを使ってフォルダを指定させています。 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を使っています よろしくおねがいします

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

    どうしてもわからないのでご教授お願いします。 コマンドボタンを使用して、フォルダの選択のダイアログを表示し、選択したフォルダのパスを取得することはできたのですが、そこから取得したパスを任意のセルに表示させたいです。 どうすれば表示させることができるでしょうか。 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 ご教授宜しくお願いします。

  • エクセル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取得して保持できる ようにしたいのですが・・・ 急いでいるのでここで質問させて頂きました。 よろしくお願いします。

  • EXCEL2010のVBAについて教えて下さい。

    1つのBOOKから、 フォルダの中に入っているいろんなファイルを開くVBAです。 2002、2003では上手くいくのですが、2010で同じように記述したところ、 EXCEL以外のファイルが開きません。 どうかご教授よろしくお願いします。 With CreateObject("Scripting.FileSystemObject") FileType = .getfile(Myfilename).Type End With If Right(Myfilename, 4) = ".xls" Or Right(Myfilename, 5) = ".xlsx" Then Workbooks.Open Myfilename ElseIf Right(Myfilename, 4) = ".doc" Or Right(Myfilename, 5) = ".docx" Then Set objwd = CreateObject("Word.Application") objwd.Documents.Open Myfilename ElseIf Right(Myfilename, 4) = ".ppt" Or Right(Myfilename, 5) = ".pptx" Then Set PttApp = CreateObject("Powerpoint.Application") PttApp.Presentations.Open (Myfilename), ReadOnly:=msoFalse Else MsgBox "ファイル不正:" & FileType Exit Sub End If

  • 【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)フルパスではなく"ブックのあるパスから見た、選択したフォルダへの相対パス"を知る方法を教えて下さい。 よろしくお願いします。

専門家に質問してみよう