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

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

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

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

Q&A

解決済

4回答

1967閲覧

特定フォルダに複数ファイルが存在する場合に、指定したファイルパスを取得する方法

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

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

0グッド

0クリップ

投稿2019/03/21 11:29

特定フォルダに複数ファイルが存在した場合の処理について、以下の方法を考えているのですがもっとよい処理方法があれば教えて頂きたいです。

処理としては以下になります。
前提:特定フォルダ(今回はC:\AAAAとします)にS1_YYYYMMDD__計算データ.csvというフォルダが格納される

  1. 特定フォルダ内にS1_YYYYMMDD__計算データ.csvというフォルダが存在するかチェックする

1つしかない場合はそのままファイルのフルパスを返して処理を終了する

  1. 複数あった場合は、画面に以下のMSGを表示する

【C:\AAAA配下にファイルが複数存在します。S1_YYYYMMDD__計算データ.csvを読込ますか?】
はいを押下時は、メッセージボックスに表示したファイルのフルパスを返して処理を終了
いいえを押下時は次のファイルを探して処理を実施する

  1. いいえを押下し続け、フォルダ内を全部検索し終わった場合は

【読込対象ファイルが存在しません】を出力する
※なお、今回はC:\AAAAフォルダを表示してユーザー側に直接ファイルを選択させる、という方法は利用不可になっています。

条件を満たすように以下のコードを書いてみたのですが、処理的にあまりスマートではないのでは?と思っています。
改善策がありましたらご教示いただけないでしょうか。

html

1Sub FilePassGet() as Strung 2Dim rootFolder As String, rootname As String, FileName As String, Filename2 As String 3rootFolder = "C:\AAAA" 4 5rootname = "S1_" 6If rootFolder = "" Then 7   MsgBox "フォルダが存在しません" 8   END 9End if 10 11 12 rootname = "*" & rootname & "_計算データ*.csv" 13If Dir(rootFolder, vbDirectory) = "" Then     14MsgBox "計算データファイルが存在しません" 15   END 16End if 17 18FileName = Dir(rootFolder & "\" & rootname, vbNormal) 19 20 If FileName = "" Then Err.Raise 53 21 22If FileName = "" Then     23MsgBox "計算データファイルが存在しません" 24   END 25End if 26 27 28Filename2 = Dir() 29Dim infomsg As String, msg As String 30 31If Filename2 <> "" Then 32 infomsg = "{0}配下にファイルが複数存在します。{1}を読込ますか?" 33 infomsg = Replace(Replace(infomsg, "{0}", rootFolder), "{1}", FileName) 34 msg = MsgBox(infomsg, vbYesNo + vbQuestion) 35 If msg <> 6 Then 36 FileName = Filename2 37 infomsg = "{0}配下にファイルが複数存在します。{1}を読込ますか?" 38 infomsg = Replace(Replace(infomsg, "{0}", rootFolder), "{1}", FileName) 39 40 msg = MsgBox(infomsg, vbYesNo + vbQuestion) 41 FileName = Dir() 42 43 Do While FileName <> "" 44 45 msg = MsgBox(infomsg, vbYesNo + vbQuestion) 46 47 FileName = Dir() 48 49 If msg <> 6 Then GoTo msgEnd 50 51 Loop 52 53 If FileName = "" Then     54 MsgBox "読込対象ファイルが存在しません" 55    END 56 End if 57 58 59 End If 60End If 61 62msgEnd: 63 64 65FilePassGet = FileName 66 67End Sub

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

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

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

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

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

y_waiwai

2019/03/21 11:45

その提示したコードにはなにか不具合があるんでしょうか
退会済みユーザー

退会済みユーザー

2019/03/21 11:46

不具合自体はないと思います。 ただ、もっと簡潔に処理できないかと思い質問させて頂きました。
ttyp03

2019/03/22 00:45

どこらへんが不満なんでしょうか?
退会済みユーザー

退会済みユーザー

2019/03/22 01:07

If Filename2 <> "" Then〜 以降のループ処理がなんとなく煩雑なような気がしていて、もっとシンプルに記述できないかな…というリファクタリング的な観点が一番気になる所です。 ただ、他にも処理的に煩雑な箇所があればシンプルに記載できないかなと思っています。
guest

回答4

0

ベストアンサー

突っ込みどころは多数ありますね。
気づいた点だけ列挙しておきます。
どうすればいいかはご自分でお考えください。

  • 関数の呼び出し元がわかりませんが、ENDで終わっているところがあって作りが乱暴
  • 最初のrootFolderの存在チェックが単なる変数の文字列比較rootFolder=""
  • ところどころ全角のスペースがある
  • インデントがぐちゃぐちゃ
  • MsgBoxの戻り値の比較がマジックナンバー6
  • 似たようなMsgBoxが3回もあるのはどうにかならないのか
  • MsgBoxの処理なんかは関数化したほうがスッキリする
  • 最深部のMsgBoxは固定値になっているが問題ない?

投稿2019/03/22 02:39

ttyp03

総合スコア16998

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

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

退会済みユーザー

退会済みユーザー

2019/03/22 02:43

ご回答ありがとうございます! インデントのずれや全角スペースはソースからこちらにコピーした時に何故かずれ、園修正せずに上げてしまいました。大変失礼致しました。 他の点は現在修正しているので参考にさせて頂きます!
guest

0

直接の回答ではありません。

ループの度にmsgboxにファイル名をだすのは、ユーザー側からの依頼のためです。

ユーザーはVBAの機能を理解していないから、そのような依頼になるのです。
そのユーザーの真の目的は、「複数のファイルから、特定のファイルを選択したい」ということだと思います。

ならば、ユーザーフォームにリストボックスとコマンドボタンを配置して、リストボックスに該当するファイルのリストを表示させて選択できるようにして、コマンドボタンクリックで処理開始という設計にするのが目的に合致するし、はるかに使いやすいはずです。

その依頼を受けたなら、私なら上記のサンプルを見せて、「どうですか」と提案しますね。

提案した上で、メッセージボックスを何度も出した方がいいというのなら仕方ないですが。

投稿2019/03/22 00:58

hatena19

総合スコア33699

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

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

退会済みユーザー

退会済みユーザー

2019/03/22 01:10

ご回答ありがとうございます! そんな案もあるのですね…勉強になりました。 リストボックスを出す方法を自分が知らなかったので方法を調べてみようと思います!
guest

0

こちらの「複数のファイルを選択可能にする」という項目があてになると思います。

顧客のやりたいようにmsgboxを表示するなら、ファイルの階層読み込みを使うのが一番メンテナンスが楽です。
私の作成したソースで良ければ無料で配布しておりますので利用下さい。

投稿2019/03/22 02:37

stdio

総合スコア3307

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

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

0

VBA?
VBS?
実際にファイル読み込むのではなくファイルのパス返すだけならrootFolder配下全部読み込んで一覧でmsgboxに表示して上げれば?
ループのたびにmsgbox出す理由って何ですか?

投稿2019/03/21 11:57

minehan

総合スコア170

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

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

退会済みユーザー

退会済みユーザー

2019/03/21 12:01 編集

VBAになります。 ループの度にmsgboxにファイル名をだすのは、ユーザー側からの依頼のためです。 (ファイルが入ってるフォルダを表示させる案や、ファイル一覧を出す案も出しましたが、一回ごとにファイル名を出してほしいという要望があったためです。)
minehan

2019/03/21 12:31

仕様通りなら問題ないのでは? リファクタリングの観点から言うのであれば エラーハンドリングの部分と変換処理してる箇所は共通関数として定義しておけばいいのでは?
退会済みユーザー

退会済みユーザー

2019/03/21 12:41

ご回答ありがとうございます! 確かに、エラーと変換処理の所は共通関数と定義した方がいいですね。 エラーと変換処理の箇所は共通関数として定義しようと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問