Jdi na obsah Jdi na menu
 


Application.FileSearch v Office 2007

21. 10. 2007
Možná jste právě vytvořili kus kódu nebo jste spustili nějakou starší aplikaci která obsahuje metodu FileSearch v Office 2007 a zjistili jste, že kód nepracuje a vrací chybovou hlášku "Object doesn't support this action" Run-time error 445.
(poř. jinou chybovou hlášku, která souvisí s metodou FileSearch)
Pro ty, kteří zatím neměli tu čest s touto chybou a mají Office 2007, si můžou
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


Ano tento příklad kódu lze nalézt v nápovědě pro produkt Office 2007, ale pracovat
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 ...)

 

 

Komentáře

Přidat komentář

Přehled komentářů

Náhrada vč.vyhledávání v podadresářích

(Parda, 24. 6. 2009 15:50)

podivej se na http://www.mojeoffice.cz/node/130

Re: Náhrada vč.vyhledávání v podadresářích

(špek, 9. 11. 2012 14:27)

Odkaz nefunguje.

 

 

 

Z DALŠÍCH WEBŮ

REKLAMA