|
こんばんは。
>たびたびすいません、下記についてその逆はできないでしょうか?
>(ファイル名のみでフルパスを取得する方法)
>自分でも調べてみて色々試しているのですが何分VBAに関してはずぶの初心者なものでして・・・
>これは無理です。
>カレントディレクトリやBookと同じフォルダにあるファイルであれば可能ですけど。
>(これができたら、フォルダAのtest.txtとフォルダBのtest.txtのどっちかどう区別
>するのってこと)
Blueさんのおっしゃるとおりですが・・・、
指定されたファイル名でドライブの各フォルダをサーチするという事なら、
標準モジュールに
'===========================================================
Sub main()
Dim sflnm As Variant
Dim ans As Long
Dim flnm As String
dim i as long
Cells.ClearContents
sflnm = Application.InputBox("サーチするファイル名")
If TypeName(sflnm) = "Boolean" Then Exit Sub
ans = fold_open("d:\", sflnm, False)
If ans = 0 Then
flnm = fold_get()
Do While flnm <> ""
Cells(i + 1, 1).Value = flnm
i = i + 1
flnm = fold_get
Loop
Else
If ans = 1 Then
MsgBox "見つからない"
Else
MsgBox Error(ans)
End If
End If
Call fold_close
End Sub
別の標準モジュールに
'==========================================================
Private f_cnt As Long
Private f_path() As String
Private f_idx As Long
Function fold_open(ByVal stDir As String, ByVal f_file As String, ByVal 捜索階層) As Long
'指定されたパスを捜索開始パスとして、指定されたファイルを捜索します
'尚、ファイル名の大文字・小文字は区別しません
'input : stDir-----捜索開始パス
' f_file----捜索ファイル名
' 捜索階層---False-----開始パスから全ての階層を捜索する
' 数値(>0)-開始パスから指定された階層のフォルダを捜索する(1の場合は、開始パスのみ)
'output : fold_open 0--------条件に合ったファイルが1つ以上見つかった
' 1--------条件に合ったファイルは見つからない
' その他---以上終了(エラーコード)
On Error Resume Next
Dim fso As Object
Dim f_fld As Object
fold_open = 0
Erase f_path()
Set fso = CreateObject("Scripting.FileSystemObject")
Set f_fld = fso.GetFolder(stDir)
If Err.Number <> 0 Then
fold_open = Err.Number
Else
f_cnt = 0
Call fold_search(f_fld, f_file, 捜索階層)
If f_cnt <= 0 Then
fold_open = 1
Else
f_idx = 1
End If
End If
Set fso = Nothing
Set f_fld = Nothing
End Function
'========================================================================
Sub fold_search(ByVal f_fld As Object, ByVal f_file As String, ByVal 捜索階層)
Dim sfld As Object
Dim fl As Object
Dim ret As Boolean
For Each fl In f_fld.Files
If UCase(fl.Name) Like UCase(f_file) Then
ReDim Preserve f_path(1 To f_cnt + 1)
f_path(f_cnt + 1) = fl.Path
f_cnt = f_cnt + 1
End If
Next fl
If VarType(捜索階層) = vbBoolean Then
ret = True
Else
If 捜索階層 - 1 > 0 Then
捜索階層 = 捜索階層 - 1
ret = True
Else
ret = false
End If
End If
If ret = True Then
For Each sfld In f_fld.SubFolders
Call fold_search(sfld, f_file, 捜索階層)
Next
End If
End Sub
'===================================================================
Function fold_get() As String
'fold_openが0だった場合、順次見つかったファイルのフルパスを取り出す
'output: fold_get-----条件に合ったファイルのフルパス。空白の場合は、データの終わり
If f_idx > UBound(f_path()) Then
fold_get = ""
Else
fold_get = f_path(f_idx)
f_idx = f_idx + 1
End If
End Function
'===========================================================
Sub fold_close()
'ファイル捜索のクローズ処理
Erase f_path
f_idx = 0
f_cnt = 0
End Sub
でmainを実行してみてください。
入力を求められますから、調べるファイル名を指定してください
(例、Book1.Xls Test.Txt 等)
OKボタンクリックで Dドライブをサーチします。
サーチ結果をアクティブシートのA列(A1〜)にフルパスで出力します。
こういうことではないですか?
|
|