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 |