• ベストアンサー

VBAでユーザーにフォルダを指定させたい

 Win2000でEXCEL97を使ってます。  ExcelVBAでダイアログボックスなどによりユーザーにフォルダを指定させたいのです。  ファイルを指定させるには、GetOpenFileNameメソッドを使えば出来ることは分かったのですが、フォルダを指定させるような方法が分からないのです。  本で読んだところでは、Excel2002ではFileDialogプロパティで可能なようなのですが、Excel97では出来ないようで…  97でも可能な方法があればご教授下さい。  よろしくお願いします。

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

  • ベストアンサー
  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.15

こんな感じで。 [標準モジュール側] Option Explicit Public FILEPATH As String Public Sub FilePathGet() UserForm1.Show vbModal MsgBox FILEPATH End Sub [ユーザーフォーム側] Option Explicit Private Sub UserForm_Activate() Dim I As Integer Dim strFileName As String Dim strWorkFileName As String Dim strCurrentDirectory As String Dim strCurrentDrive As String 'ドライブ名の保存 strCurrentDrive = Left$(CurDir$, 1) 'ディレクトリ名の保存 strCurrentDirectory = CurDir$ '読み込み専用のチェックボックスを隠す&エクスプローラスタイル CommonDialog1.Flags = cdlOFNHideReadOnly + cdlOFNExplorer '規定値をテキストファイルだけ抽出するように設定 CommonDialog1.Filter = "テキストファイル(*.txt)|*.txt|すべてのファイル(*.*)|*.*" 'キャンセル時のエラーナンバーを取得するように設定 CommonDialog1.CancelError = True 'エラーが発生してもプログラムを続行 On Error Resume Next 'コモンダイアログウインドウを「ファイルを開く」形式で表示 CommonDialog1.ShowOpen 'キャンセル時の処理 If Err.Number = cdlCancel Then 'エラーのクリア On Error GoTo 0 'Command_Endに飛ぶ。 GoTo Command_End End If 'その他のエラー時の処理 If Err.Number <> 0 Then 'エラーの番号と、エラーメッセージを表示 MsgBox Format$(Err.Number) & ":" & Err.Description, vbOKOnly + vbExclamation, "エラーです。(T_T)" 'Command_Endに飛ぶ。 GoTo Command_End End If strFileName = CommonDialog1.Filename For I = Len(strFileName) To 1 Step -1 If Mid$(strFileName, I, 1) = "\" Then 'ファイルのパス名を取得する。 FILEPATH = Mid$(strFileName, 1, I - 1) Exit For End If Next Command_End: 'ドライブを元に戻す。 ChDrive strCurrentDrive 'ディレクトリを元に戻す。 ChDir strCurrentDirectory Unload Me End Sub

takaandhiro
質問者

お礼

みなさま本当にありがとうございました。 非常に勉強になりました。 うまくいきそうです。 特に、kakusukeさん、2chさん、たくさんのご回答ありがとうございます。 どちらを20ptにすればいいのか悩みましたが、2chさんには申し訳ありませんが、先着のkakusukeさんに20ptとさせていただきました。 またよろしくお願いします。

その他の回答 (16)

  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.6

browseforfolderだと、 あくまでも 存在しているフォルダしか 使えないので 不便だと思って、 common dialogコントロールを 薦めたんですがねぇ。 MSDNにヘルプもあったはずだし。 ちなみに >1.VBSって何でしょうか?勉強できるような本はありませんか? たぶんVBAでしょう。 >2.shell.applicationって何でしょうか? shell32.dll というプログラムの クラスオブジェクト(機能) を使いますよ という意味。 >3.browseforfolderをヘルプで調べても出てきませんが? shell32.dllのヘルプってそもそもあるんですか? 2chさんなら知ってそう。

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.5

っていうか#1・#2は無視か どっちかっていうと、そっちの方がいい。 スクリプトは最終手段として考えるべき。

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.4

スレ見ろ

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=580219
回答No.3

こんにちは。 VBS 使うとできます。 こんな感じ。 Dim sh As Object Dim myFolder As Object Set sh = CreateObject("shell.application") Set myFolder = sh.browseforfolder(0, "フォルダを選択してください", 0) Debug.Print myFolder.Items.Item.Path

takaandhiro
質問者

お礼

ありがとうございます。 うまくいきました。 申し訳ありませんが、質問があります。 超初心者ですみません。よろしくお願いします。 1.VBSって何でしょうか?勉強できるような本はありませんか? 2.shell.applicationって何でしょうか? 3.browseforfolderをヘルプで調べても出てきませんが?

  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.2

COMDLG32.DLL (systemフォルダもしくはsystem32フォルダにある。) を参照設定して、 オブジェクト(コントロール)を フォームに貼り付けて使えば よろしいのではないでしょうか?

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.1

こんにちは。 WindowsAPIを使わないとダメだったと思います。 http://www14.big.or.jp/~kawamura/ ↑こちらのサイトにある、flist.xls で実現されていたと思います。(ソースも見れたと思います)