Szybkie wyszukiwanie plików za pomocą Windows Search.   strona główna:
A po co ten Excel ;-)
 
     Aktualizacje  
Informacje o zdjęciach  
 
 
 
Mam pytanie - czego wam brakuje w Excel'u 2007 co było w E2003?  
  Problemy z FileSearch
Ja Wam powiem, długo się nie zastanawiając, Application.FileSearch. Szok. Takie fajne narzędzie - gdzie to się podziało. Okazuje się,    .LookIn
że narzędzie to sprawiało czasem problemy, a M$ zamiast je naprawić zupełnie usunął tę właściwość.  
Obejścia prowadzą przez:   Rozwiązanie oparte o
 - funkcję VBA.Dir   VBA.Dir
 - Metody zapisane w bibliotece Scripting.FileSystemObject   z przeglądaniem Subfolderów
Jednak sposoby są dość wolne. Muszą przeszukiwać każdy plik w każdym katalogu. Trudność sprawia również napisanie rekurencji żeby   (rozwiązanie na dole strony)
 przeszukać wszystki pliki w podkatalogach określonego katalogu.  
  Rozwiązanie oparte o 
Można spróbować rozwiązać problem w oparciu o nową metodę.   Scripting.FileSystemObject
Pomysł powstał po przeczytaniu tematu: Jak znaleźć w drzewie katalogowym wszystkie pliki zawierające określone słowo lub    z przeglądaniem Subfolderów
zwrot? 3 na Polskiej stronce Skrypciarzy.  
Procedura wymaga zainstalowanego programu Windows Search. Pod Vistą powinien być domyślnie ale dla XP trzeba go doinstalować.    Cześć Skrypciarze!
Instalacji próbowałem na kompie w domu i w pracy, przeszła pomyślnie. Trzeba się pożegnać ze starym wyglądem Wyszukaj'ki spod   Jak znaleźć w drzewie
Menu Start ale w zamian dostajemy fajny program z możliwością podglądu zawartości pliku bez jego otwierania - mi się spodobało :-)   katalogowym wszystkie pliki
Ale najważniejsze - procedura. :-)   zawierające określone słowo
  lub zwrot.
Const adOpenStatic = 3  
Const adStateOpen = 1  
Const adEditNone = 0  
Const adUseClient = 3  
Const adCmdText = 1  
Const adModeRead = 1  
 
Private Sub Wyszukaj_WindowsSearch(strSQL As String, _  
                                   rngKomCel As Excel.Range)   Program 
    On Error GoTo Wyszukiwanie_Error   Windows Search 4.0
       dla systemu Windows XP
    ' ----------------wymaga-----------------   (KB940157)
    ' pod Vistą powinno być  
    ' Program Windows Search 4.0 dla systemu Windows XP (KB940157)  
      
    Dim objConnection As Object 'ADODB.Connection  
    Dim objRecordset As Object 'ADODB.Recordset  
      
    Const strFolderName As String = "C:\Documents and Settings\jr\Pulpit\Warsztat"  
    Const strConnectionString As String = "Provider=Search.CollatorDSO;" & _  
                                          "Extended Properties='Application=Windows';"  
                   
    Set objConnection = CreateObject("ADODB.Connection")  
    With objConnection  
        .CursorLocation = adUseClient  
        .Mode = adModeRead  
        .Open strConnectionString  
        Set objRecordset = .Execute(strSQL, , adCmdText)  
    End With  
      
    With objRecordset  
        If Not (.BOF And .EOF) Then rngKomCel.CopyFromRecordset objRecordset  
    End With  
 
Wyszukiwanie_Exit:  
    On Error Resume Next  
    CloseRSObject objRecordset  
    CloseConObject objConnection  
    Exit Sub  
 
Wyszukiwanie_Error:  
        MsgBox "Unexpected error - " & Err.Number & vbCrLf & vbCrLf & _  
                Err.Description, vbExclamation, "VBAProject - Wyszukiwanie"  
    Resume Wyszukiwanie_Exit  
End Sub  
 
Public Sub CloseConObject(Cnn As Object)  
    If Not (Cnn Is Nothing) Then  
        If Cnn.State = adStateOpen Then Cnn.Close  
        Set Cnn = Nothing  
    End If  
 
Public Sub CloseRSObject(Rs As Object)  
    If Not (Rs Is Nothing) Then  
        With Rs  
            If CBool(.State And adStateOpen) Then .Close  
        End With  
        Set Rs = Nothing  
    End If  
End Sub  
 
Procedura wykorzystuje ADO i zapytania SQL.  
Do określania typy zwracanych informacji oraz definiowania warunków wyszukiwania stosuje się tu zapytania SQL dlatego pierwszym arg.   
procedury WyszukiwaniePlików jest właśnie zapytanie. Drugi arg. to komórka Excela od której do zakresu arkusza, metodą   
CopyFromRecordset zostają zwrócone dane pasujące do zapytania.  
 
Przeszukiwaną "tabelą" którą określamy w klauzuli FROM jest SystemIndex.   
 
Do określenia parametrów wyszukiwania używamy SQL'a  
 
Nazwy "pól"  
        System.ItemPathDisplay     ' ścieżki  
        System.ItemName              ' nazwy plików i folderów  
        System.FileName               ' nazwy plików  
        System.ItemType               ' rozszerzenia plików np: .xls .html; Foldery: Directory  
        System.ItemUrl                  ' file:c:/.. (ścieżka)  
        System.Size                      ' rozmiar  
        System.Title                       ' PPM na Plik/ Właściwości / Podsumowania / TYTUŁ  
        System.FileExtension          ' rozszerzenie pliku  
 
Słyszeliście, że:   
"Wyrażenie (SQL) powinno się kończyć średnikiem ;   
mimo że wiele systemów baz danych pozwala swoim użytkownikom pomijać ten znak kończący,  
dobrą praktyką jest konsekwentne stosowanie średnika na końcy wyrażenia"  
 (SQL od podstaw. P.Wilton, J.Colby Helion2006 s33. Składnia języka SQL)   
 
Tu proszę o tym zapomnieć :-P Nie stosujemy śrenika na końcy wyrażenia!  
 
Przykładowe procedury.  
 
Przykład.1  
                 Lista plików i folderów w podanym folderze.  
 
Sub Lista()  
    Dim wksArk1 As Excel.Worksheet  
    Dim strSQL As String  
    Const strFolderName As String = "C:\Documents and Settings\jr\Pulpit\Warsztat"  
      
    Set wksArk1 = ThisWorkbook.Worksheets("Arkusz2")  
      
    strSQL = "SELECT System.ItemName, System.ItemPathDisplay " & _  
             "FROM SystemIndex WHERE " & _  
             "DIRECTORY='file:" & strFolderName & "'"  
      
    Wyszukaj_WindowsSearch strSQL, wksArk1.[A1]  
 
    Set wksArk1 = Nothing  
End Sub  
 
Przykład.2  
                 Różnice między SCOPE i DIRECTORY   SCOPE and DIRECTORY
  Predicates
    'DIRECTORY - pliki i foldery z danego folderu  
    'SCOPE     - pliki i foldery z danego folderu i JEGO podfolderach  
      
    strSQL = "SELECT System.ItemName " & _  
             "FROM SystemIndex WHERE " & _  
             "SCOPE='file:" & strFolderName & "'"  
 
Przykład.3  
                 Lista plików po wyrazie lub frazie. CONTAINCE i FREETEXT  
 
    '------------------lista plików po wyrazie lub frazie -------------------------  
    strSQL = "SELECT System.FileName " & _  
              "FROM SYSTEMINDEX " & _  
              "WHERE FREETEXT('Pesel') AND " & _  
                    "DIRECTORY = 'file:" & strFolderName & "'"  
 
        'WHERE CONTAINS('"where" AND "are" AND "you"')  
        'WHERE CONTAINS('"windows" AND "vista"')  
        'WHERE CONTAINS('"windows"')  
        'WHERE FREETEXT('where are you?')  
        'WHERE FREETEXT('windows vista')  
        'WHERE FREETEXT('windows!')  
 
Przykład.4  
                 Pliki w katalogu i podkatalogach zawierające tekst Pesel  
 
    ' ----------------------pliki zawierające tekst "Pesel" -------------------------  
    ' -------we wszystkich plikach i plikach podfolderów określonego folderu---------  
    strSQL = "SELECT System.FileName, System.ItemPathDisplay " & _  
             "FROM SystemIndex " & _  
             "WHERE Contains('ADO') AND " & _  
                   "System.ItemPathDisplay LIKE '" & strFolderName & "\%'"  
 
Przykład.5  
                 Wyszukiwanie plików po wielkości pliku  
 
    ' ----------------------pliki w systemie powyżej 1MB-----------------------------  
    strSQL = "SELECT System.FileName, System.Size " & _  
             "FROM SystemIndex..scope() " & _  
             "WHERE System.Size > 1048576"  
 
Przykład.6  
                 Pliki Excela w określonym folderze  
 
    strSQL = "SELECT System.FileName, System.ItemType, System.Title " & _  
             "FROM SystemIndex " & _  
             "WHERE SCOPE='file:" & strFolderName & "' AND " & _  
                   "System.ItemType Like '%.xl%'"  
 
 
Przykład.7  
 
                 Jak zrobić listę zdjęć z określonego folderu wraz z informacjami o każdym zdjęciu ?  
 
Sub ListaZdjęć()  
    Dim wksArk1 As Excel.Worksheet  
    Dim strSQL As String  
    Const strFolderName As String = "C:\Documents and Settings\tkuchta1\Pulpit\~\prywatne\foty"  
      
    Set wksArk1 = ThisWorkbook.Worksheets("Arkusz1")  
      
    '--------------------------System.Photo--------------------------  
    '    PPM na pliku / Właściwości / Podsumowanie / Zaawansowane  
    '----------------------------------------------------------------  
    ' .CameraManufacturer   ' nazwa producenta Aparatu Fot.  
    ' .CameraModel          ' nazwa/nazwy modelu Aparatu Fot.  
    ' .FNumber              ' Liczba F  
    ' .ExposureTime         ' Czas naświetlania (s)  
    ' .FocalLength          ' Długość ogniskowej  
    ' .ExposureBias         ' ??  
    ' .MeteringMode         ' ??  
    ' .DateTaken            ' Data zrobienia zdjęcia  
    ' .IsoSpeed             ' Szybkość ISO  
    ' .Flash                ' ??  
 
    strSQL = "SELECT System.FileName, System.Photo.DateTaken " & _  
             "FROM SYSTEMINDEX " & _  
             "WHERE System.ItemFolderPathDisplay = '" & strFolderName & "'"  
      
    Wyszukaj_WindowsSearch strSQL, wksArk1.[A1]  
 
    Set wksArk1 = Nothing  
End Sub