|
▼kanabun さん:
kanabun様、早速ご回答頂きまして誠にありがとうございます。
教えて頂きました内容を元に自分なりにやってみましたが、
>If dic.Exists(v(i, 1)) の部分でつまづいております。
excelのセル中にはpdfの拡張子がついていませんが、
上記の記述で存在チェックは可能なのでしょうか?
再度ご教授願えないでしょうか。
よろしくお願い致します。
>▼Kohaku さん:
>
>>例えば、 1行目の 番号 100に '.pdf' をつけて 100.pdf として
>>ネットワーク越しのフォルダ内を検索し、存在した時にそのフルパス名の
>>リンクを名前欄の右セルにセットしたい
>
>一例ですが、
>サブフォルダを含むファイルの検索は Dirコマンド というのを使うと
>比較的簡単に、けっこう速く、取得できると思います。
>今回は すべて*.pdf という拡張子なので、Dirコマンドですべての*.pdf
>ファイルを取得します。
>
>取得した{ファイル名; パス名} の組は Dictionary に登録しておくと、
>シートのファイル名が辞書のキーにあれば、対応するパス名が辞書から
>取得できます。
>
>'事前に Microsoft Scripting Runtimeへの参照設定が必要です
>Sub Try1()
> Dim dic As Dictionary
> 'Const NETPath = "\\EPSON1120\Data (D)\(Data)\*.pdf"
> Const NETPath = "\\B450\(Pub)\*.pdf" '◆適宜変更
>
> Dim tmpFile As String
> Dim strCmd As String
> Dim buf() As Byte
> Dim fList() As String, f As String, s As String
> Dim i As Long, j As Long, n As Long
>
> 'Dirコマンドの結果を出力する一時ファイル
> tmpFile = Environ$("TEMP") & "\Dir.tmp"
>
> 'Dirコマンド用の文字列を編集
> strCmd = "Dir """ & NETPath & """ /b/s > """ & tmpFile & """"
>
> 'WSHでDirコマンドを実行
> With CreateObject("Wscript.Shell")
> .Run "cmd /c" & strCmd, 7, True
> End With
>
> '該当ファイルの存在チェック
> If FileLen(tmpFile) < 1 Then
> MsgBox "該当するファイルがありません"
> Exit Sub
> End If
>
> 'Dirコマンドの結果を出力した一時ファイルを読み込み
> Open tmpFile For Binary As #1
> ReDim buf(1 To LOF(1))
> Get #1, , buf
> Close #1
> Kill tmpFile '読んだら一時アイルは削除
>
> '取得したパス名をリスト用配列に入れます
> fList() = Split(StrConv(buf, vbUnicode), vbCrLf)
> n = UBound(fList)
> '{ファイル名とパス名}を辞書に登録します
> Set dic = New Dictionary
> dic.CompareMode = TextCompare
> For i = 0 To n - 1
> s = fList(i) 'パス名
> j = InStrRev(s, "\")
> f = Mid$(s, j + 1) '正味ファイル名
> dic(f) = s
> 'Debug.Print f, s
> Next
>
> 'シートのA列のファイル名が辞書にあればそのパス名を取得します
> Dim r As Range
> Dim v As Variant
> Set r = Range("A2", Cells(Rows.Count, 1).End(xlUp))
> v = r.Value
> For i = 1 To UBound(v)
> If dic.Exists(v(i, 1)) Then
> v(i, 1) = dic(v(i, 1)) 'そのファイルのあるパス名
> Else
> v(i, 1) = ""
> End If
> Next
> 'シートのB列に検索結果を貼り付ける
> r.Offset(, 1).Value = v
>End Sub
|
|