ここから本文です

EXCEL VBA でのDirの使い方について

per********さん

2010/3/1711:55:49

EXCEL VBA でのDirの使い方について

'同階層フォルダ内のCSVファイルを参照
pathname = ThisWorkbook.Path
fname = Dir(pathname & "\*.csv", vbNormal)

'該当するファイルがある間
Do While fname <> ""

※※※

'フォルダ内の次のファイルを検索
fname = Dir() ←@@@

Loop

という感じでフォルダ内のファイルがなくなるまで処理を行っています。
そこで、上の※※※の位置に、ファイルの存在をチェックする為、
If Dir(kkk) <> ""
といれて、kkkが存在するときだけ処理を行うようにしたいのですが、
これをいれると、@@@の部分が、次のfnameを読んでくれなくなってしまいます。
(Dirがkkkを読むようになってしまうため)
そこで、Dirを使わずにファイルの存在をチェックする。
または、何か別の方法はないでしょうか?

どなたかよろしくお願いいたします。

閲覧数:
2,797
回答数:
3
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

for********さん

2010/3/1712:07:56

Dim fs As Object

Set fs = CreateObject("Scripting.FileSystemObject")
fs.fileexists (ファイルのパス)

戻り値がTrueの場合、ファイルが存在します。

質問した人からのコメント

2010/3/17 16:41:13

降参 できました!!ありがとうございました!!
わかりづらい質問だったと思いますが、的確な回答ありがとうございました。
他の方も詳細な解説ありがとうございました。

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

jin********さん

編集あり2010/3/1714:14:00

不明な点が2つ
・変数「kkk」はループ中で変化するか
・変数「kkk」にはワイルドカードを含まないかどうか
変化しないなら予めファイルの存在確認をしておいてブール型の変数にでも入れとけばいいし、
ワイルドカードを含むなら全体的なロジックを見直す必要があるかも。
まぁ恐らくループ中で変化するんでしょうね。

と言うわけで
変数「kkk」は「C:\hoge\hoge.txt」のような形式でループ中で変化する
という前提で書きます。

今のロジックを崩さないならFSO(FileSystemObject)のFileExists メソッドを使うのが簡単。
サンプル
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists(kkk) Then
MsgBox kkk & "は存在します"
End If
Set objFSO = Noting
※参照設定で「Microsoft Scripting Runtime」にチェックをいれておけば
CreateObjecの代わりに
Dim objFSO As FileSystemObject
Set obfFSO = New FileSystemObject
とする事もできます。


但し…
Dir(pathname & "\*.csv", vbNormal)
は拡張子「csv」のファイルだけを抽出する訳ではありません。
例えば「abc.csva」のようなファイルも抽出されます。
試しにコマンドプロンプトのDirコマンドでやってみても同じ現象がおきるので
これはDir関数のバグではなく仕様と見るべきかと思います。
ついでに言うとフォルダ名に「.csv」が含まれるフォルダも抽出されてしまいます。
第2引数の「vbNormal」は抽出対象に標準ファイル「も」含めると言う意味で
標準ファイル「だけ」を抽出するという意味では無い事に注意。
※まぁ実際にはほとんど起こりえない状況ではあるんですが

この点も踏まえるとDir関数をやめて全部FSOを使った方が良い気がします。
サンプル

Dim pathname As String
Dim kkk As String
Dim objFSO As FileSystemObject
Dim objThisFolder As Folder
Dim objTargetFile As File

Set objFSO = New FileSystemObject
pathname = ThisWorkbook.Path
Set objThisFolder = objFSO.GetFolder(pathname)
For Each objTargetFile In objThisFolder.Files
If UCase(objFSO.GetExtensionName(objTargetFile.Name)) = "CSV" Then
'拡張子CSVのファイルに対する処理
Debug.Print "Path=" & objTargetFile.Path
If objFSO.FileExists(kkk) Then
'kkkが存在する時の処理
End If
End If
Next
Set objTargetFile = Noting
Set objThisFolder = Noting
Set objFSO = Noting


FSOのリファレンスはこちらを参照
http://msdn.microsoft.com/ja-jp/library/cc409798.aspx

ero********さん

2010/3/1712:16:02

えーと…やりたいのは、指定したフォルダに存在する
CSVを列挙したいってことかな?

であれば下記の様なメソッドを作成すれば
すべてのCSVパスがstrPathArrey()に格納されるはず
まぁ動かしてないんだけど・・・


Dim hFso As FileSystemObject 'FileSystemObjectの新しいインスタンスを生成

Call fncFileSearch(hFso.GetFolder(ThisWorkbook.Path), False)


Public Function fncFileSearch(ByVal p_Folder As Folder, ByVal p_SubFolder As Boolean) As Boolean
Dim hFile As File
Dim hSubFolder As Folder 'Folderオブジェクト(サブフォルダ)

'すべてのcsvファイルを列挙する
For Each hFile In p_Folder.Files
With hFile
If LCase$(.Name) Like ".csv" Then
m_FileIdx = m_FileIdx + 1
ReDim Preserve strPathArrey(m_FileIdx)
strPathArrey(m_FileIdx) = .Path
End If
End With
Next hFile

'サブフォルダを検索するとき
If p_SubFolder Then
'サブフォルダ内のファイルを取得
With p_Folder
'サブフォルダ数を取得
If .SubFolders.Count > 0 Then
For Each hSubFolder In .SubFolders
DoEvents
If blnBreak Then
Exit Function
End If
'サブフォルダがある場合再帰的に繰り返す
Call fncFileSearch(hSubFolder, p_SubFolder)
Next
End If
End With
End If

Set hSubFolder = Nothing

End Function

あわせて知りたい

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる