質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

2144閲覧

フォルダを選択しファイル名を取得したい

pro-poke5

総合スコア46

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/08/20 06:48

編集2018/08/20 07:47

こんにちわ。
ExcelでVBAをかいています。

まず実現したいこと
・現在テキストファイルを選択できるダイアログが開きますが、ファイルを選択するダイアログにしたい
・選択するフォルダには「東京」か「大阪」の文字がファイル名についたテキストファイルが複数あります。それらすべてのテキストファイルを開き、ファイル名に「東京」がついているものと「大阪」のついているもので処理を変えたいです。

都道府県フォルダを選択し、そのなかにある「01東京.txt」「02東京.txt」「大阪02.txt」「000大阪.txt」のファイルを全て開き違った処理を行いたいため、ファイル名を取得しif文で分岐させたいといったものです。
結果的には「東京」の名の付くテキストファイルは処理により必要な部分を抜き出し「東京.csv」に、
「大阪」の名の付くテキストファイルは処理により必要な部分を抜き出し「大阪.csv」に出力させたいです。

今は以下のように単純にマクロ自身がいる場所のフォルダを開きテキストファイルを選択させます。

vba

1ChDir ThisWorkbook.Path & "\" 2OpenFileName = Application.GetOpenFilename("テキストファイル,*.txt")

これを、自身が存在する同じファイルを開きフォルダを選択させたいです。

この時フォルダ内にあるファイルの名前を取得させたいです。
今はOpenFileNameにファイル名が入ってくるので

VBA

1 2If InStr(OpenFileName, "東京") <> 0 Then 3 A処理 4Else 5 B処理 6End if 7

で分岐させています。

フォルダを選択し、フォルダ内のファイル一つひとつを開き「東京」ならAの処理「大阪」ならBの処理とするにはどうかけばよいのでしょうか?

フォルダを開くダイアログを調べたのですが、たくさんあって今回の場合どれを選べばいいのかよくわかりません…。

アドバイス、よろしくお願いいたします

追記

VBA

1 Set folderName = Application.FileDialog(msoFileDialogFolderPicker) 2 folderName.Show 3 4 'ファイルを開くダイアログ 5 Set objFS = CreateObject("Scripting.FileSystemObject") 6 Set objFD = objFS.GetFolder(folderName) 7 8 For Each OpenFileName In objectFD.Files 9 Next

For Each OpenFileName In objectFD.Filesでどうしてもエラーが出ます
パスが見つかりませんとでます
フォルダのパスがうまくとれていないのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

一番簡単なのはFileDialogを「msoFileDialogFolderPicker」指定で使う方法ではないでしょうか。

vba

1Dim Dialog As FileDialog 2Set Dialog = Application.FileDialog(msoFileDialogFolderPicker) 3Dialog.Show 4Debug.Print (Dialog.SelectedItems(1))

上記の例だと、選択したフォルダ1個をVBA開発環境の出力エリアに表示します(Debug.Printで表示している)。

これでフォルダ選択&指定ができるので、あとはsysjojoさんの回答にある方法で、対象フォルダに入っているファイルの一覧を取得。それぞれについて処理をすれば解決しそうですがどうですか?

投稿2018/08/20 07:08

backyard

総合スコア534

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pro-poke5

2018/08/20 07:37

ありがとうございます。 フォルダの選択はできようになりました。
guest

0

この時フォルダ内にあるファイルの名前を取得させたいです。

ここだけ。
ヒント
都道府県ごとにサブフォルダがあるようならこの辺も参考になるかと。

投稿2018/08/20 06:55

sysjojo

総合スコア325

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pro-poke5

2018/08/20 07:38

ありがとうございます。 真似して書いているのですが、サイトでいう For Each objFile In objFolder.Files の部分の.Fileでコンパイルエラーが発生いたします。 メソッドまたはデータメンバが見つかりませんといったものです。 なぜでしょうか…?
pro-poke5

2018/08/20 07:48

すみません、ひとまず上記のエラーは解消しました
sysjojo

2018/08/21 05:28

> Set objFD = objFS.GetFolder(folderName) はbackyardさんの回答に準ずれば Set objFD = objFS.GetFolder(folderName.SelectedItems(1)) では? 他にも変数名間違いがあるので、コードの先頭に「Option Explicit」つけると未定義エラーで悩むことが減っていいですよ。
pro-poke5

2018/08/22 05:32

ありがとうございます。 小さなミスをなくすように心がけます、アドバイスありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問