• ベストアンサー

GetAttrが原因?

http://officetanaka.net/excel/vba/tips/tips95.htm を参考に、 フォルダの一覧を取得するコードを作ってるのですが Sample4ならエラーにならずにフォルダの一覧を取得できるのですが、 フォルダ名にドットがある場合も取得されてしまうので、Sample6を使いたいのですが、 If GetAttr(buf) And vbDirectory Then の部分で、 「53ファイルが見つかりません。」 のエラーになります。 なぜでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.3

参照ページのSample6を修正なくそのまま使ってる場合は >「53ファイルが見つかりません。」 このエラーは出ないはずです。 例えば Sub Sample6()   Dim buf As String, msg As String   buf = Dir("C:\TEST\*.*", vbDirectory)   Do While buf <> ""     If GetAttr(buf) And vbDirectory Then       If buf <> "." And buf <> ".." Then msg = msg & buf & vbCrLf     End If     buf = Dir()   Loop   MsgBox msg End Sub このようにDir関数で、カレントフォルダではなく、特定フォルダを指定するように修正してあると ご提示のエラーになります。 変数bufにはDir関数の結果、ファイル名が入ります。 これに対して「GetAttr(buf)」この箇所を修正していないと、 ファイル名しか指定していない事になりますから、 カレントフォルダ&ファイル名になって、「53ファイルが見つかりません。」となります。 参照ページの冒頭に >なお、カレントフォルダはC:\Workにしてあります。 とありますね。 フォルダ指定を省略してありますから、Dir関数もGetAttr関数もカレントフォルダ つまり「C:\Work」に対する処理とみなされます。 修正するなら両方必要。 buf = Dir("C:\TEST\*.*", vbDirectory) If GetAttr("C:\TEST\" & buf) And vbDirectory Then ただ、対象フォルダにUnicode文字を使ったファイル名があると、 GetAttr関数のところで今度は「52 ファイル名または番号が不正です」のエラーになります。 直下のフォルダだけ取得するようなケースなら「FileSystemObject」を使ったほうが楽かもしれません。 Sub try()   Const p = "C:\TEST\"   Dim f As Object   Dim s As String   For Each f In CreateObject("scripting.filesystemobject").GetFolder(p).SubFolders     s = s & f.Name & vbLf   Next   MsgBox s End Sub

pnywmusg32
質問者

お礼

ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • angel_Z
  • ベストアンサー率66% (12/18)
回答No.2
pnywmusg32
質問者

お礼

ブログ見てみます。

すると、全ての回答が全文表示されます。
  • angel_Z
  • ベストアンサー率66% (12/18)
回答No.1

こんにちは。 フォルダ内に、読み取り専用フォルダがあるとエラーがおきますので、 Sub Sample6() Dim buf As String, msg As String Dim zokusei As Integer, enzan As Integer Dim Path_Str as String Path_Str = "C:\Documents and Settings\" '最後のフォルダが読み取り専用フォルダの場合は、\をつけないとエラーがおきます buf = Dir(Path_Str, vbDirectory + vbHidden) '←読み取り専用追加 Do While buf <> "" zokusei = Getattr(Path_str & buf) enzan = zokusei And 16 If enzan = 16 Then If buf <> "." And buf <> ".." Then msg = msg & buf & vbCrLf End If buf = Dir() Loop MsgBox msg End Sub

pnywmusg32
質問者

お礼

読み取り専用フォルダがあるとエラーになるのですか。 知りませんでした。 vbHiddenを追加したらうまく行きました。ありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A