何気にクリックしたら私が前に書いたコードだったのでビックリしました^^;
どうも混乱させてしまった様で、すみませんでした。
記述の方法は、他の回答者様がご説明下さいましたので省略しますが、前回書
いたコードにはバグがあって、、ルートフォルダを選択すると¥記号が2重に
なってしまい、うまく動かなかったのかもしれません。
C:\\ <---こんな感じのパスが BrowseForFolder の戻り値になってしまう
バグフィックスし、若干余計なモノをカット、必要なモノを多少加筆したもの
を再掲しておきます。
UNC 変換部は、会社など複数の PC で使うには必要だと思いますので、残して
おきました。フォルダ選択ダイアログは Shell を使った簡易な方法もあります
が、環境により動作が微妙に違うなど不安定要素がありますので、あえて API
を使ってます。
以下ソースコードです。
'■■■■■ 【 Module1 にコピー&ペースト 】 ■■■■■■■■■■■
Option Explicit
' フォルダ選択ダイアログ
' API
Private Declare Function SHBrowseForFolder Lib "shell32.dll" ( _
lpbi As BROWSEINFO) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" ( _
ByVal pidl As Long, ByVal pszPath As String) As Long
Private Declare Function WNetGetConnection Lib "mpr.dll" Alias "WNetGetConnectionA" ( _
ByVal lpszLocalName As String, _
ByVal lpszRemoteName As String, _
cbRemoteName As Long) As Long
Private Declare Sub CoTaskMemFree Lib "ole32" (ByVal pv As Long)
' BROWSEINFO構造体
Private Type BROWSEINFO
hwndOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Integer
lpfn As Long
lParam As Long
iImage As Integer
End Type
Private Const CSIDL_DESKTOP = &H0 'デスクトップ
Private Const BIF_RETURNONLYFSDIRS = &H1 'フォルダのみ
Private Const MAX_PATH = 260
'-----------------------------------------------------------------
' @Description: フォルダ選択ダイアログ表示(右に\マークをつけてフォルダパスを返す)
' @Param : [strCaption] 省略可能 ダイアログに表示する文字列
' @Param : [ConvertUNC] 省略可能 ネットワークドライブ名を UNC に変換
' @Return : String
'-----------------------------------------------------------------
Public Function BrowseForFolder( _
Optional strCaption As String = "フォルダを指定して下さい", _
Optional blnConvUNC As Boolean = False) As String
Dim udtBrowserInfo As BROWSEINFO
Dim lngRet As Long
Dim strPath As String
With udtBrowserInfo
.ulFlags = BIF_RETURNONLYFSDIRS
.lpszTitle = strCaption
.pidlRoot = CSIDL_DESKTOP
End With
lngRet = SHBrowseForFolder(udtBrowserInfo)
If lngRet > 0 Then
strPath = String$(MAX_PATH, vbNullChar)
Call SHGetPathFromIDList(lngRet, strPath)
Call CoTaskMemFree(lngRet)
strPath = Left$(strPath, InStr(strPath, vbNullChar) - 1)
If Right$(strPath, 1) <> "\" Then
strPath = strPath & "\"
End If
If blnConvUNC Then Call ConvUNC(strPath)
BrowseForFolder = strPath
Else
BrowseForFolder = vbNullString
End If
End Function
' ネットワークドライブ名を含むパスを UNC に変換する
Private Sub ConvUNC(ByRef strPath As String)
Dim strDRV As String
Dim strBuf As String * MAX_PATH
strDRV = Left$(strPath, 2)
If strDRV Like "[A-Z]:" Then
Call WNetGetConnection(strDRV, strBuf, MAX_PATH)
If InStr(strBuf, vbNullChar) > 1 Then
strPath = _
Left$(strBuf, InStr(1, strBuf, vbNullChar) - 1) _
& Mid$(strPath, 3)
End If
End If
End Sub
'■■■■■ 【 Module1 ここまで 】 ■■■■■■■■■■■■■■■■
'■■■■■ 【 Module2 にコピー&ペースト 】 ■■■■■■■■■■■
Option Explicit
Sub フォルダ内全ブックの順次処理()
Dim strFolderPath As String
Dim strFoundFile As String
Dim strMes As String
Dim WB As Workbook
'処理対象ファイル
Const cnsTARGET_FILE As String = "*.xls"
' フォルダ選択ダイアログ表示
strFolderPath = BrowseForFolder(, True)
' 長さ0の文字列が返った場合はキャンセルとする
If strFolderPath = vbNullString Then Exit Sub
On Error GoTo ERROR_HANDLER
' フォルダ内のファイル検索
strFoundFile = Dir(strFolderPath & cnsTARGET_FILE)
If strFoundFile = vbNullString Then
MsgBox "指定された場所に対象ファイルはありません.", vbExclamation
Exit Sub
End If
' ファイルが見つからなくなるまでループ
Do While strFoundFile <> vbNullString
' マクロが書かれたファイルは除外
If strFoundFile <> ThisWorkbook.Name Then
'ここで作成済みのマクロを呼び出す ------------------------
MsgBox strFoundFile '(EX)
'---------------------------------------------------------
End If
' 再検索
strFoundFile = Dir()
Loop
TERMINATE:
Exit Sub
ERROR_HANDLER:
Application.ScreenUpdating = True
Select Case Err.Number
Case Is = 52: strMes = "ドライブにアクセスできません."
Case Else: strMes = Err.Description
End Select
MsgBox "Error(" & Err.Number & ")" & vbCrLf _
& strMes, vbCritical
Resume TERMINATE
End Sub
'■■■■■ 【 Module2 ここまで 】 ■■■■■■■■■■■■■■■■
お礼
度々、どうも有難うございました。自身の学習にもっと時間を費やすことに心がけたいと思いました。またよろしくお願い致します。