• ベストアンサー

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)

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

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)
回答No.16

>フォーム(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)
回答No.14

#2です。 フォーム(EXCELではユーザーフォーム) が無いと出来ないみたいです。 もともとフォームに貼り付けて 使うものですし。 マクロが実行するタイミングで フォームを読み込んで使用してください。 (xxxx(フォーム名).SHOW) とモジュールに書き込むとフォームが開かれ、 Form_Activateイベント内で、 コモンダイアログの SHOWを行って、 コモンダイアログウィンドウを 閉じるときに、 UNLOAD フォーム名 と打ってあげれば大丈夫です。 結構端折ってます。 分からない場合は スレッドを新たに立てて頂いたら、 飛んでいきます。

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

>#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)
回答No.12

>vbscriptで デバッグはメッセージボックスを途中で表示するなり、ファイルにはいたりする、昔ながらの方法でやるのが一番かと >SとAを打ち間違えたと思ったんですが? 質問者不在で、質意と違う展開になりつつあり っていうかスレ起こせよw おもしれー

takaandhiro
質問者

補足

 質問者です。  たくさんの書き込みありがとうございます。  知識不足で難しいことも多いですが勉強になります。  いろいろ質問したいことがあるのですが、それは改めて質問させていただくとして…  少しだけ質問させてください。  #2の方法で、「COMDLG32.DLLを参照設定」とありますが、Excel Visual Basic Editorで「ツール」→「参照設定」→「参照」ボタンで、COMDLG32.DLLを選択しても、「指定されたファイルへの参照は登録できません」とエラーが返されてしまいます。やり方違いますか?  ちなみに、2chさんのご指摘どおり、VBは持っておらず、使ったこともありません(ToT)。ExcelVBAのみです。VBを使ってみたいと思うのですが、結構高価なようで…。VB.NETだったら1万円台だと思うのですが、安い分、VB6.0とかよりも良くないんでしょうか。

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

vbscriptで debug.printやってどうなるんでしょう? ってことで、 SとAを打ち間違えたと思ったんですが? ちゃいますかね?

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

召喚成功!感謝! 平日のお昼過ぎに、召喚し易いキャラだw 試しにARC氏も召喚したいが、失敗しそうなので、やめておこう

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.9

呼んだ? >1.VBSって何でしょうか? WSHのことしょう。 フリーでVBモドキを動かせます。

参考URL:
http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/wshtop.htm
  • 2ch
  • ベストアンサー率51% (64/125)
回答No.8

こんなスレ発見

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?qid=564664
  • 2ch
  • ベストアンサー率51% (64/125)
回答No.7

>>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だけ入っている」という環境を持っていないので、質問者のローカルマシンで、どの程度の調べが可能かが掴めない状況。

関連するQ&A

専門家に質問してみよう