Application.FileSearch v Office 2007
(poř. jinou chybovou hlášku, která souvisí s metodou FileSearch)
vyzkoušet následující kousek kódu převzatý z nápovědy Microsoft Excel 2007.
Sub TryFileSearch()
Set fs = Application.FileSearch
With fs
.LookIn = "C:\My Documents"
.Filename = "cmd*.*"
If .Execute > 0 Then
MsgBox "There were " & .FoundFiles.Count & _
" file(s) found."
For i = 1 To .FoundFiles.Count
MsgBox .FoundFiles(i)
Next i
Else
MsgBox "There were no files found."
End If
End With
End Sub
už Vám nebude. Proč? To je otázka pro tým vývojářů VBA.
Na stránkách MSDN lze nalézt informaci o změnách objektového modelu oproti
předchozím verzím, kde jsou popsány všechny metody a vlastnosti, které nejsou podporovány v nové verzi.
U všech těchto metod a vlastnosti je slovíčko skrytý (Hidden) ač bych očekával
spíše nepodporovaná (no support) nebo odstraněn (remove). Toto asi vysvětluje
proč v Object Browser nelze nalézt žádný odkaz na metodu FileSearch a taky
proč se při vyvolání nápovědy z kódu u příkazu FileSearch objeví výchozí stránka
nápovědy pro Office 2007 nebo stránka klíčové slovo nenalezeno (Keyword not found).
Ale po přímém zadání výrazu "FileSearch" do políčka hledej (Search) v nápovědě,
dostaneme výsledek v podobě kousku kódu výše.
Toto odstranění některých metod a vlastnosti je celkem nestandardní a nám se nemusí
líbit, ale je to asi tak všechno co s tím můžeme dělat. Možná si jako já opakujete
v hlavě poučku, že pokud vyvíjíte kód pro Office ve vice verzích, máte se snažit
psát tak, aby kód fungoval v nejnižší možném společném jmenovateli. Tedy pokud
vyvíjíte aplikaci pro Excel 2002,2003 a 2007 používáte metody a vlastnosti pro Excel
2002 - ovšem u Excelu 2007 narazíme, ale řešení samozřejmě existuje.
Mnoho vývojářů řešilo stejný problém jako já a možná i vy a v podstatě vyvstaly
tři možnosti.
1, použít metodu - Dir - která je zabudovaná v objektovém modelu od Office 97.
' Author : Roy Cox (royUK)'
' Purpose : Open all worksheets in a specific folder' Disclaimer;
' This code is offered as is with no guarantees.
' You may use it in your' projects but please leave this header intact.
'---------------------------------------------------------------------------------------
Option Explicit
Sub Open_All_Files()
Dim oWbk As Workbook
Dim sFil As String
Dim sPath As String
'adresar kde chcete vyhledavat
sPath = "C:\Documents and Settings\Dokumenty\"
ChDir sPath
'nazev a typ souboru, ktery se bude vyhledavat (pouzity zastupne znaky)
sFil = Dir("*.xl*")
'pobezi dokud nebudou vsechny souboryv zadane ceste nalezeny
Do While sFil <> ""
' otevreni nalzenych sesitu, muzete provest pres prikaz
Set oWbk = Workbooks.Open(sPath & "\" & sFil)
' Vas kod
'uzavre sesity a ulozi zmeny
oWbk.Close False
' nacte dalsi soubor
sFil = Dir
Loop ' konec cyklu Do
End Sub
2, použít API funkce
3, použít Windows Scripting Host - WSH - jak nám doporučuje Microsft
Sub FilisearchWitFSO()
Dim objFSO As Object, objDir As Object
Dim aItem As Variant
Dim strPath As String, strFileName As String
' posklada retez pro porovnani jmen souboru
strFileName = "*.xl*"
strPath = "C:\Documents and Settings\Dokumenty\
' vytvori WSH odkaz
Set objFSO = CreateObject("scripting.filesystemobject")
' do promenne ulozi vsechny soubory, ktere najde v zadane ceste
Set objDir = objFSO.GetFolder(strPath)
' pokud nic nenajde, zobrazi hlasku
If objDir.Files.Count > 0 Then
' prochazi vsechny soubory ktere nasel
For Each aItem In objDir.Files
' hleda pouze soubor, ktery odpovida hledanemu vyrazu
If Ucase(aItem.Name) Like Ucase(strFileName) Then
MsgBox Prompt:="Cesta k souboru " & vbCrLf & aItem.Path, _
Title:="Hledaný soubor - " & strFileName, _
Buttons:=vbInformation
End If
Next
Else ' nebyl nalezen zadny soubor
MsgBox Prompt:="Nebyl nalezen žádny soubor, který odpovída zadanému názvu", _
Title:="Zadaný název - " & strFileName, _
Buttons:=vbInformation
End If
Set objDir = Nothing: Set objFSO = Nothing: Set aItem = Nothing
End Sub
Mimo použití API funkcí, jsem obě zbylé metody vyzkoušel a obě pracují spolehlivě
od verze 2000 (Office 97 nemůžu zatím vyzkoušet).
Co říct závěrem ... vzhledem k tomu, že postupem času bude přibývat uživatelů s
Office 2007, ale také velká většina zůstane u starších produktů, nezbude nám nic
jiného, než si stáhnout seznam změn objektového modelu oproti předchozím verzím
a doufat, že nám MS v další verzi Office "neskryje" další metody a vlastnosti.
(Mimochodem další verze Office by měla příjit na trh v roce 2009 a zatím má
kódové označení 14 - kód 13 Microsft přeskočil, prý s pověrčivosti ...)
Náhrada vč.vyhledávání v podadresářích
(Parda, 24. 6. 2009 15:50)