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

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

ただいまの
回答率

89.13%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,575

pro-poke5

score 46

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

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

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

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

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


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

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

If InStr(OpenFileName, "東京") <> 0 Then
 A処理
Else
 B処理
End if


で分岐させています。

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

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

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

追記

    Set folderName = Application.FileDialog(msoFileDialogFolderPicker)
    folderName.Show

    'ファイルを開くダイアログ
    Set objFS = CreateObject("Scripting.FileSystemObject")
    Set objFD = objFS.GetFolder(folderName)

    For Each OpenFileName In objectFD.Files
    Next


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/20 16:37

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

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/20 16:38

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

    キャンセル

  • 2018/08/20 16:48

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

    キャンセル

  • 2018/08/21 14:28

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

    キャンセル

  • 2018/08/22 14:32

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

    キャンセル

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

  • ただいまの回答率 89.13%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る