こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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

投稿日時 - 2003-06-23 00:07:48

QNo.582393

暇なときに回答ください

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

こんな感じで。
[標準モジュール側]
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

投稿日時 - 2003-06-27 01:20:24

お礼

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

投稿日時 - 0000-00-00 00:00:00

ANo.15

このQ&Aは役に立ちましたか?

6人が「このQ&Aが役に立った」と投票しています

回答(17)

ANo.17

2ch

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系

投稿日時 - 2003-06-27 11:16:14

ANo.16

2ch

>フォーム(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

投稿日時 - 2003-06-27 10:34:23

ANo.14

#2です。

フォーム(EXCELではユーザーフォーム)
が無いと出来ないみたいです。

もともとフォームに貼り付けて
使うものですし。

マクロが実行するタイミングで
フォームを読み込んで使用してください。
(xxxx(フォーム名).SHOW)
とモジュールに書き込むとフォームが開かれ、
Form_Activateイベント内で、
コモンダイアログの
SHOWを行って、
コモンダイアログウィンドウを
閉じるときに、
UNLOAD フォーム名
と打ってあげれば大丈夫です。

結構端折ってます。
分からない場合は
スレッドを新たに立てて頂いたら、
飛んでいきます。

投稿日時 - 2003-06-27 00:48:36

ANo.13

>#2の方法で、
>「COMDLG32.DLLを参照設定」
>とありますが、
>Excel Visual Basic Editorで
>「ツール」→「参照設定」→「参照」ボタンで、
>COMDLG32.DLLを選択しても、
>「指定されたファイルへの参照は登録できません」
>とエラーが返されてしまいます。
>やり方違いますか?

#2です。
合ってます。
もしかして、
「commdlg.dll」
を参照しようとした
とかいうことはないですよね?
「COMDLG32.dll」は、
ふつうの「ファイルを指定して保存」の
画面などを表示させるためのものですから、
参照不可ということは無いです。

>VB.NETだったら…
>VB6.0とかよりも良くないんでしょうか。

そんなことは無いですが、
.NETは
まだまだバグが出てくるようなので、
VB6.0のほうがまだましってだけです。
むしろ、ACCESSのモジュールを作るなどして、
勉強したほうが、安上がりでなおかつ、
クライアント/サーバー型の
アプリケーション開発の
効率のよい勉強になると思います。

投稿日時 - 2003-06-27 00:39:28

ANo.12

2ch

>vbscriptで
デバッグはメッセージボックスを途中で表示するなり、ファイルにはいたりする、昔ながらの方法でやるのが一番かと

>SとAを打ち間違えたと思ったんですが?
質問者不在で、質意と違う展開になりつつあり

っていうかスレ起こせよw
おもしれー

投稿日時 - 2003-06-26 02:10:36

補足

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

投稿日時 - 2003-06-27 00:03:03

ANo.11

vbscriptで
debug.printやってどうなるんでしょう?

ってことで、
SとAを打ち間違えたと思ったんですが?

ちゃいますかね?

投稿日時 - 2003-06-26 00:18:29

ANo.10

2ch

召喚成功!感謝!

平日のお昼過ぎに、召喚し易いキャラだw

試しにARC氏も召喚したいが、失敗しそうなので、やめておこう

投稿日時 - 2003-06-25 14:56:32

ANo.9

呼んだ?

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

参考URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/wshtop.htm

投稿日時 - 2003-06-25 14:15:49

ANo.8

2ch

こんなスレ発見

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?qid=564664

投稿日時 - 2003-06-25 11:51:30

ANo.7

2ch

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

投稿日時 - 2003-06-25 10:29:58

ANo.6

browseforfolderだと、
あくまでも
存在しているフォルダしか
使えないので
不便だと思って、
common dialogコントロールを
薦めたんですがねぇ。
MSDNにヘルプもあったはずだし。

ちなみに
>1.VBSって何でしょうか?勉強できるような本はありませんか?
たぶんVBAでしょう。

>2.shell.applicationって何でしょうか?
shell32.dll
というプログラムの
クラスオブジェクト(機能)
を使いますよ
という意味。

>3.browseforfolderをヘルプで調べても出てきませんが?
shell32.dllのヘルプってそもそもあるんですか?
2chさんなら知ってそう。

投稿日時 - 2003-06-25 00:15:46

ANo.5

2ch

っていうか#1・#2は無視か

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

投稿日時 - 2003-06-24 12:44:27

ANo.4

2ch

スレ見ろ

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

投稿日時 - 2003-06-24 12:39:22

ANo.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

投稿日時 - 2003-06-23 21:01:22

お礼

ありがとうございます。
うまくいきました。
申し訳ありませんが、質問があります。
超初心者ですみません。よろしくお願いします。

1.VBSって何でしょうか?勉強できるような本はありませんか?
2.shell.applicationって何でしょうか?
3.browseforfolderをヘルプで調べても出てきませんが?

投稿日時 - 2003-06-23 22:52:38

ANo.2

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

投稿日時 - 2003-06-23 01:11:34

ANo.1

こんにちは。

WindowsAPIを使わないとダメだったと思います。

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

投稿日時 - 2003-06-23 00:19:29

あなたにオススメの質問