|
▼佐藤小次郎 さん:
前掲の File_Search() 修正版ですが、モジュール全体を読み返していて
おおよその利用法が分り、修正版の不具合が見つかりましたので、以下に
修正第2版を提示しておきます。
試されるときは こちらを使ってください。
'//New File_Search
Function File_Search() 'Dirコマンドによるファイル検索
Dim LookIn As String
Dim Filename As String
Dim SearchSubFolders As Boolean
Dim tmpPath As String
Dim sCmd As String
Dim ng As Long
Dim j As Long
Dim n As Long
Dim io As Integer
Dim buf() As Byte
Dim FoundFiles() As String
For j = Cnt(0) To 1 Step -1
LookIn = Left(TL_Path, Cnt(j)) '検索するフォルダ
SearchSubFolders = True 'Sub Folderも検索する
Filename = WK_Name '検索するファイル名
If Right$(LookIn, 1) <> "\" Then LookIn = LookIn & "\"
'---- Dirコマンドによるサブフォルダを含むファイル名の検索
Filename = LookIn & Filename
tmpPath = Environ$("Temp") & "\Dir.tmp" '一時ファイルパス
sCmd = "DIR """ & LookIn & Filename & """ /b/s/a:-D > """ _
& tmpPath & """" '' /b ファイル名のみ
'' /s サブディレクトリも検索
'' /a:-D サブディレクトリー名は表示しない
'Dirコマンド実行(tmpファイルに出力)
With CreateObject("WScript.Shell")
ng = .Run("CMD /C " & sCmd, 7, True)
End With
If ng Then
MsgBox "ファイル検索時にエラーが発生しました." & vbCr _
& "処理を中断します", , LookIn & Filename
Open_SW = "Error"
Exit Function
End If
'----- Dirコマンドで取得したファイル名を配列に格納
If FileLen(tmpPath) < 2 Then
'このパスでは見つからなかったとき
Debug.Print LookIn, Filename, "→ NO FILES"
Open_SW = "Error" '次に検索パスに飛ぶ
Else
io = FreeFile()
Open tmpPath For Binary As io
ReDim buf(1 To LOF(io))
Get #io, , buf
Close io
Kill tmpPath
FoundFiles() = Split(StrConv(buf, vbUnicode), vbCrLf)
'同名ファイルが存在した場合、フォルダのパスをセット
For i = 0 To UBound(FoundFiles) - 1
If FoundFiles(i) Like "*" & Filename & "*" Then
WK_Path = FoundFiles(i)
Open_SW = "OK"
Exit For
End If
Next
End If
Next j
If Open_SW <> "OK" Then
MsgBox "【" & WK_Name & "】対象ファイルなし" & vbCr _
& "対象ファイルを準備後、処理して下さい。"
End If
End Function
前任者の方が コードにコメントをつけておいてくださったので、プログラム
の流れがつかめたのですが、それによりますと、
まず このマクロが書いてあるBookを立ち上げると、
2つのBook
"TEC103イベント一覧.xls"
"TEC104イベント対応.xls"
を開いて、UserForm上で更新処理をするようですね?
で、2つのBookが 最初に開くこのBook(ThisWorkbook) の保存されている
フォルダと同じフォルダにあればいいのですが、何らかの事情で、このBook
のあるフォルダのサブフォルダとか、このBookのあるフォルダと同列の別フォ
ルダとかに保存されていたばあい、それを探しに行くために
> Function File_Search()
があるようなのですね。
一つ目が "TEC103イベント一覧.xls" の存在チェックで、これがこのBook と
同じフォルダ内になかったばあい、
以下で、他のフォルダ(近所からだんだん上位フォルダに範囲を広げて)に
検索に行っています。
>' イベント一覧.xlsの存在チェックで、NGの場合、再度検索を行う。
>' └イベント一覧 検索
> If Open_SW1 = "NG" Then
> WK_Name = "TEC103イベント一覧.xls"
> WK_Path = ""
>
> File_Search 'イベント一覧.xlsの検索
>
> If Open_SW = "Error" Then Exit Sub
>
> AD_Name1 = WK_Name
> AD_Path1 = WK_Path '検索出来たイベント一覧.xlsの絶対パスをセット
> End If
2つめは イベント対応.xls のほうで、以下です。
> ' イベント対応.xlsの存在チェックで、NGの場合、再度検索を行う。
> ' └イベント対応 検索
> If Open_SW2 = "NG" Then
> WK_Name = "TEC104イベント対応.xls"
> WK_Path = ""
>
> File_Search 'イベント対応.xlsの検索
> If Open_SW = "Error" Then Exit Sub
> AD_Name2 = WK_Name
> AD_Path2 = WK_Path '検索出来たイベント対応.xlsの絶対パスをセット
> End If
そしてこれ以外に FileSearch を呼び出しているところはありません。
作られた方は 「自動で」必要なファイルを開く、ということにたいへんこだわって
いらっしゃるようで、そのようなコーディングが随所にみられます。
その代わり、
対象とするBookのファイル名は
> "TEC103イベント一覧.xls"
> "TEC104イベント対応.xls"
に固定ですから、事情があって、他のファイル名で同じ処理をしようとしても
それができません。
ぼくがつくるなら、Application.GetOpenFilename メソッドをつかって
イベント一覧用Bookと イベント対応用Book を ユーザーにダイアログ使って
選択させます。
そうすれば、名前が変更されていても、マクロブックと同じフォルダになくても
ユーザーが指定したファイルをもとに処理ができるようになります。
このなが〜いプログラムはほとんど数行に簡素化できるでしょう。
|
|