
VB6です。以下の様な関数を使っています。
用途としては、ファイルの有無を調べています。
で、関数の値として実際のパソコンに存在しないフォルダを指定した際、
下のエラー処理(AAA)に飛びません。
わかる方いらしたら、よろしくお願いします。
Public Function files(ByVal strPathName As String) As Boolean
On Error GoTo AAA
If (GetAttr(strPathName) And vbDirectory) = vbDirectory Then
Stop
Else
Stop
End If
Exists2 = True
Exit Function
AAA:
Stop
End Function
No.1ベストアンサー
- 回答日時:
>If (GetAttr(strPathName) And vbDirectory) = vbDirectory Then
この部分がエラーになるため起こっています。
VB6でファイルの存在をチェックするのであればDIR関数を使うのが一般的ではないでしょうか?
DIR関数はファイルが存在すればファイル名を返し、存在しない場合はNULLを返します。
If Dir(strpathname) <> vbNullString Then
End if
で判定することができます。
ほかにもFileSystemObjectを使用しFileExistsメソッドを使用して有無を判定することができます。
FileSystemObjectを使用する場合はMicrosoft Scripting Runtimeの参照設定が必要です。
回答ありがとうございます。
dir関数で出来ました。
ありがとうございます。
そこで、今後のために聞きたいのですが、
If (GetAttr(strPathName) And vbDirectory) = vbDirectory Then
というような物を使用した場合、これをエラーを出させる、
又は何かしらの回避の手段というのはあるのでしょうか?
No.7
- 回答日時:
>パソコンに存在しないフォルダを指定した際、
>下のエラー処理(AAA)に飛びません。
エラー処理に飛ばない、との判断はどのようにしましたか?
質問者のコードでいいと思いますがねぇ。
但し、
Exists2 = True これは拙いのでは?
関数名がfilesなんですから、
files = True では?
何れにしろ質問者のコードのStopをMsgBoxに変えて再確認をお奨めします。
'---------------------------------------
Public Function files(ByVal strPathname As String) As Boolean
On Error GoTo AAA
If (GetAttr(strPathname) And vbDirectory) = vbDirectory Then
MsgBox strPathname & " は、フォルダー"
Else
MsgBox strPathname & " は、有るよ"
End If
files = True ●追加
'Exists2 = True ■これ違いますよね、たぶん。
Exit Function
AAA:
MsgBox strPathname & " は、ないよ!"
End Function
’------------------------------------------
以上。
回答ありがとうございます。
エラー処理に飛ばないというのは、その前にエラーメッセージが出て
止まってしまうと言うことです。
関数名の件は、変更忘れです。
仰る通りです。
No.6
- 回答日時:
Public Function Files(ByVal strPathName As String) As Boolean
On Error GoTo Error_Files
' 処理コード
Exit_Files:
Files = isExists
Exit Function
Error_Files:
isExists = False
Resume Exit_Files <--- 訂正!
End Function
No.5
- 回答日時:
すいません回避方法でしたね。
ON ERROR RESUME NEXT
を使用すれば処理が続行されます。
エラーが実際に起きると、Err.Numberに値がセットされています。
Err.NumberはもともとVBが持っている値ですので宣言は必要ありません。
Err.Number=53のときがファイルまたはフォルダが存在しないときです。
Err.Number=52で帰ってきた場合はパスとして無効なもの(ワイルドカード含む等)の2種類しかないようです。
例としては下記のようになります。
On Error Resume Next
If (GetAttr(strPathName) And vbDirectory) = vbDirectory and Err.number = 0 Then
Exists2 = True
Stop
Elseif err.number <> 0 then
Err.number = 0 '必ずクリアしてください
'AAAの処理
else
Stop
End If
Exit Function
No.4
- 回答日時:
Public Function Files(ByVal strPathName As String) As Boolean
On Error GoTo Error_Files
' 処理コード
Exit_Files:
Files = isExists
Exit Function
Error_Files:
isExists = False
Resume End_function
End Function
原則1、関数からの抜け道は一つにする。
原則2、ラベル名は、Exit_関数名(End_関数名)、Error_関数名(Err_関数名)で統一する。
ラベルの命名が原則を逸脱していましたので訂正し補足しておきます。
多分、エラーの原因は、かかる原則の逸脱によるものだと思いますよ。
No.3
- 回答日時:
Getattr関数はファイルまたはディレクトリの状態を判別するために使用します。
Getattr関数は対象があって初めて使用すべき関数であって、存在チェックのために使用すべきではないようです。Getattr関数は戻り値としてFileAttribute 型のデータがかえってきます。
戻り値の各ビットの状態をチェックすることで、ファイルまたはフォルダの属性を知ることができます。
Normal
vbNormal
通常。
ReadOnly
vbReadOnly
読み取り専用です。
Hidden
vbHidden
隠しファイル。
System
vbSystem
システム ファイル。
Directory
vbDirectory
ディレクトリまたはフォルダ。
Archive
vbArchive
前回のバックアップ以降に変更されているファイル。
Alias
vbAlias
他の名前が付いているファイル。
といった感じで割り当てられています。
たとえばDirectoryのビットがONの状態であれば、Getattrに渡したパスはフォルダであることをさします。
>(GetAttr(strPathName) And vbDirectory) = vbDirectory
の式は戻り値とvbDirectoryの論理積をとり、結果がvbDirectoryのビットがONであることを求めます。
ビットがわからないとわかりずらい説明かもしれませんが、補足が必要な場合はまた質問をお書きください。
No.2
- 回答日時:
Public Function Files(ByVal strPathName As String) As Boolean
On Error GoTo Error_Files
Dim isExists As Boolean
isExists = True
If (GetAttr(strPathName) And vbDirectory) = vbDirectory Then
Stop
Else
Stop
End If
End_function:
Files = isExists
Exit Function
Error_Files:
Stop
isExists = False
Resume End_function
End Function
一応、これで On Error GoTo Error_Files へと飛ぶかと思います。
もちろん、次のように簡略化してもOKです。
Public Function Files(ByVal strPathName As String, Optional filType As Integer = 0) As Boolean
On Error Resume Next
Files = CBool((GetAttr(strPathName) And filType) = filType)
End Function
[イミディエイト]
? Files("C:\Temp\111.txt") <--- 通常ファイルかどうかをチェック!
True
? Files("C:\Temp", vbDirectory) <---- フォルダかどうかをチェック!
True
? Files("C:\Temp\111.txt", vbDirectory) <---- フォルダかどうかをチェック!
False
これは、関数の戻り値を設定しない場合には自動的にFalseが戻されるのを利用しています。
蛇足ですが、Scripting.FIleSystemObject を使う手もありますよ。
[イミディエイト]
? FileExists("C:\Temp\11111.txt")
False
? FileExists("C:\Temp\111.txt")
True
Public Function FileExists(ByVal FileName As String) As Boolean
Dim fso As Object
Set fso = CreateObject("Scripting.FIleSystemObject")
FileExists = fso.FileExists(FileName)
End Function
Public Function FolderExists(ByVal FolderName As String) As Boolean
Dim fso As FileSystemObject
Set fso = New FileSystemObject
FolderExists = fso.FolderExists(FolderName)
End Function
回答ありがとうございます。
Scripting.FIleSystemObjectは少しだけ聞いたことがあるような。
これを機会に勉強してみます
ありがとうございました
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/03 09:11
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/09 10:33
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) あるフォルダーのファイルを違う親フォルダーのサブフォルダーに移したい 11 2023/02/15 19:00
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) 【VBA】印刷マクロのループ処理が反映されません 3 2022/08/09 02:15
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【関数】同じ関数なのに、エラ...
-
access テキストボックスの値取得
-
エクセル2010 VBAのサウ...
-
batファイルでレジストリキーの...
-
Excelvbaのマクロのファイル名...
-
RAR圧縮ファイル(分割)の順番が...
-
fgets関数のEOFの扱い方について
-
エクセルでシートを別のブック...
-
VBA ExecuteExcel4Macro 型が一...
-
アクセスのクエリでコンパイル...
-
DOCUMENT行の書き出しについて-...
-
エクセルマクロでエラーの原因...
-
ExcelVBAで既に開いてるwordを...
-
gccを行ってもexeファイルが生...
-
PDFファイルへのリンクについて...
-
データベースソフトのアクセス2...
-
ISOファイルとMDSファイル
-
【マクロ】変数に入れるコード...
-
USBメモリー上の MP4 ファイル...
-
ccdファイルはどのようにして使...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【関数】同じ関数なのに、エラ...
-
access テキストボックスの値取得
-
「パス名が無効です」の発生原因
-
ExcelVBAで既に開いてるwordを...
-
NAS上のファイルの使用中が解除...
-
Returnに対するGoSubがありません
-
gccを行ってもexeファイルが生...
-
PowerShellを使って関連付けら...
-
batファイルでレジストリキーの...
-
アクセスのクエリでコンパイル...
-
VB6 Dir関数で52エラー発生
-
エクセルマクロでエラーの原因...
-
VBでファイルが開かれているか...
-
【COBOL】read文でエラー
-
FTPの送信結果を検知したい
-
VBから参照できないCのDLLを使...
-
fgets関数のEOFの扱い方について
-
ACCESS VBAでのインポート
-
データベースソフトのアクセス2...
-
DisplayAlertsブロパティで ”実...
おすすめ情報