- ベストアンサー
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)
- 2ch
- ベストアンサー率51% (64/125)
Q.#2の方法で、・・・とエラーが返されてしまいます。やり方違いますか? A.こちらも同じエラーが出た Q.VB.NETだったら・・・VB6.0とかよりも良くないんでしょうか。 A.あまりVB.NETの必要性を感じておりません。 まわりにも.NETユーザがおりません。 ここの掲示板もそうだけど、どこでも、 環境:VB.NET と書いてあると、一気にレスが減ります。 それに将来性もあまり無いように思います。 MS曰く「XMLとの連携が・・・」 というのがあるけど、VB6でも、ある程度はできます。 PGなの? VBAができるならVB6がよいと思うけど、他の人と差をつけたいのであれば、別のスキルを積んでおいた方がよいと思う。 オブジェクト指向言語を理解すると、VBのスキルも自然に上がると思うし。 だからC・Javaなど あとは脱Winをすると、なお良い。Unix系
- 2ch
- ベストアンサー率51% (64/125)
>フォーム(EXCELではユーザーフォーム)が無いと出来ないみたいです。 いやOCXを参照設定したら、オブジェクトをコーディングで生成することが可能。 [ウィンドウズ\system32\Comdlg32.ocx]を参照設定 Private Sub Test() On Error GoTo PGMERR Dim objDlg As CommonDialog Set objDlg = New CommonDialog With objDlg .CancelError = True .DialogTitle = "ぱけらった" '↓どっちか1個だけ '.Flags = cdlOFNHideReadOnly Or cdlOFNCreatePrompt '存在しないファイルを作成する場合 '.Flags = cdlOFNHideReadOnly Or cdlOFNFileMustExist '存在しないファイルを許さない場合 .InitDir = Environ("windir") .Filter = "テキスト ファイル (*.txt)|*.txt|ピクチャ (*.bmp;*.ico)|*.bmp;*.ico" .Filename = "Format.exe" .ShowOpen MsgBox .Filename End With PGMEND: Set objDlg = Nothing Exit Sub PGMERR: MsgBox "キャンセルした" GoTo PGMEND End Sub
- kakusuke
- ベストアンサー率36% (95/259)
#2です。 フォーム(EXCELではユーザーフォーム) が無いと出来ないみたいです。 もともとフォームに貼り付けて 使うものですし。 マクロが実行するタイミングで フォームを読み込んで使用してください。 (xxxx(フォーム名).SHOW) とモジュールに書き込むとフォームが開かれ、 Form_Activateイベント内で、 コモンダイアログの SHOWを行って、 コモンダイアログウィンドウを 閉じるときに、 UNLOAD フォーム名 と打ってあげれば大丈夫です。 結構端折ってます。 分からない場合は スレッドを新たに立てて頂いたら、 飛んでいきます。
- kakusuke
- ベストアンサー率36% (95/259)
>#2の方法で、 >「COMDLG32.DLLを参照設定」 >とありますが、 >Excel Visual Basic Editorで >「ツール」→「参照設定」→「参照」ボタンで、 >COMDLG32.DLLを選択しても、 >「指定されたファイルへの参照は登録できません」 >とエラーが返されてしまいます。 >やり方違いますか? #2です。 合ってます。 もしかして、 「commdlg.dll」 を参照しようとした とかいうことはないですよね? 「COMDLG32.dll」は、 ふつうの「ファイルを指定して保存」の 画面などを表示させるためのものですから、 参照不可ということは無いです。 >VB.NETだったら… >VB6.0とかよりも良くないんでしょうか。 そんなことは無いですが、 .NETは まだまだバグが出てくるようなので、 VB6.0のほうがまだましってだけです。 むしろ、ACCESSのモジュールを作るなどして、 勉強したほうが、安上がりでなおかつ、 クライアント/サーバー型の アプリケーション開発の 効率のよい勉強になると思います。
- 2ch
- ベストアンサー率51% (64/125)
>vbscriptで デバッグはメッセージボックスを途中で表示するなり、ファイルにはいたりする、昔ながらの方法でやるのが一番かと >SとAを打ち間違えたと思ったんですが? 質問者不在で、質意と違う展開になりつつあり っていうかスレ起こせよw おもしれー
補足
質問者です。 たくさんの書き込みありがとうございます。 知識不足で難しいことも多いですが勉強になります。 いろいろ質問したいことがあるのですが、それは改めて質問させていただくとして… 少しだけ質問させてください。 #2の方法で、「COMDLG32.DLLを参照設定」とありますが、Excel Visual Basic Editorで「ツール」→「参照設定」→「参照」ボタンで、COMDLG32.DLLを選択しても、「指定されたファイルへの参照は登録できません」とエラーが返されてしまいます。やり方違いますか? ちなみに、2chさんのご指摘どおり、VBは持っておらず、使ったこともありません(ToT)。ExcelVBAのみです。VBを使ってみたいと思うのですが、結構高価なようで…。VB.NETだったら1万円台だと思うのですが、安い分、VB6.0とかよりも良くないんでしょうか。
- kakusuke
- ベストアンサー率36% (95/259)
vbscriptで debug.printやってどうなるんでしょう? ってことで、 SとAを打ち間違えたと思ったんですが? ちゃいますかね?
- 2ch
- ベストアンサー率51% (64/125)
召喚成功!感謝! 平日のお昼過ぎに、召喚し易いキャラだw 試しにARC氏も召喚したいが、失敗しそうなので、やめておこう
- todo36
- ベストアンサー率58% (728/1234)
呼んだ? >1.VBSって何でしょうか? WSHのことしょう。 フリーでVBモドキを動かせます。
- 2ch
- ベストアンサー率51% (64/125)
こんなスレ発見
- 2ch
- ベストアンサー率51% (64/125)
>>VBSって何でしょうか?勉強できるような本はありませんか? >たぶんVBAでしょう。 VBScript スクリプトざます。 この辺は、(迷惑でなければ)MSDNの検索上手なTodo36氏に召喚願いましょうw OSにはイパーイDLLが用意されている。 アイコンであったり、関数であったり、様々。 shell32.dll は、Winの関数ライブラリの代表的なライブラリ。 この中にはシェル系の関数イパーイ。 言語を問わずして利用可能だが、逆にどの言語用にもなっていない。 んでVB用にこのAPIを直接呼ばないでもいいように、コントロール化したのが用意されている。 COMDLG32.DLLはコモンダイアログの関数群 >shell32.dllのヘルプってそもそもあるんですか? シェル32についてだけっていうのは、見たことないけど、その中の関数については、MSDNに出てるザマス。 ただ質問者はVBではなく、EXCEL.VBAみたいなので、どの方法を使うにしても、MSDNオンラインが必須になるのかな? インストールしてあるVBAヘルプだけじゃ載ってないかもしれない。 「VisualStudioが入っていない」&「Officeだけ入っている」という環境を持っていないので、質問者のローカルマシンで、どの程度の調べが可能かが掴めない状況。
- 1
- 2
お礼
みなさま本当にありがとうございました。 非常に勉強になりました。 うまくいきそうです。 特に、kakusukeさん、2chさん、たくさんのご回答ありがとうございます。 どちらを20ptにすればいいのか悩みましたが、2chさんには申し訳ありませんが、先着のkakusukeさんに20ptとさせていただきました。 またよろしくお願いします。