2013-03-11 2 views
4

Я написал код vba, который просматривает всю папку пути и ищет файл «strings.xml».Поиск файла в VBA

Dim oFS As Office.FileSearch 
Dim i As Integer 
Set oFS = Application.FileSearch 

With oFS 
    .NewSearch 
    .FileType = msoFileTypeAllFiles 
    .Filename = "strings.xml" 
    .LookIn = "D:\Workspace" 
    .SearchSubFolders = True 
    .Execute 

    MsgBox "Finish ! " & .FoundFiles.Count & " item found !" 
End With 

Однако, в моем рабочем пространстве у меня есть много «strings.xml» файлов, что текущий код находит и, но я только хочу, чтобы найти «strings.xml» в пределах конкретной вложенный; например ./values/strings.xml файлов.

+0

Знаете ли вы, что fron Office 2007 Office.FileSearch будет недоступен? –

ответ

0

Я думаю, что вы говорите, что вы хотите посмотреть в подпапке «\ значения» для файлов, называемых strings.xms

Если это верно, попробуйте ниже исправленный код:

Dim oFS As Office.FileSearch 
Dim i As Integer 
Set oFS = Application.FileSearch 

With oFS 
    .NewSearch 
    .FileType = msoFileTypeAllFiles 
    .Filename = "strings.xml" 
    .LookIn = "D:\Workspace\values" 
    .SearchSubFolders = True 
    .Execute 

    MsgBox "Finish ! " & .FoundFiles.Count & " item found !" 
End With 

Конечно, вы можете не указывать подпапку.

Вот еще один вариант:

Dim sPath As String 
Dim sFil As String 
Dim strName As String 

sPath = "D:\Workspace\values" 'Change Path 
sFil = Dir(sPath & "string.xml") 'All files in Directory matching name 

Do While sFil <> "" 
    strName = sPath & sFil 
    sFil = Dir 
    'Your Code Here. 
    i=i+1 
Loop 

MsgBox "Finish ! " & .FoundFiles.Count & " item found !" 

Рассматривали ли вы с помощью FileSystemObject сделать рекурсивный поиск в только вложенную папку?

MSDN - How to do a recursive search using the FileSystemObject

НТН

Филипп

+0

Ну, я ищу каждый файл «strings.xml», содержащийся в каждой папке «values». Я не должен делать .LookIn = «D: \ Workspace \ values», потому что он дает только файл «D: \ Workspace \ values ​​\ strings.xml», но я хочу также «D: \ Workspace \ .... \ values \ strings.xml "файлы – ARM

+0

, поэтому вам нужно сделать рекурсивный поиск по его звуку ... посмотрите [КАК: рекурсивно найти каталоги с помощью FileSystemObject] (http://support.microsoft.com/kb/185601) –

0

заменить:

sPath = "D:\Workspace\values" 'Change Path 
sFil = Dir(sPath & "string.xml") 'All files in Directory matching name 

с:

sPath = "D:\Workspace\values\" 'Change Path 
sFil = Dir(sPath & "*.xl*") 'All files in Directory matching name 
1

Ниже будет выглядеть recursiv в вашей корневой рабочей папке для Values\Strings.xml совпадений и перечислите их в объекте Scripting.Dictionary.

Поиск основного файла/папки выполняется простым Dir function.

Sub dir_ValuesStringsXML_list() 
    Dim f As Long, ff As String, fp As String, fn As String, tmp As String 
    Dim vfn As Variant, dFILEs As Object 'New scripting_dictionary 

    Set dFILEs = CreateObject("Scripting.Dictionary") 
    dFILEs.CompareMode = vbTextCompare 

    'set vars for c:\temp\Workspace\*\Values\Strings.xml 
    fp = Environ("TMP") & Chr(92) & "Workspace" 
    ff = "Values" 
    fn = "Strings.xml" 
    dFILEs.Item(fp) = 0 

    'get folder list 
    Do 
     f = dFILEs.Count 
     For Each vfn In dFILEs 
      If Not CBool(dFILEs.Item(vfn)) Then 

       tmp = Dir(vfn & Chr(92) & Chr(42), vbDirectory) 
       Do While CBool(Len(tmp)) 
        If Not CBool(InStr(1, tmp, Chr(46))) Then 
         dFILEs.Item(vfn & Chr(92) & tmp) = 0 
        End If 
        tmp = Dir 
       Loop 
       'Debug.Print dFILEs.Count 
       dFILEs.Item(vfn) = 1 
      End If 
     Next vfn 
    Loop Until f = dFILEs.Count 

    'remove the folders and check for Values\Strings.xml 
    For Each vfn In dFILEs 
     If CBool(dFILEs.Item(vfn)) Then 
      If LCase(Split(vfn, Chr(92))(UBound(Split(vfn, Chr(92))))) = LCase(ff) And _ 
       CBool(Len(Dir(vfn & Chr(92) & fn, vbReadOnly + vbHidden + vbSystem))) Then 
       dFILEs.Item(vfn & Chr(92) & fn) = 0 
      End If 
      dFILEs.Remove vfn 
     End If 
    Next vfn 

    'list the files 
    For Each vfn In dFILEs 
     Debug.Print "from dict: " & vfn 
    Next vfn 

    dFILEs.RemoveAll: Set dFILEs = Nothing 

End Sub 

Если вы хотите, чтобы преобразовать конец связывание Scripting.Dictionary с ранним связыванием, вы должны добавить Microsoft Scripting Runtime в утилиту VBE в ► Ссылки.

 Смежные вопросы

  • Нет связанных вопросов^_^