UBound --> compile error expected: identifier

Sorry Anno,

war hier zu fix mit dem rumheulen :smile:)

Mittlerweile funtzt es. Nur wie oben beschrieben, ist es leider keine Inhaltssuche sondern ne Dateisuche. So funktioniert es und er findet mir auch alle Files die ich in den Ordnern haben. Nur leider eben nicht den Dateiinhalt.

Die Excelsuche konnte das ĂŒber das Shell

Jetzt bin ich am „checken“ :smile:)) wie ich das einbau, das er mir nach Dateiinhalten sucht.
Ansonsten ist dein Code genial! Und auch leicht verstĂ€ndlich. Habe nur wir gesagt zufrĂŒh rumgeheult! :smile:))

Gruß Rolf

[Bei dieser Antwort wurde das Vollzitat nachtrÀglich automatisiert entfernt]

Hallo Rolf,

die Suche sucht nur nach Dateinamen. Aber die Suche löst ja das Event MatchFound aus! Dies mach dir zu nutzen. Das File was du da bekommst öffne einfach, lese den Inhalt ein und suche nach der Zeichenfolge. Wird sie gefunden, so trage das File in die Liste ein, wird es nicht gefunden, so verwerfe die Daten einfach. Alternativ, kannst du die Klasse mit einer Eigenschaft erweiteren und dann implementieren das das gefundene File nach einen gewissen Inhalt durchsucht wird :smile:

Wenn ich Anfang naechstes Jahr mal Zeit habe, werde ich die Klasse mal erweitern und dann hier posten, sofern das kein anderer macht :wink:

MfG Alex

Hallo Rolf,

Ist hier eine Inhaltssuche/rekursive Suche ĂŒberhaupt möglich?

wenn ich Alex so lese 
 ohne die Datei zu öffnen wohl nicht.
Aber dazu eine kleine Funktion zu schreiben ist ja kein Problem. Vorschlag mit Anwendungsbeispiel:

Private Declare Function PathFileExists Lib "shlwapi.dll" \_
 Alias "PathFileExistsA" (ByVal pszPath As String) As Long

Private Sub Command1\_Click()
 Me.Caption = CheckInhalt("C:\Test.txt", "Probe")
End Sub

Private Function CheckInhalt(ByVal Datei As String, ByVal SuchString As String) As Boolean
 Dim Bytes As Long, ff As Integer, Txt As String
 If PathFileExists(Datei) Then
 Bytes = FileLen(Datei)
 Txt = Space(Bytes)
 ff = FreeFile
 Open Datei For Binary As #ff
 Get #ff, , Txt
 Close #ff
 If InStr(Txt, SuchString) Then
 CheckInhalt = True
 Else
 CheckInhalt = False
 End If
 Else
 CheckInhalt = False
 End If
End Function

Gruß Rainer

Moin, moin und n gutes Neues mal in die Runde,

also dein Code schaut gut aus. Nur soll er mir die Caption als Variable erkennen.

Habe

pfad = strVerzeichnis & "\" & strDirDate & "\" & strSender & "\" & "\*.\*"

und

sInhalt = txtSuchBox

(txtSuchBox - da geb ich den gesuchten String ein)

Me.Caption = CheckInhalt(pfad, sInhalt)

So sollte es doch funtzten oder? Hier finder er aber nichts. Wenn ich

CheckInhalt("C:\Test.txt", "Probe")

meldet er True - also die Datei hab ich erstellt auf C: :smile:), bei der „Variblen“ meldet er mir False, obwohl die Datei mit dem Inhalt - welchen ich ihm ja in der Suchbox angeben habe.

Gruß Rolf

[Bei dieser Antwort wurde das Vollzitat nachtrÀglich automatisiert entfernt]

Moin Rolf,

Nur soll er mir die Caption als Variable erkennen.

? Das ist verschieden interpretierbar.

pfad = strVerzeichnis & „“ & strDirDate & „“ & strSender & „“ & „*.*“
sInhalt = txtSuchBox

Me.Caption = CheckInhalt(pfad, sInhalt)

So sollte es doch funtzten oder? Hier finder er aber nichts.

Beim Code in dieser Form kannst du keine Jokerzeichen benutzen

Klappt:

Private Sub Command1\_Click()
 Me.Caption = CheckInhalt("C:\test.txt", "Probe")
End Sub


Klappt nicht:

Private Sub Command1\_Click()
 Me.Caption = CheckInhalt("C:\*.\*", "Probe")
End Sub

Gruß
Reinhard

Servus Reinhard,

schade, der „Pfad“ muss variabel sein.
Sonst bringt es mir nichts :frowning:
Versuche es mal ĂŒber fso

Set fso = CreateObject("Scripting.FileSystemObject")
Quelle = pfad
Typ = LCase("txt")
Suchbegriff = txtSuchBox

For Each File In fso.GetFolder(Quelle).Files
 If LCase(fso.GetExtensionName(File.Name)) = Typ Then
 inhalt = fso.OpenTextFile(File).ReadAll
 If InStr(1, inhalt, Suchbegriff, vbTextCompare) Then
 'ausgabe.WriteLine File.Name
 ListBox2.AddItem File.Name
 End If
 End If
Next

Das scheint mir schon fast hinzuhauen. Er findet zumindest in dem Verzeichnis was ich im ĂŒber pfad angeben die txt-Files.
Nur den Inhalt noch nicht wirklich
Das Jahr fÀngt ja echt klasse an :smile:)))

Gruß Rolf

[Bei dieser Antwort wurde das Vollzitat nachtrÀglich automatisiert entfernt]

Moin Rolf,

Ich wĂŒnsche auch allen ein schönes Neues 
! :smile:
Reinhard war ja schneller als ich, ich muss trotzdem noch mal fragen.

Nur soll er mir die Caption als Variable erkennen.

Me.Caption ist eine Eigenschaft der Form, daraus kannst Du keine Variable machen. Aber natĂŒrlich kannst Du an die Stelle eine variable schreiben oder Das Ergebnis auswerten, dazu ist der boolsche Wert ja da.

Habe

pfad = strVerzeichnis & „“ & strDirDate & „“ &
strSender & „“ & „*.*“

und

sInhalt = txtSuchBox

(txtSuchBox - da
geb ich den gesuchten String ein)

Me.Caption = CheckInhalt(pfad, sInhalt)

So sollte es doch funtzten oder?

Ja, das soll gehen.

Hier finder er aber nichts.

Dann liegt das Problem am Inhalt der Variablen.
In Pfad muss ein tatsÀchlicher Pfad zu einer Datei stehen und in sInhalt ein String, der in der Datei zu finden ist.

Setze einen Stoppunkt und sieht nach, was in Deinen Variablen steht.
Du kannst ja erst mal wieder „C:\Test.Txt“ und „Probe“ hineinschreiben.

Im Moment musst Du dabei auch auf Groß-, Kleinschreibung achten. Wenn Du das nicht möchtest, dann bau in der Funktion UCase() oder LCase() in den Code ein.

In Deinem Programm wendest Du die Funktion nach der Klasse von Alex an, da kommt in ‚Pfad‘ dann der Pfad, der in die Listbox geschrieben werden soll.

Etwa 


If CheckInhalt(pfad, sInhalt) 
 List1.additem pfad 
End If

Hat Reinhard Recht und Du verwendest Sterne im Pfad oder im Suchstring? Da hat Reinhard natĂŒrlich Recht, das funktioniert nicht.

Gruß Rainer

schade, der „Pfad“ muss variabel sein.

Hallo Rolf,

ist er doch, im Code von Alex.

Der Code ist starr, mache ihn erst mal flexibel indem du in der Form einige Textfelder anlegst. In diese Textfelder trÀgst du zur Laufzeit dann die Parameter.

Im Code dann diese Stelle so abÀndern:

.sSearchpath = Textbox1 ’ Suchpfad
.sFileToFind = Textbox2 ’ Suchnamen
.sFileFlag = FILE_ATTRIBUTE_ALLTYPES ’ Dateiattribute
.sInclSubfolders = Textbox3 ’ Subdirs durchsuchen

In der Prozedur nSearch_MatchFound(
)
hast du ja vor dieser Codezeile

List1.AddItem sFilePath & sFilename

mittels des Codes von Rainer die Möglichkeit nur die dateien auflisten zu lassen die im Inhalt deinen Suchbegriff haben.

z.B. so

if CheckInhalt(sFilePath & sFilename, textbox4)=true then
 List1.AddItem sFilePath & sFilename
end if

Der Code von Alex ist schon fĂŒr den Ausbau vorgesehen, so könntest du auch nach DateigrĂ¶ĂŸen, dateidatĂŒmern u.Ă€. suchen lassen.

PS: Was issen mit meiner Nachfrage zu Excel?

Gruß
Reinhard

2 Like

Servus Reinhard,

hier der Shell vom Excel -->

 If txtSpeicherPfad = "" Then
 MsgBox "Bitte Ordner anlegen"
 cmdOrdnerAnlegen.SetFocus
 Else
 If txtSuchBox = "" Then
 txtSuchBox = "\*"
 'txtSuchBox.SetFocus
 Else
 Set objShell = CreateObject("WScript.Shell")
 CommandLine = "%comspec% /c findstr /m /s /i /c:""" & Suchbegriff & """ """ & pfad & """ "

Set objExecObject = objShell.Exec(CommandLine)
 If Not objExecObject.StdOut.AtEndOfStream Then
 Filelist = Split(Trim(objExecObject.StdOut.ReadAll()), vbCrLf)
 For i = 0 To UBound(Filelist) - 1
 ListBox2.AddItem Filelist(i)
 Label54 = Filelist(i)
 Next
 Else
 MsgBox "Datei nicht gefunden"
 txtSuchBox.SetFocus
 End If
 End If
 End If

End Sub

Wenn du willst kann ich dir das gesamte Excel (mir Form etc
)zur VerfĂŒgung stellen.

Deinen Code bau ich mal ein und meld mich gleich wieder :smile:)

Gruß Rolf

[Bei dieser Antwort wurde das Vollzitat nachtrÀglich automatisiert entfernt]

Hallo Reinhard,

In der Prozedur nSearch_MatchFound(
)
hast du ja vor dieser Codezeile

List1.AddItem sFilePath & sFilename

mittels des Codes von Rainer die Möglichkeit nur die dateien
auflisten zu lassen die im Inhalt deinen Suchbegriff haben.

danke fĂŒr die Hilfe, genau so war’s gemeint! :smile:

Gruß Rainer

Servus Reinhard,

nun bringt er mir nen Type mismatch bei -->

'Ereignis stellt uns die Klasse bereit
Private Sub nSearch\_MatchFound(ByVal sFilename As String, \_
 ByVal sFilePath As String, \_
 ByVal sFiledate As Date, \_
 ByVal sFilesize As Long, \_
 ByVal sLastAccess As Date, \_
 ByVal sLastWrite As Date, \_
 ByVal sShortName As String)
 Dim txtSuchBox As String
 Dim CheckInhalt As Variant
 Dim Suchbegriff As String
 'Listbox mit dem letzten Suchergebnis fĂŒllen
 Suchbegriff = txtSuchBox

If CheckInhalt(sFilePath & sFilename, Suchbegriff) = True Then
 ListBox2.AddItem sFilePath & sFilename
 Else
 MsgBox "nix da"
End If
 DoEvent

Ich glaub ich ĂŒberspring das Jahr
so wie das anfĂ€ngt! Mann mann mann :smile:))))

Gruß Rolf

[Bei dieser Antwort wurde das Vollzitat nachtrÀglich automatisiert entfernt]

Hallo Rolf,

was soll

Dim CheckInhalt As Variant

werden? Du kannst nicht den Namen einer Funktion zusÀtzlich noch als Variable verwenden, das versuchst Du aber mit dieser Anweisung.

CheckInhalt ist eine Funktion, die musst/darfst Du nicht deklarieren.

Gruß Rainer

Hi Rainer,

war ned meine Idee, ich schwörs dir :smile:)
Wenn ich ohne Deklaration CheckInhalt verwende mekert er das CheckInhalt nicht deklariert ist! :frowning:
Macht mich echt kirre!

Gruß Rolf

Hi

[Bei dieser Antwort wurde das Vollzitat nachtrÀglich automatisiert entfernt]

Hallo Rolf,

zunĂ€achst mal wĂŒnsche ich dir, Rainer, Alex und natĂŒrlich allen anderen weltweit ein gesundes neues Jahr 2009.

Set objShell = CreateObject(„WScript.Shell“)

Naja, so richtig Excel-Vba ist das nicht :smile: Garantiert kann man das auch in VB aufrufen.
Wenn WSript das ist was man als WSH in Windows deaktivieren kann, wird gelegentlich empfohlen als Virenschutz, so klappt natĂŒrlich diese Lösung nicht wenn man die Datei weitergibt.

Danke fĂŒr das Angebot mir die WScript-Lösung zuzuschicken, aber ich hab aus 2008 noch reichlich offene Baustellen.

Oder mit Vb/VbA eine Dos Batch erstellen mit der Zeile

FileInstr /M /S Probe C:*.* > C:\Ergebnis.txt

und diese mit

Erg=shell("cmd /c C:\Finde.bat,6)

o.Ă€ starten.
Das habe ich ĂŒbrigens vorhin getan (naja die Batch manuell erstellet und gestartet), mußte aber den Prozess abschießen weil er mir zu lange dauerte und ich weg mußte.

Deshalb bin ich jetzt gespannt bis zu deinen Code fertig hast *trommel* :smile:

Damit ich dann mal den VB Cde mit Dos Code vergleichen kann um festzustellen was schneller ist.
Ich tippe auf Dos, bin mir aber nicht sicher.

Deinen Code bau ich mal ein und meld mich gleich wieder :smile:)

Bei langen Beitragsfolgen geht fĂŒr mich irgendwann die Übersicht völlig flöten.
Das Wichtigste aus dieser Folge steht ja positiver Weise in der FAQ:3000

Mal so als Idee, Rainer löscht diese Beitragsfolge, du stellst deine Anfrage neu ein, mit dem Betreff „VB: Viele Dateien nach Dateiinhalten durchsuchen“ oder noch passenderen Betreff um das Finden im Archiv zu erleichtern.

In der neuen Anfrage postest du die Prozedur wo der Fehler auftritt, gibst an in welcher Codezeile welcher Fehler auftritt.
Dazu lĂ€dst du dein Projekt mit FAQ:2861 o.Ă€. hoch, sodaß man das nicht nachbauen muß und was auch wichtig ist, jeder hier der interessiert ist, von der gleichen Ausgangsbasis ausgehen kann.

PS: Tipp, passend zum Thema, wenn du auch Excel-Vba Code schreibst, allen Code mit Filesearch drin kannst du in Excel2007 vergessen, XL2007 kennt Filesear ch nicht, nimm also gleich FSO o.Ă€.

Gruß
Reinhard

1 Like

Servus Reinhard,

-)))))

vollkommen 100%agree!

Ich kenn mich auch nicht mehr wirlich aus hier in den Posts 


Nur noch schnell zu ErklÀrung: Das Dos habe ich nur angewandt, da es eben Filesearch in Excel 2007 nicht mehr gibt! :smile:))
(also zweite Frage bzw Anmerkung schon erledigt)

Das Dos will ich auch garnimma, da in VB5 auch so gehen sollte.

So und nun kann der Fred zu und ich poste nen neuen, mit nem anstÀndigen Header nochmal.

Gruß Rolf

[Bei dieser Antwort wurde das Vollzitat nachtrÀglich automatisiert entfernt]

Hallo Rolf,

Ich kenn mich auch nicht mehr wirlich aus hier in den Posts

dito, bei langen Folgen hörts bei mir auf.

WÀre ich Sadist könnte ich dir ja bei einer deiner Nachfragen sagen:

„Alex hat dir doch geschrieben du sollst nSearch auf Empty setzen und dann mach einfach das was er da weiter schrieb.“

*schwergrins"

Nur noch schnell zu ErklÀrung: Das Dos habe ich nur angewandt,
da es eben Filesearch in Excel 2007 nicht mehr gibt! :smile:))
(also zweite Frage bzw Anmerkung schon erledigt)

Dann schau mal in die FAQ vom Excelbrett, da bat ich grad eben den FAQ-Betreuer einene neuen FAQ Eintrag fĂŒr probleme mit XL2007 zu erstellen.
Dort ist dann ĂŒber Links zu erfahren wie man Filesearch in XL2007 ersetzt u.v.m.

So und nun kann der Fred zu und ich poste nen neuen, mit nem
anstÀndigen Header nochmal.

Nö, erst mußt du und Rainer das mit der FAQ im Excelbrett gelesen haben, dann kann er weg.
Ein FAQ-Eintraf hier der den gleichen Inhalt hat wie der FAQ Eintrag im Excelbrett ist doch okay.

Gruß
Reinhard

Hi Rolf,

war ned meine Idee, ich schwörs dir :smile:)
Wenn ich ohne Deklaration CheckInhalt verwende mekert er das
CheckInhalt nicht deklariert ist! :frowning:
Macht mich echt kirre!

Und Du hast die Funktion auch nicht vergessen?
Die Funktion und der Aufruf gehören in die Form, nicht in die Klasse.

Gruß Rainer

Hallo Reinhard,

Nö, erst mußt du und Rainer das mit der FAQ im Excelbrett
gelesen haben, dann kann er weg.

Die scheint noch nicht da zu sein.

Ein FAQ-Eintraf hier der den gleichen Inhalt hat wie der FAQ
Eintrag im Excelbrett ist doch okay.

Doppelt? Ne, ich glaube da bekomme ich Haue. :smile: Excelproblene passen hier auch nicht so Recht, wenn es nicht speziell um VBA geht. Das sehen wir uns erst mal an und reden dann eventuell noch einmal darĂŒber.

Den Thread hier zu löschen hÀtte ich kein Problem. Die Klasse, die Alex geschrieben hat, steht ja in der FAQ.

Gruß Rainer

Hallo Rainer,

Nö, erst mußt du und Rainer das mit der FAQ im Excelbrett
gelesen haben, dann kann er weg.

Die scheint noch nicht da zu sein.

Naja, soviel Zeit daß der dortige FAQ-Betreuer meine Mail liest und dann schaut ob er dem zustimmt muß ja wohl schon sein :smile:)

Ein FAQ-Eintraf hier der den gleichen Inhalt hat wie der FAQ
Eintrag im Excelbrett ist doch okay.

Doppelt? Ne, ich glaube da bekomme ich Haue. :smile:

Geht das nicht daß in sich ĂŒberlappenden Brettern in beiden Brettern die gleiche FAQ Nummer steht?
Oder zumindest in der jeweiligen FAQ ein Hinweis auf die andere FAQ?

Sicher, zu 95% könnten viele Anfragen in Programmierbrettern (zumindest in Excel bzw. Excel-Vba) direkt gelöst werden wenn es denn eine eindeutig klare Anfrage gÀbe :frowning:

Dies klappt leider sehr oft nicht, dann entwickeln sich, letztlich unnötige Beitragsfolgen, mit Hin- und Her Fragen und Antworten bis endlich mal klar ist um was es eigentlich geht.

D.h., z.B. Beitragsfolge mit 30 BeitrÀgen, davon sind 22 unnötig.
Von daher ist es doch Klasse wenn man nach 2-3 mal Hin- und Her erkennt, so wird das nix, lade mal Beispielcode o.Ă€. hoch, damit man gezielt nach dem Fehler suchen kann.

Und dies betrifft ja verschiedene Programmierbretter.

Nun weiß nicht jeder wie man denn hier eine Datei hochladen kann so daß sie andere sich anschauen können.

Deshalb hast du ja netterweise FAQ:2681 eingerichtet. Nur von dieser FAQ weiß keiner wenn er wenn er in der FAQ vom C-Brett oder Delphi-Brett nach einer Hochladmöglichkeit sucht.

M.E. wĂ€re es doch dann sinnvoll Hochladadressen in einer FAQ zu sammeln und diesen FAQ Eintrag allen anderen FAQs zur VerfĂŒgung zu stellen, wie auch immer.

Excelproblene
passen hier auch nicht so Recht, wenn es nicht speziell um VBA
geht. Das sehen wir uns erst mal an und reden dann eventuell
noch einmal darĂŒber.

Du hast, como siempre, Recht, die paar Excelformeln die nicht mehr klappen gehören hier nicht in eine FAQ.

Aber grad im Vba Bereich ist Excel2007 sehr zickig. D.H. ggfs. mußt du all deinen Vba-Code umschreiben von deinen Excel-Mappen die in Excel97-Excel-2003 liefen.

Von daher passt m.E. eine FAQ die sich mit Neuerungen bei VBa-Code in Excel2007 Vba-Codes beschĂ€ftigt in dieses Brett was ja fĂŒr VB und Vba „zustĂ€ndig“ ist.

Excelneuerungen ohne VBa-Bezug gehören natĂŒrlich ins Excelbrett.

Den Thread hier zu löschen hÀtte ich kein Problem. Die Klasse,
die Alex geschrieben hat, steht ja in der FAQ.

Ja genau, ich und Rolf sehen es ja genauso.

Aber mache das bitte erst dann wenn ich deine Antwort hierauf gelesen habe :smile:

Gruß
Reinhard

Hallo Reinhard,

Naja, soviel Zeit daß der dortige FAQ-Betreuer meine Mail
liest und dann schaut ob er dem zustimmt muß ja wohl schon
sein :smile:)

ja klar, ich drÀngel ja auch gar nicht. :smile:

Geht das nicht daß in sich ĂŒberlappenden Brettern in beiden
Brettern die gleiche FAQ Nummer steht?

Nein. Ich könnte bestenfalls eine FAQ schreiben, in der ich die andere FAQ zitiere 
 Dann ist es aber einfacher, Du zitierst die FAQ, egal in welchem Brett sie steht. Unazfgefordert siht mM nach ohnehin kaum mal Jemand in die FAQ.

Oder zumindest in der jeweiligen FAQ ein Hinweis auf die
andere FAQ?

Ja, das geht.

Von daher passt m.E. eine FAQ die sich mit Neuerungen bei
VBa-Code in Excel2007 Vba-Codes beschÀftigt in dieses Brett
was ja fĂŒr VB und Vba „zustĂ€ndig“ ist.

Ja, natĂŒrlich. Änderungen in VBA gehören hier her, da hast Du natĂŒrlich Recht.

Gruß Rainer