Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


13187 / 13644 ツリー ←次へ | 前へ→

【6616】Dir関数によるフォルダ存在確認 ama 03/7/15(火) 13:21 質問
【6620】Re:Dir関数によるフォルダ存在確認 つん 03/7/15(火) 14:16 発言
【6622】Re:Dir関数によるフォルダ存在確認 Jaka 03/7/15(火) 14:58 発言
【6623】Re:Dir関数によるフォルダ存在確認 ama 03/7/15(火) 15:14 発言
【6624】Re:Dir関数によるフォルダ存在確認 ama 03/7/15(火) 15:18 発言
【6629】Re:Dir関数によるフォルダ存在確認 でれすけ 03/7/15(火) 17:11 発言
【6630】Re:Dir関数によるフォルダ存在確認 MPUS 03/7/15(火) 17:20 回答
【6631】Re:Dir関数によるフォルダ存在確認 ama 03/7/15(火) 18:01 お礼
【6636】申し訳ございません。 Jaka 03/7/16(水) 9:19 回答

【6616】Dir関数によるフォルダ存在確認
質問  ama  - 03/7/15(火) 13:21 -

引用なし
パスワード
   いつもお世話になっております。
そんなはずない、そんなはずない、いいながら
何度も見返しているのですが、どうもよく分かりません。
どなたか教えていただけないでしょうか。

Excel2002で、次のファンクションを書きました

' Dir関数によるフォルダ存在確認
' 存在すればTrue, しなければFalseを返す
Public Function IsDirExist( _
  ByVal path As String _
  ) As Boolean
  
  IsDirExist = (Dir(path, vbDirectory) <> "")
    
End Function

次に、それを下記のように呼び出しました

Dim b as Boolean
b = IsDirExist("E:\Documents and Settings\name\デスクトップ\Test\a.txt")

するとTrueになるんです(!)
確かに、a.txtは存在しますが、フォルダではありません

ウォッチ式でDir(path, vbDirectory)を見てみると、
"a.txt"が返ってきています。

Dir関数って、ヘルプを見ると

引用ここから---------------------------------
pathname に指定した内容が見つからないときは、
長さ 0 の文字列 (" ") を返します。
引用ここまで---------------------------------

って書いてあるんですけど..。
#ないっちゅーねん(^_^;

どういうことなんでしょうか..。IsDirExistの書き方は
あっているとしか思えないんです。(^_^;;
すみませんが、何がまずいのかご指摘いただけないでしょうか?

どうぞ、よろしくお願いいたしますm(_ _;m

【6620】Re:Dir関数によるフォルダ存在確認
発言  つん E-MAIL  - 03/7/15(火) 14:16 -

引用なし
パスワード
   ama さん、こんにちは

えっと、私も直接、

 MsgBox Dir("C:\WINDOWS\デスクトップ\テスト\テスト.xls", vbDirectory)

という形で試してみたら、「テスト.xls」という結果が帰ってきました。
フォルダ名じゃなくて、ファイル名じゃん・・・なんかよーわかりませんね(T_T)

で、フォルダの存在確認なら、「FileSystemObject」で、ではどうですか?
こんな感じ

Sub Test()

  Dim fso As Object
  
  Set fso = CreateObject("Scripting.FileSystemObject")
  
  MsgBox fso.FolderExists("C:\WINDOWS\デスクトップ\テスト")
  
  Set fso = Nothing

End Sub

これを実行すると、「True」が返ってきます。
「"C:\WINDOWS\デスクトップ\GHP\リスト.xls"」を引数にすると、
「False」になります。

直接的な回答ではないですけど・・・・

【6622】Re:Dir関数によるフォルダ存在確認
発言  Jaka  - 03/7/15(火) 14:58 -

引用なし
パスワード
   こんにちは。
つんさん おじゃまします。

>えっと、私も直接、
> MsgBox Dir("C:\WINDOWS\デスクトップ\テスト\テスト.xls", vbDirectory)
>という形で試してみたら、「テスト.xls」という結果が帰ってきました。
>フォルダ名じゃなくて、ファイル名じゃん・・・なんかよーわかりませんね(T_T)

え〜っと、そんなわけないじゃんと、試してみたら同じ結果に.....。
かなり、ぶったまげました。

なんせ[#3321]で、まんま回答していた時はフォルダ名が返ってきていたのに....。
これってウイルスかなんかなのかなぁ?
それともMSが勝手になんか(アップデートの類)したってことですか?

何にしてもどっかぶっ壊れたみたいな感じです。
今後、ichinoseさんのコードを使うしか、手がなくなっちゃうんでしょうか?
ピンチだ!
Win98se & 97SR1

【6623】Re:Dir関数によるフォルダ存在確認
発言  ama  - 03/7/15(火) 15:14 -

引用なし
パスワード
   ▼Jaka さん:
▼つん さん:
ありがとうございます。
ですよね、ですよね。もうストレスたまるたまる...。(^_^;
今後どころか、これではこれまでの過去プロジェクトの信頼性に
関わってきますよ..。

>で、フォルダの存在確認なら、「FileSystemObject」で、ではどうですか?
いえいえ、ありがとうございますm(_ _)m。これでいこうと思います。
#FileSystemObjectってWSHだけでしか使えないのかとおもってました(^^;;

ちなみに、PathIsDirectoryというAPIを使えば一発で確認できますが、
APIは、必要にして最小限の量を使うべき、というスタンスに宗旨替えした
ので、Dir関数による存在確認にこだわっていたのです。
VBAの機能のみならば、少なくともExcel自身のバグででも無い限り、
アプリケーションエラーにはならないでしょうし..。
(APIの呼び出しミスでアプリケーションエラーを起こしてから、懲りました:-p)

【6624】Re:Dir関数によるフォルダ存在確認
発言  ama  - 03/7/15(火) 15:18 -

引用なし
パスワード
   >ちなみに、PathIsDirectoryというAPIを使えば一発で確認できますが、
ちなみに、のちなみに、
Public Declare Function PathIsDirectory Lib "SHLWAPI.DLL" Alias "PathIsDirectoryA" (ByVal pszPath As String) As Boolean
宣言は上記のとおりです、他にも色々ありますが、IEの4.0(?)以降が入っていないと
ダメです。
googleで検索するとそれなりにヒットすると思います

【6629】Re:Dir関数によるフォルダ存在確認
発言  でれすけ  - 03/7/15(火) 17:11 -

引用なし
パスワード
   こんにちわ
このようにGetAttr関数を使った方法もあります。

Public Function IsDirExist(ByVal path As String) As Boolean
On Error Resume Next
IsDirExist = GetAttr(path) And vbDirectory
End Function

【6630】Re:Dir関数によるフォルダ存在確認
回答  MPUS  - 03/7/15(火) 17:20 -

引用なし
パスワード
   amaさん こんにちは

dir関数のヘルプをよく読めば分かると思いますよ。
引数 attributes で vbNormal 0 標準ファイル
となっています。

vbDirectoryを指定してもvbNormalも含まれます。
従って関数は次のようにすればいいと思います。

Public Function IsDirExist(path As String) As Boolean
 If Dir(path, vbDirectory) <> "" Then _
  IsDirExist = GetAttr(path) And vbDirectory
End Function

【6631】Re:Dir関数によるフォルダ存在確認
お礼  ama  - 03/7/15(火) 18:01 -

引用なし
パスワード
   ▼でれすけ さん
▼MPUS さん:
レス。ありがとうございます。

> Public Function IsDirExist(ByVal path As String) As Boolean
> On Error Resume Next
> IsDirExist = GetAttr(path) And vbDirectory
> End Function
:-) 確かに。APIのGetFileAttributesを使う手もありますね。

>dir関数のヘルプをよく読めば分かると思いますよ。
>引数 attributes で vbNormal 0 標準ファイル
>となっています。
.....ははぁ、そういうことですか。ビットフラグとばかり思っていたら..。
先入観とは恐ろしいです(^^;
これだと、いかなる値を指定しようとも 値0である以上、かならず
指定する扱いになってしまいますね。
いや、引っかかりました。詐欺ですよ、そんなの..。(苦笑)

>>Public Function IsDirExist(path As String) As Boolean
> If Dir(path, vbDirectory) <> "" Then _
>  IsDirExist = GetAttr(path) And vbDirectory
>End Function
ありがとうございます。ただ、空文字列を渡すと、ErrがRaiseされてしまうので、
#Dir("",vbDirectory)とすると、"."が返ってくる
でれすけ さんの、On Error Resume Nextのようなエラートラップ処理なり、
事前の判断なりは必要かもしれませんね。

皆さんお騒がせしました。
今日は大変勉強になりました。

本当に、ありがとうございましたm(_ _)m
また、よろしくお願いいたします

【6636】申し訳ございません。
回答  Jaka  - 03/7/16(水) 9:19 -

引用なし
パスワード
   もう必要ありませんが、間違いがあったようなので

[#6635]の方に改訂版として書きこませてもらいました。
すみませんでした。

13187 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free