Excel 2007 Application.Filesearch ersetzen

Hallo zusammen,

Durch die Umstellung auf Office 2007 funktionieren einige Makros nicht mehr, die die FUnktion Application.Filesearch nutzen. Diese Funktion ist ja nciht mehr vorhanden. Ich habe allerdings mit Hilfestellungen aus dem Internet so meine Probleme und wollte daher fragen, ob mir jemand Hilfestellung geben kann? Der Makrotext ist der folgende:

With Application.FileSearch
.NewSearch
.LookIn = pfad
.SearchSubFolders = True
.Filename = file & „.xls“
.FileType = msoFileTypeAllFiles
If .Execute() > 0 Then .MatchTextExactly = True
.FileType = msoFileTypeAllFiles
End With

If Application.FileSearch.MatchTextExactly = True Then 'if file has been found
Workbooks.OpenText (pfad & file & „.xls“) 'open source file
Sheets(„A“).Select
Sheets(„A“).Copy after:=Workbooks(target).Sheets(1) 'copy requirement sheet to this file
Workbooks(file & „.xls“).Close savechanges:=False 'closes the requirement file

Gruß und Dank
Patrick

Hallo,

wirf mal einen Blick in die FAQ.
In [FAQ:3267] hat Reinhard die Lösung für Dein Problem geschrieben.

Gruß Rainer

Durch die Umstellung auf Office 2007 funktionieren einige
Makros nicht mehr, die die FUnktion Application.Filesearch
nutzen. Diese Funktion ist ja nciht mehr vorhanden. Ich habe
allerdings mit Hilfestellungen aus dem Internet so meine
Probleme und wollte daher fragen, ob mir jemand Hilfestellung
geben kann? Der Makrotext ist der folgende:

Hallo Patrick,

probiere mal folgenden Code,

Gruß
Reinhard

Option Explicit

Sub Dateilisten()
' Achtung!
' --\> Microsoft Scripting Runtime - Verweis notwendig!
Dim Datei As File, lngZei As Long
Application.ScreenUpdating = False
For Each Datei In GetFiles("C:\test", False, "\*.xls")
 lngZei = lngZei + 1
 Cells(lngZei, 1) = Datei.Name
Next
Application.ScreenUpdating = True
End Sub
'
Public Function GetFiles(FolderPath As String, scanSubDirectorys As Boolean, \_
 Optional SearchPattern As String = "\*") As Collection
Dim objFs As New FileSystemObject, objRootFolder As Folder
Dim objSubFolder As Folder, objFile As File, HColl As New Collection
' Zwischenspeicher für den Rückgabewert der Funktion
Set HColl = Nothing
' Das Ordner-Objekt für den angegebenen Pfad laden
On Error GoTo err01
Set objRootFolder = objFs.GetFolder(FolderPath)
err01:
If Err.Number 0 Then
 Set GetFiles = HColl
 Exit Function
End If
' Alle Dateien in diesem Ordner durchlaufen
For Each objFile In objRootFolder.Files
 ' Wenn das Suchmuster übereinstimmt Datei der Collection hinzufügen
 If objFile.Name Like SearchPattern Then
 HColl.Add objFile
 End If
Next
' Wenn angegeben, die Unterordner des Startpfades durchlaufen
If scanSubDirectorys Then
 For Each objSubFolder In objRootFolder.SubFolders
 ' Alle per Rekursion zurückgelieferten Dateien der Hilfscollection hinzufügen
 For Each objFile In GetFiles(objSubFolder.Path, scanSubDirectorys, SearchPattern)
 HColl.Add objFile
 Next
 Next
End If
' Rückgabewert
Set GetFiles = HColl
End Function

Hallo Rainer,

erstmal vielen Dank für den Hinweis. Habe diese Informationen schon im Vorfeld abgerufen, wusste allerdings nicht, wie ich dies nutzen kann.

Muss ich den Code zu „clsFileSearch“ auch mit kopieren?

Das ist ja jede Menge Code und ich muss zugeben, dass ich in VB nicht so sehr bewandert bin…

Hallo,

Muss ich den Code zu „clsFileSearch“ auch mit kopieren?

das weiß ich nicht, von VBA habe ich keine Ahnung.
Ich wusste nur, daß dazu etwas in den FAQ steht.
Aber Du hast ja Antwort von Reinhard, der kennt sich da aus.

Gruß Rainer

Hallo Reinhard,
vielen Dank erstmal. Kannst du mir eventuell noch Hilfestellung geben, wo ich das einfügen muss? ich mache mal, wo ich denke in fett…

Option Explicit
Const pfad As String = „S:\Daten“
Const target As String = „Liste_2011.xls“
Const target_sheet As String = „data“

Sub transfer()
Dim requirements As Double

Dim file, material, line, list_L2_customers, customer As String
Dim target_row, source_row, target_month As Integer
Dim source_material_column, source_req_column, source_month As Integer
Dim max, start, target_material_column, target_req_column, i As Integer
Dim Datei As File, lngZei As Long

file = InputBox(„Please enter file name like FILE without .xls, only FILE :“, „Input file name“)
If file = „“ Then GoTo label1

source_month = InputBox(„Please enter the month from the FILE-database you want to transfer 1,2,3…“, „Input month“)
If source_month 12 Then GoTo label1
'if source_month not valid then goto label1 = EndSub

target_month = InputBox(„Please enter the planning month“, „Input month“)
If target_month 12 Then GoTo label1
'if target_month not valid then goto label1 = EndSub

**Application.ScreenUpdating = False
For Each Datei In GetFiles(pfad, False, „*.xls“)
lngZei = lngZei + 1
Cells(lngZei, 1) = Datei.Name
Next
Application.ScreenUpdating = True
End Sub

'muss dieses als eigenständiges Sub laufen oder können in diesem Sub noch andere Dinge passieren??


Public Function GetFiles(FolderPath As String, scanSubDirectorys As Boolean, _
Optional SearchPattern As String = „*“) As Collection
Dim objFs As New FileSystemObject, objRootFolder As Folder
Dim objSubFolder As Folder, objFile As File, HColl As New Collection
’ Zwischenspeicher für den Rückgabewert der Funktion
Set HColl = Nothing
’ Das Ordner-Objekt für den angegebenen Pfad laden
On Error GoTo err01
Set objRootFolder = objFs.GetFolder(FolderPath)
err01:
If Err.Number 0 Then
Set GetFiles = HColl
Exit Function
End If
’ Alle Dateien in diesem Ordner durchlaufen
For Each objFile In objRootFolder.Files
’ Wenn das Suchmuster übereinstimmt Datei der Collection hinzufügen
If objFile.Name Like SearchPattern Then
HColl.Add objFile
End If
Next
’ Wenn angegeben, die Unterordner des Startpfades durchlaufen
If scanSubDirectorys Then
For Each objSubFolder In objRootFolder.SubFolders
’ Alle per Rekursion zurückgelieferten Dateien der Hilfscollection hinzufügen
For Each objFile In GetFiles(objSubFolder.Path, scanSubDirectorys, SearchPattern)
HColl.Add objFile
Next
Next
End If
’ Rückgabewert
Set GetFiles = HColl
End Function

Wird folgende Funktion davon auch abgedeckt: ?
If Application.FileSearch.MatchTextExactly = True Then 'if file has been found
Workbooks.OpenText (pfad & file & „.xls“) 'open source file
Sheets(„A“).Select
Sheets(„A“).Copy After:=Workbooks(target).Sheets(1) 'copy requirement sheet to this file
Workbooks(file & „.xls“).Close SaveChanges:=False 'closes the requirement file

i = 1
Sheets(„A“).Select**

Wie kann ich in der Funktion auf die Zuvor eingegebenen Werte zugreifen? Einfach Variablenwerte einsetzen?

Public Function GetFiles(FolderPath As String,
scanSubDirectorys As Boolean, _
Optional SearchPattern As String = „*“) As Collection
Dim objFs As New FileSystemObject, objRootFolder As (Folder) pfad
Dim objSubFolder As (Folder) pfad , objFile As File, HColl As New
Collection

Hallo Chilla,

ich würde an deiner Stelle in der Funktion nichts ändern, benutze sie einfach.
Sie sucht im Ordner „FolderPath“ nach allen Dateien die dem „SearchPattern“ (z.B. „.xls“, „*.xlsx“ o.ä.) entsprechen.
Je nach „scanSubDirectorys“ (True/False) werden Unterordner mitdurchsucht oder nicht.

Zurückgeliefert wird eine Collection mit den gefundnen Dateien.

Ich weiß nicht was deine zuvor eingegeben Werte mit einer dateisuche zu tun haben könnten.
Die Dateisuche braucht nur die drei eben beschriebenen Parameter.

Gruß
Reinhard

Ich weiß nicht was deine zuvor eingegeben Werte mit einer
dateisuche zu tun haben könnten.
Die Dateisuche braucht nur die drei eben beschriebenen
Parameter.

Wenn ich das richtig verstanden habe, wird über das eigentliche Dokument eine Suche geöffnet. In dieser Suche gebe ich verschiedene Informationen an (Dateiname, zielmonat, quellmonat) und anhand dieser Informationen wird die ursprüngliche Exceldatei ergänzt…

Unten mal das komplette Makro. Bin da grad recht aufgeschmissen, zumal ich dieses Makro von einem Kollegen übernommen habe und der Kollege nicht mehr ansprechbar ist.

Gruß und Dank
Patrick

Option Explicit
Const pfad As String = „S:\Daten“
Const target As String = „Global2011.xls“
Const target_sheet As String = „data“

Sub req_transfer()

'This sub transfers the requirements from the downloaded
'requirements data base into this file

'dimension of needed variables
Dim requirements As Double

Dim file, material, line, list_L2_customers, customer As String
Dim target_row, source_row, target_month As Integer
Dim source_material_column, source_req_column, source_month As Integer
Dim max, start, target_material_column, target_req_column, i As Integer

'*************************************************
'* target file parameters *
'*************************************************
max = 41 'number of products
start = 3 'row with first matrerial number
target_material_column = 6 'column in target file with material discriptions fro Lotus Notes
target_req_column = 6 'column in target file for requirements quantity

'*************************************************
'* source file parameters *
'*************************************************
source_material_column = 2 'column with material discriptions from Lotus Notes
source_req_column = 3
'--------------------------------------------------

'Input of the file name
file = InputBox(„Please enter file name like REQ without .xls, only REQ :“, „Input file name“)
If file = „“ Then GoTo label1

source_month = InputBox(„Please enter the month from the REQ-database you want to transfer 1,2,3…“, „Input month“)
If source_month 12 Then GoTo label1
'if source_month not valid then goto label1 = EndSub

target_month = InputBox(„Please enter the planning month“, „Input month“)
If target_month 12 Then GoTo label1
'if target_month not valid then goto label1 = EndSub

Application.ScreenUpdating = False

’ search for the from Lotus Notes exported REQ sheet

With Application.FileSearch
.NewSearch
.LookIn = pfad
.SearchSubFolders = True
.Filename = file & „.xls“
.FileType = msoFileTypeAllFiles
If .Execute() > 0 Then .MatchTextExactly = True
.FileType = msoFileTypeAllFiles
End With

If Application.FileSearch.MatchTextExactly = True Then 'if file has been found
Workbooks.OpenText (pfad & file & „.xls“) 'open source file
Sheets(„A“).Select
Sheets(„A“).Copy after:=Workbooks(target).Sheets(1) 'copy requirement sheet to this file
Workbooks(file & „.xls“).Close savechanges:=False 'closes the requirement file

i = 1
Sheets(„A“).Select

‚fills in the source the material discription where it‘ missing
‚because it‘ opened to see the the customer names
While Cells(i + 1, 2) „“ Or Cells(i + 1, 3) „“
If Cells(i + 1, 2) = „“ Then
Cells(i + 1, 2) = Cells(i, 2)
End If
i = i + 1
Wend

'deletes the part sum for the materials where the customer names
'are shown
i = 1
While Cells(i + 1, 2) „“
If Cells(i + 1, 2) „“ And Cells(i + 1, 3) „“ And Cells(i, 3) = „“ Then
Rows(i).Select
Selection.Delete Shift:=xlUp
End If
i = i + 1
Wend

Sheets(target_sheet).Select
Cells(1, target_req_column + target_month) = source_month 'fills in row 1 the planning month


For target_row = start To start + max - 1

material = Cells(target_row, target_material_column)
line = Right(Cells(target_row, 1), 2) 'gets the Line Line 1 or Line 2
list_L2_customers = Cells(target_row, 10) 'gets the List of L2 customers

If material = „“ Then GoTo label2

Sheets(„A“).Select 'selects source sheet
requirements = 0
source_row = 1
While Cells(source_row, source_material_column) „“
If Cells(source_row, source_material_column) = material Then

If line = „L1“ Then
If InStr(list_L2_customers, Cells(source_row, source_material_column + 1)) = 0 Then
requirements = requirements + Cells(source_row, source_req_column + source_month)
GoTo label3
End If
End If
If line = „L2“ Then
If InStr(list_L2_customers, Cells(source_row, source_material_column + 1)) > 0 Then
requirements = requirements + Cells(source_row, source_req_column + source_month)
GoTo label3
End If
End If
If line „L1“ And line „L2“ Then
requirements = requirements + Cells(source_row, source_req_column + source_month)
End If
End If
label3:
source_row = source_row + 1
Wend
Sheets(target_sheet).Select
Cells(target_row, target_req_column + target_month) = Round(requirements / 1000, 2)

label2:
Next target_row

Else
MsgBox (" File not found")
End If

label1:

Application.DisplayAlerts = False
Sheets(„A“).Delete
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Function

Hallo Chilla,

Hilfestellung geben, wo ich das einfügen muss?

so wie es aussieht steht es schon an einer richtigen Stelle.
Du mußt noch „unten“ „label1:“ einfügen.
Warum definierst du drei Variablen global? Vermeide global wenn es geht immer.

'muss dieses als eigenständiges Sub laufen oder können in
diesem Sub noch andere Dinge passieren??

Was meinst du mit „eigenständiger Sub“?
Du hast zwei Prozeduren. Die eine ist eine Funktion , die andere eine Sub.

Beide sind so gesehen eigenständig. Meine Codezeilen hast du ja schon korrekt in deine Sub integriert.

Wird folgende Funktion davon auch abgedeckt: ?

If Application.FileSearch.MatchTextExactly = True Then
'if file has been found

MatchTextExactly gehörte zu FileSearch, das gibt es nicht mehr.
Wenn du wissen willst ob die Collection gefüllt ist kannst du .Count prüfen.
Siehe dazu den nachfolgenden Code.

Gruß
Reinhard

Sub transfer()
' Achtung!
' --\> Microsoft Scripting Runtime - Verweis notwendig!
Dim requirements As Double **, colc As New Collection**
Dim file, material, line, list\_L2\_customers, customer As String
Dim target\_row, source\_row, target\_month As Integer
Dim source\_material\_column, source\_req\_column, source\_month As Integer
Dim max, start, target\_material\_column, target\_req\_column, i As Integer
Dim Datei As file, lngZei As Long
Application.ScreenUpdating = False
'file = InputBox("Please enter file name like FILE without .xls, only FILE :", "Input file name")
'If file = "" Then GoTo Label1
'source\_month = InputBox("Please enter the month from the FILE-database you want to transfer 1,2,3...", "Input month")
'If source\_month 12 Then GoTo Label1
'target\_month = InputBox("Please enter the planning month", "Input month")
'If target\_month 12 Then GoTo Label1
**Set colc = GetFiles(pfad, False, "\*.xls")  
If colc.Count \> 0 Then  
 For Each Datei In colc  
 lngZei = lngZei + 1  
 Cells(lngZei, 1) = Datei.Name  
 Next Datei  
Else  
 MsgBox "Nix gefunden"  
End If** Label1:
Application.ScreenUpdating = True
End Sub

Hallo Patrick,

Ich weiß nicht was deine zuvor eingegeben Werte mit einer
dateisuche zu tun haben könnten.
Die Dateisuche braucht nur die drei eben beschriebenen
Parameter.

Wenn ich das richtig verstanden habe, wird über das
eigentliche Dokument eine Suche geöffnet. In dieser Suche gebe
ich verschiedene Informationen an (Dateiname, zielmonat,
quellmonat) und anhand dieser Informationen wird die
ursprüngliche Exceldatei ergänzt…

du suchtest Ersatz für FileSearch. Den habe ich dir geliefert.
was du dann mit den gefundnen dateien machen willst ist mir noch sehr unklar.

Das was du da global definiert hast, ist das die Mappe in der der Code steht oder eine andere?
Meine Codezeilen suchen in dem Ordner der dort angeben ist, ist das korrekt?

Sollen dann aus jeder der gefunden Mappen aufgrund deiner Eingaben bestimmte Werte ausgelesen werden und in die „oben“ angegeben Mappe/Blatt geschrieben werden, wohin, unter die unterste gefüllte Zeile?

Solche Informationen fehlen mir noch.

Unten mal das komplette Makro. Bin da grad recht
aufgeschmissen, zumal ich dieses Makro von einem Kollegen
übernommen habe und der Kollege nicht mehr ansprechbar ist.

Ich sehe da nichts was unmöglich wäre, aber ich kann ohne genauerer Informationen nicht viel machen.Ich kann es nicht beurteilen, aber vielleicht wäre(n) Beispielmappen mit identischem Süpaltenaufbau und aussagekräftigen Zeilensä/Datensätzen hilfreich.
Hochladen mit file-upolod s. FAQ:2606

Bin jetzt mal eine Stunde weg vom PC.

Gruß
Reinhard