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

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

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

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

2回答

440閲覧

ファイル検索結果に応じてメッセージ出力

Q_Q

総合スコア10

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

1クリップ

投稿2019/04/04 14:03

前提・実現したいこと

ファイル検索結果に応じてメッセージ出力させたい
3番目のファイルは存在しないです。

発生している問題

3番目が存在しないファイルで見つかりませんでしたの旨のメッセージを出力させたいのですが
下記の実行結果となります

【実行結果】
□C:\Users\AAAA\BBBB.xls
■C:\Users\CCCC\DDDD.xls
■C:\Users\AAAA\BBBB.xls
□C:\Users\CCCC\DDDD.xls
■C:\Users\AAAA\BBBB.xls
■C:\Users\CCCC\DDDD.xls

【コード】
Sub Sample()
Call FileSearch("C:\Users\AAAA", "BBBB.xls")
Call FileSearch("C:\Users\CCCC", "DDDD.xls")
Call FileSearch("C:\Users\EEEE", "FFFF.xls")
End Sub

Sub FileSearch(Path As String, Target As String)
Dim FSO As Object, Folder As Variant, File As Variant
Set FSO = CreateObject("Scripting.FileSystemObject")
For Each Folder In FSO.GetFolder(Path).SubFolders
Call FileSearch(Folder.Path, Target)
Next Folder
For Each File In FSO.GetFolder(Path).Files
If (File.Name = Target) Then
msg = "□" & File.Path & "が見つかりました"""
MsgBox msg
Else
msg = "■" & File.Path & "が見つかりました"""
MsgBox msg
End If
Next File
End Sub

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

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

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

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

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

guest

回答2

0

For Each File In FSO.GetFolder(Path).Filesですべてのファイルをスキャンしてますが、
同じファイル名が見つかったらmsg変数に見つかったと代入してループを抜ける。
msg変数が""のままならファイルは存在しなかった。
というロジックにするといいでしょう。

コードの修正例

vba

1Sub FileSearch(Path As String, Target As String) 2 Dim FSO As Object, Folder As Variant, File As Variant 3 Dim msg As String 4 5 Set FSO = CreateObject("Scripting.FileSystemObject") 6 For Each Folder In FSO.GetFolder(Path).SubFolders 7 Call FileSearch(Folder.Path, Target) 8 Next Folder 9 10 For Each File In FSO.GetFolder(Path).Files 11 If (File.Name = Target) Then 12 msg = "□" & File.Path & "が見つかりました" 13 Exit For 14 End If 15 Next File 16 If msg = "" Then msg = "■" & Path & "内に" & Target & "は見つかりませんでした" 17 MsgBox msg 18End Sub

別解

ファイルが存在するかどうかは、FileSystemObject.FileExistsメソッドを使うとシンプルです。

vba

1Sub FileSearch(Path As String, Target As String) 2 Dim FSO As Object, Folder As Variant, File As Variant 3 Dim msg As String 4 5 Set FSO = CreateObject("Scripting.FileSystemObject") 6 For Each Folder In FSO.GetFolder(Path).SubFolders 7 Call FileSearch(Folder.Path, Target) 8 Next Folder 9 10 If FSO.FileExists(Path & "\" & Target) Then 11 msg = "□" & Path & "\" & Target & "が見つかりました" 12 Else 13 msg = "■" & Path & "内に" & Target & "は見つかりませんでした" 14 End If 15 Debug.Print msg 16End Sub

投稿2019/04/05 01:00

hatena19

総合スコア33715

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

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

0

提示のコードではフォルダ内のファイルをリストアップして出力してるという動作なので、
存在しないファイルというのは出しようがないと思いますが。

投稿2019/04/04 21:40

y_waiwai

総合スコア87774

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問