- ベストアンサー
VBAでユーザーにフォルダを指定させたい
Win2000でEXCEL97を使ってます。 ExcelVBAでダイアログボックスなどによりユーザーにフォルダを指定させたいのです。 ファイルを指定させるには、GetOpenFileNameメソッドを使えば出来ることは分かったのですが、フォルダを指定させるような方法が分からないのです。 本で読んだところでは、Excel2002ではFileDialogプロパティで可能なようなのですが、Excel97では出来ないようで… 97でも可能な方法があればご教授下さい。 よろしくお願いします。
- みんなの回答 (17)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じで。 [標準モジュール側] 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
その他の回答 (16)
- kakusuke
- ベストアンサー率36% (95/259)
browseforfolderだと、 あくまでも 存在しているフォルダしか 使えないので 不便だと思って、 common dialogコントロールを 薦めたんですがねぇ。 MSDNにヘルプもあったはずだし。 ちなみに >1.VBSって何でしょうか?勉強できるような本はありませんか? たぶんVBAでしょう。 >2.shell.applicationって何でしょうか? shell32.dll というプログラムの クラスオブジェクト(機能) を使いますよ という意味。 >3.browseforfolderをヘルプで調べても出てきませんが? shell32.dllのヘルプってそもそもあるんですか? 2chさんなら知ってそう。
- 2ch
- ベストアンサー率51% (64/125)
っていうか#1・#2は無視か どっちかっていうと、そっちの方がいい。 スクリプトは最終手段として考えるべき。
- 2ch
- ベストアンサー率51% (64/125)
スレ見ろ
- GuruGuru22
- ベストアンサー率51% (177/346)
こんにちは。 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
お礼
ありがとうございます。 うまくいきました。 申し訳ありませんが、質問があります。 超初心者ですみません。よろしくお願いします。 1.VBSって何でしょうか?勉強できるような本はありませんか? 2.shell.applicationって何でしょうか? 3.browseforfolderをヘルプで調べても出てきませんが?
- kakusuke
- ベストアンサー率36% (95/259)
COMDLG32.DLL (systemフォルダもしくはsystem32フォルダにある。) を参照設定して、 オブジェクト(コントロール)を フォームに貼り付けて使えば よろしいのではないでしょうか?
- papayuka
- ベストアンサー率45% (1388/3066)
こんにちは。 WindowsAPIを使わないとダメだったと思います。 http://www14.big.or.jp/~kawamura/ ↑こちらのサイトにある、flist.xls で実現されていたと思います。(ソースも見れたと思います)
- 1
- 2
お礼
みなさま本当にありがとうございました。 非常に勉強になりました。 うまくいきそうです。 特に、kakusukeさん、2chさん、たくさんのご回答ありがとうございます。 どちらを20ptにすればいいのか悩みましたが、2chさんには申し訳ありませんが、先着のkakusukeさんに20ptとさせていただきました。 またよろしくお願いします。