[[20241107064627]] 『ドライブを接続してない場合、エラーを回避してメ』(今泉) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ドライブを接続してない場合、エラーを回避してメッセージを』(今泉)

ExcelのVBAでDドライブを接続してない場合、エラーが出ます。

  Set folder = fso.GetFolder("D:\ #Nendo")

エラーは出さずに「Dドライブを接続してください」とMSGBOXで表示して
SUBを終了させるコードを考えましたが
何か2度も同じようなMSGBOXを利用することになりました。

もっとスマートなコードがありそうなのであれば教えて下さい。

' ---- 現在のコード -----

   ' ファイルシステムオブジェクトを作成
    Set fso = CreateObject("Scripting.FileSystemObject")

    'Dドライブの接続チェック
    If Not fso.DriveExists("D:") Then
        MsgBox "Dドライブを接続してください", vbExclamation
        Exit Sub
    End If

    'Dドライブが存在する場合、
    '  On Error Resume Nextを使用してエラーハンドリングを有効にして
    '  D:フォルダを取得
    On Error Resume Next
    Set folder = fso.GetFolder("D:\#Nendo")

    'エラーが発生した場合(Dフォルダが存在しない=Err.Numberが0以外の場合)
    'この場合、メッセージボックスを表示してサブルーチンを終了。
    If Err.Number <> 0 Then
        MsgBox "Dドライブを接続してください", vbExclamation
        Exit Sub
    End If

    'エラーハンドリングを無効化
    On Error GoTo 0

< 使用 Excel:Excel2021、使用 OS:Windows11 >


Sub test()
    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    If FSO.DriveExists("D:") = False Then GoTo ErrDriveExists

    Set folder = FSO.GetFolder("D:\#Nendo")
    'なにかの作業

    Exit Sub

ErrDriveExists:

    MsgBox "Dドライブを接続してください", vbExclamation
End Sub

例えばこんな感じとか。。。

「VBA エラー回避」で検索してみると例文がみつかると思います。
(まっつわん) 2024/11/07(木) 08:15:42


 FolderExistsメソッドを使うと On Error xx を使わなくて済みますし、
 メッセージもより適切なものに限定できると思います。
(xyz) 2024/11/07(木) 08:18:09

 もちろん2段階でチェックするのは同じです。
(xyz) 2024/11/07(木) 08:19:17

例外処理、エラー処理

とかが用語としては正しいかも。。。?
(まっつわん) 2024/11/07(木) 08:19:44


まっつわんさん、サンプルコードをありがとうございます。

xyzさん、教えてもらったFolderExistsメソッドを利用すると
わかりやすいコードになりました。

ありがとうございます。

    ' ファイルシステムオブジェクトを作成
    Set fso = CreateObject("Scripting.FileSystemObject")

    'D:ドライブの存在チェック
    If fso.FolderExists("D:\#Nendo") Then
        'D:ドライブが存在
    Else
        MsgBox "「D:ドライブ」又は「D:\#Nendo」が存在しません。" & vbCrLf & vbCrLf & _
               "「Dドライブ」の接続を確認してください。", vbOKOnly + vbInformation, "確認 !!"
        Exit Sub
    End If
(今泉) 2024/11/07(木) 09:11:47

 ちょっと違います。
 こんな風になりませんか?

 Sub test()
     Const folder As String = "D:\#Nendo"
     Dim fso     As Object
     Dim drive   As String

     Set fso = CreateObject("Scripting.FileSystemObject")

     'ドライブの接続チェック
     drive = Left(folder, 2)
     If Not fso.DriveExists(drive) Then
         MsgBox drive & "ドライブを接続してください", vbExclamation
         Exit Sub
     End If

     'フォルダの存在チェック     
     If Not fso.FolderExists(folder) Then
         MsgBox folder & " が存在しません。確認して下さい"
         Exit Sub
     End If

     '以下正常の場合の処理
 End Sub

(xyz) 2024/11/07(木) 09:26:46


ありがとうございます。
ご指摘を受けてミスを修正しました。

    'Dドライブの存在チェック
    If Not fso.DriveExists("D") Then
        MsgBox "「D:ドライブ」が接続されていません。" & vbCrLf & vbCrLf & _
               "「Dドライブ」の接続を確認してください。", vbOKOnly + vbInformation, "確認 !!"
        Exit Sub
    End If

     'フォルダの存在チェック
     If Not fso.FolderExists("D:\#Nendo") Then
         MsgBox folder & " が存在しません。確認して下さい。"
         Exit Sub
     End If

(今泉) 2024/11/07(木) 11:04:05


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.