2017-07-19 6 views
0

私はExcel 2013でワークフローを最適化するためにいくつかのVBAを作成していますが、Windows 10マシンを使用しています。 は、私は以下のとおり、ファイル名に特定のコンテンツを探しているファイル構造を横断する単純な再帰プロシージャを使用します。私は何が起こるかを把握するために、いくつかのデバッグを行っている

Function filePathToList(fileStart As String, firstString As String, secondString As String) As String 
Dim FileSystem As Object 
Dim HostFolder As String 

HostFolder = fileStart 
Set FileSystem = CreateObject("Scripting.FileSystemObject") 

filePathToList = DoFolder(FileSystem.GetFolder(HostFolder), LCase(firstString), LCase(secondString)) 
End Function 

Function DoFolder(Folder, firstString As String, secondString As String) As String 
Dim SubFolder 
For Each SubFolder In Folder.SubFolders 
    DoFolder = DoFolder(SubFolder, firstString, secondString) 
Next 
Dim File 
For Each File In Folder.Files 
    If (InStr(1, LCase(File.name), firstString) > 0) And (InStr(1, LCase(File.name), secondString) > 0) Then 
     DoFolder = Folder.Path & "\" & File.name 
     Debug.Print DoFolder 
     Debug.Print File.name 
     Debug.Print File 
     Exit Function 
    End If 
Next 
End Function 

、と私はmned * Dだろうが、 VBAは私見つかったファイルの接頭辞として "〜$" を追加することを決定:

X:\05_Sputnik\T\Pony\_New_building_YYYYpp_\~$Komplettlista_Mamma mu.xlsx 
~$Komplettlista_Mamma mu.xlsx 
X:\05_Sputnik\T\Pony\_New_building_YYYYpp_\~$Komplettlista_Mamma mu.xlsx 

私が見る方法をそれは完全なパスは次のとおりです。 X:\ 05_Sputnik \ T \ Pony_New_building_YYYYpp_ \ Komplettlista_Mamma mu.xlsx とVBAそれを開こうとしたときにそれを見つけられなかったことを訴えるので、私は同意します。

私は部分文字列抽出を行うことでこれを解決できますが、それはあまり素敵ではありません。私の質問は、しかしです。

これはどうしてですか?

ファイルは、予想される場所と似た名前の隠しファイルがありません。 Windowsは私にトリックをしていますか?

+0

'〜$'ファイルは、ブックを開くとき(または他の誰かがブックを開くとき)に作成された一時的なロックファイルです。ワークブックを閉じたときにそれらを再度削除する必要がありますが、Excelがクラッシュしたり類似していると残ってしまうことがあります。 (注:テンポラリファイルは単にダミーファイルであるか、誰がファイルを開いているのかというユーザーIDが入っているかもしれませんが、Excelワークブックではありません)。 – YowE3K

+0

フォルダ内の各ファイルを繰り返し処理します。ファイルWindowsは一時的にそのファイルのロックを作成していますか?したがって、ファイル名の残りの部分で一致が見つかった場合、その名前が返されます。 – kjbergman

+0

いいえ - ロックファイルは、ファイルが現在Excelで開いている場合(マクロが入っているファイルなど)、または以前はExcelで開いていても正しく閉じられていない場合にのみ作成されます。あなたのコードは、ファイルを実際に開くことなく、ディレクトリ内のファイルを繰り返し処理するだけです.Windows Explorerでフォルダを見た場合と同じファイルが表示されるはずです(WEに「隠しファイルを表示」が有効になっていると仮定します)。 – YowE3K

答えて

0

あなたは(そのようなドキュメントを開いたときにOfficeアプリケーションによって生成されたロックファイルなど)隠しファイルを無視したい場合は、それもそのファイルをテストするために

If (InStr(1, LCase(File.name), firstString) > 0) And (InStr(1, LCase(File.name), secondString) > 0) Then 

を言って、あなたの行を変更することが最善であるかもしれません隠されていない、例えば

If (InStr(1, LCase(File.name), firstString) > 0) And _ 
    (InStr(1, LCase(File.name), secondString) > 0) And _ 
    Not (File.Attributes And vbHidden) Then 
関連する問題