Nach Dateiinhalten suchen mit VB5!

Mahlzeit,

;.)

so, meine Inhalts-Suche hab ich nun soweit hinbekommen.
Bei zwei drei Sachen bräuchte ich aber doch eure Hilfe.

Erstmal der Code -->

Private Sub cmdRechnungSuchen\_Click()
 Dim strDirDate As String
 Dim strKunde As String
 Dim strVerzeichnis As String
 Dim pfad1 As String
 Dim pfad2 As String
 Dim pfad As String
 Dim nDate As Date
 Dim strSuchBox As String
 Dim fso As Variant
 Dim Suchbegriff As String
 Dim Ziel As String
 Dim Quelle As String
 Dim Typ As Variant
 Dim File As Variant
 Dim inhalt As String
 Dim WScript As Variant
 Dim sFilePath As String
 Dim sFilename As String
 Dim SearchSubFolders As String

 If OptionButton1.Value = True Then
 strVerzeichnis = "Z:\test1"
 End If

 If OptionButton2.Value = True Then
 strVerzeichnis = "Z:\test2"
 End If

 If OptionButton3.Value = True Then
 strVerzeichnis = "Z:\test3"
 txtSenderID = ""
 End If

ListBox2.Clear
strDirDate = nDate
strKunde= txtKundeID
strDirDate = Format(DTPicker3.Value, "yymmdd")
pfad = strVerzeichnis & "\" & strDirDate & "\" & strKunde & "\"

 ListBox2.Clear
 
Set fso = CreateObject("Scripting.FileSystemObject")
Quelle = pfad
**Typ = LCase("txt")**
Suchbegriff = txtSuchBox
txtSuchBox = Suchbegriff
ListBox2.Clear
**SearchSubFolders = True**
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
 ListBox2.AddItem Quelle & File.Name
 End If
 End If
Next
End Sub
  1. SearchSubFlder = True funktioniert nicht :frowning: wie weisse ich ihn an, auch die Unterverzeichnise mit zu durchsuchen?

  2. er soll nicht nur txt-Files durchsuchen, wie weise ich ihn an, alle Dateiarten zu durchsuchen?

  3. Ich möchte die „gefundenen“ Files in ein Verzeichnis kopieren, welches ich vorher angelegt habe, dazu habe ich folgenden Code -->

    Private Sub cmdKopieren_Click()
    Dim strDirDate As String
    Dim strDirPath As String
    Dim strCopyVon As String
    Dim strKunde As String
    Dim pfad As String
    Dim I As Long
    Dim nDate As Date
    Dim InStrRev As String
    Dim strCopyVonPath As String
    Dim strCopyVonFolder As String

    nDate = Format(DTPicker3.Value, „yymmdd“)
    strDirDate = nDate
    strKunde= txtKundenID
    strDirPath = txtSpeicherPfad

    For I = 0 To ListBox2.ListCount - 1
    If ListBox2.Selected(I) = True Then
    strCopyVon = ListBox2.List(I)
    strCopyVonPath = Left(strCopyVon, InStrRev(strCopyVon, „“) - 1)
    strCopyVonFolder = Mid(strCopyVonPath, InStrRev(strCopyVonPath, „“) + 1)

    CreateObject(„Scripting.FileSystemObject“).CopyFolder strCopyVonPath, strDirPath & „“ & strCopyVonFolder
    End If
    Next I
    End Sub

Leider klappt das nicht, da er bei InStrRev einen „Compile error - expected array“-Fehler bringt.
Wie schaffe ich es dennoch das markierte, bzw. ausgewählten (werde ich noch ein Multiselect machen) File in mein Verzeichnis zu kopieren?

Puhhhhhhhhhhhhhhhh
Also, wenn jemand Zeit und Lust hat, über ein paar Tipps wäre ich total happy :smile:

Gruß Rolf

Hinweis zu 3)

Leider klappt das nicht, da er bei InStrRev einen „Compile
error - expected array“-Fehler bringt.

Hi Rolf,

ist deine F1-Taste defekt?
Hättest du sie benutzt wäre dir augefallen daß VB5.0 InstrRev nicht kennt.

Was soll das:
Dim SearchSubFolders As String

Hatten wir das nicht schon daß man das nicht macht?
Die basics zu überspringen und komplizierten Code schreiben geht schief.

Gruß
Reinhard

Schuldigung :frowning:

Aber genau das ist es doch. InStrRev gibt es in VB5 nicht, was kann ich stattdessen nehmen?

Und die F1 benutz ich, ich schwörs dir, mind 10 mal bevor ich hier poste.

Gruß Rolf

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

Einfach das Modul erstellen -->

Public Function InStrRevEx(ByVal StringCheck As String, ByVal StringMatch As String, Optional Start As Long = 0) As Long
 Dim cnt As Long, Länge As Long
 
 If Start = 0 Or Start \> Len(StringCheck) Then Start = Len(StringCheck)
 Länge = Len(StringMatch)
 InStrRevEx = -1
 For cnt = Start To 1 Step -1
 If Mid(StringCheck, cnt, Länge) = StringMatch Then
 InStrRevEx = cnt
 Exit For
 End If
 Next cnt

End Function

Und InStr heisst InStrEx :smile:

Gruß Rolf

Aber genau das ist es doch. InStrRev gibt es in VB5 nicht, was
kann ich stattdessen nehmen?
Und die F1 benutz ich, ich schwörs dir, mind 10 mal bevor ich
hier poste.

Hallo Rolf,

sorry, das war mir in deiner Anfrage nicht erkennbar.

Anstatt InstrRev nimmste ganz einfach die BDF InstrREv :smile:
(BDF=Benutzerdefinierte Funktion, bzw. auf englisch auch)

Das heißt, du schreibst dir die Funktion selbst.

In der Hausaufgabe von Rainer, die du immer noch nicht gelöst hast *schelt* *gg* geht es doch prinzipiell um genau das Gleiche, Zerlegung eines beliebig langen Strings und Suche nach irgendwas.
Wenn man das System erstmal verstanden hat ist es dann vollkommen egal ob man vorwärts oder rückwärts drin sucht.

Jetzt weiß ich nicht was ich machen soll. Sicher ich könnte dir eine Instrrev Funktion basteln, nur was hast du davon?
Wenn du nur das problem hättest wäre das ja okay.

Aber es sieht so aus als ob du da ein größeres Projekt bastelst. dann ist abzusehen daß du bald wieder an einem Basic-problem hängenblebst.

Wäre es da nicht Zeiteffektiver, du investiert jetzt einmalig Zeit um einige basics zu verinnerlichen um danach viel schneller im Projekt voranzukommen?

Gruß
Reinhard

Leider klappt das nicht, da er bei InStrRev einen „Compile
error - expected array“-Fehler bringt.

Hi Rolf,

ist deine F1-Taste defekt?
Hättest du sie benutzt wäre dir augefallen daß VB5.0 InstrRev
nicht kennt.

Was soll das:
Dim SearchSubFolders As String

Hatten wir das nicht schon daß man das nicht macht?
Die basics zu überspringen und komplizierten Code schreiben
geht schief.

Gruß
Reinhard

1 Like

Einfach das Modul erstellen -->
Und InStr heisst InStrEx :smile:

Hi Rolf,

naja, nicht nur du kannst googln :smile:

http://www.webspace.de/userforen/bastis-visual-basic…

Das nützt dir wie gesagt schon weiter wenn du nur einmalig einen Ersatz für die fehlende Funktion brauchst. Aber damit DIR das weiterhilft in künftigen Projekten mußt du den Code verstehen können und den von Rainer.
Und verstanden hast du ihn nur wenn du in der lage bist ihn selbst zu entwickeln.

Gruß
Reinhard

-))))

Ja, das is klar, ehrlich!

I do my best, nur bräucht ich einfach mal mehr Zeit um mich wirklich intensiv damit zu beschäftigen.

Gruß Rolf

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

I do my best, nur bräucht ich einfach mal mehr Zeit um mich
wirklich intensiv damit zu beschäftigen.

Hallo Rolf,

du willst dir keine Zeit nehmen um zu verstehen daß z.B. diese beiden aufeinanderfolgenden Codezeilen in deinem Code ähem Blödsinn sind:

Suchbegriff = txtSuchBox
txtSuchBox = Suchbegriff

dann wird das nix mit einem komplizierteren Projekt.
Und auch irgenwie sinnlos für potentielle Helfer dir da im Einzelfall immer den Code zum Laufen zu bringen. Unweigerlich hängst du an der nächsten Problematik fest. das wird ja eine never ending Story bis da dein projekt fertig ist.
Und beim nächsten projekt wiederholt sich das.

Ich habe mir vba selbst beigebracht. Ohne Kurs, ohne Bücher. Nur durch Wollen und Mitlesen in Foren und probieren, probieren, probieren…
Und ja, das dauert als Einzelkämpfer.
Und, hätte ich damals das Angebot bekommen daß jmd in einem Forum sagt, okay, hier ist eine kleine Aufgabe, versuch die mal zu lösen und zeige deine Lösungsansätze um mir dann zu sagen welche Punkte ich da falsch mache, hätte mich das sehr sehr erfreut.

Okay, du hast wenig zeit, wenig Vb-Wissen, willst aber ein Vb-Projekt in kurzer zeit basteln.
Ich glaube ich habe klar gemacht wie ich da die Erfolsaussichten sehe.

Gruß
Reinhard

Naja, ganz so ist es nicht.

Grundsätzlich resultiert dieses Projekt aus einem „alten“ einfachen, welches ich Stück für Stück erweiter habe, angefangen hat es mit einem Eintrag in eine Zelle in einem Excelsheet aus ner Combobox raus.

Das war die erste „Form“ (wenn man es so nennen mag)

Es „wächst“ praktisch seit 8 Jahren immer wieder n Stück, so das ich mir im täglichen Berufsleben das „Leben“ etwas erleichtere :smile:)

Sprich - ich bau n Stück an, dann „hält“ es wieder n Jahr oder 2.
Und wenn man sieht, wie winzig das „Projekt“ zu Beginn war, dann kann man so nix sagen! Klar einiges hab ich mir machen lassen, der Großteil aber ist ganz bestimmt durch mich entstanden - wie du sagst - learnig by doing! und testen und löschen und nochmal versuchen und passt und passt doch ned.

Das hier zum Beisiel -->
Suchbegriff = txtSuchBox
txtSuchBox = Suchbegriff
war ein Versuch, habe nur vergessen das verkehrte zu löschen.
Sorry.
In dem Code passt mehr noch nicht wirklich, aber diese Fehler wie eben oben, werden nach und nach eleminiert.

Gruß Rolf

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

OT Wie stelle ich eine Frage
Hallo Rolf,

ich entschuldige mich. Mit „SearchSubFolders“ kannst du ja gar nix anfangen. Mir hingegen ist das sehr bekannt, deshalb würde ich das nie als Variablennamen nehmen.

Hintergrund, in Excel-VBA gibt es ein FileSearch-Objekt und dort legt man mit SearchSubfolders fest ob Unterverzeichnisse mit durchsucht werden sollen.

Zu deinem Code, Alex hat doch wnderbaren und auch schnellen Code gebastelt. Dort kannst du doch z.B. „*.*“ oder „.*“ eingeben um nach allen Dateitypen zu suchen. Da mußt du doch nur die richtige Stelle lokalisieren und an dieser Stelle jeweils die aktuelle Datei öffnen, einlesen und nach dem Suchtext durchsuchen.

Und die richtige Stelle ist doch recht einfach zu finden wenn du den Code von Alex testest und liest was er dazu schrieb.

Die Stelle ist die Codezeile wo der Dateiname in die Listbox geschrieben wird…

Dort mußt du doch nur mit Open usw. die Datei öffnen, einlesen…,schließen.

Nachfolgend ein funktionierender rekursiver Code der auf anderem (langsamereren) Weg die Dateien auflistet die den Suchtext enthalten.

Dazu braucht man in der Form nur eine Standard-Listbox und einen Standard-CommandButton.

Das mit dem Standard schrieb ich um dich und andere potentielle Fragesteller auf etwas aufmerksam zu machen.
Meinen nachfolgenden Cde kann also jeder sofort nachbauen und austesten, er muß nur eine Listbox und einen CB einfügen und fertig.
D.h., falls 10 leute testen wollen, brauchen die insgesamt zum Nachbauen 10 X 1-2 Minuten = 10-20 Minuten.

Nun lese bitte dazu dieses hier aufmerksam durch:

http://www.online-excel.de/fom/butout.php?f=1&b=3

das ist zwar für Excel-Vba geschrieben aber gilt natürlich auch grundsätzlich für VB.

Es ist vollkommen richtig und auch sehr sinnvoll wenn du in deinem Gesamtprojekt den Textboxen, Listboxen usw. sprechende Variablennamen gibst, Namensvergabe am besten an Hand der "ungarischen Notation (s. Wikipedia u.ä.).
Bei längeren Codes ist das zwingend notwendig um den Überblick zu behalten wenn du da 20 Forms, 30 Module, 5 Klassenmodule hast…

Jetzt läuft eine Prozedur nicht korrekt. Dann ist es für dich natürlich sehr einfach die hier rein zu kopieren und um Hilfe zu bitten.

Um jetzt deine Form nachzubauen brauchen die 10 Helfer dann 10 x 5-15 Minuten = 50 -150 Minuten.

D.h. wenn du deinen und meinen Code vergleichst, hast du locker mal so eben sinnloserweise 130 Minuten kostbare „Helferzeit“ verpulvert.

D.h.2, im Umkehrschluß bedeutet das für dich, wir haben gar keine Zeit dir zu helfen, weil 5 andere auch „unsere“ Zeit verpulvert haben.

Lese jetzt bitte nochmals den obigen Link durch, speziell die drei letzten Sätze!

Wenn du dann deine Prozedur so umgeschrieben hast, sodaß sie mit mit Standardnamen für Listboxen, CBs usw. funktioniert taucht ein neues Problem auf.

Da ist vielleicht eine Textbox in der zur Laufzeit irgendwas drinsteht, vielleicht ein Datum.
Wenn nun im Code steht:
strDatum=TextBox7
so wisssen „wir“ absolut nicht was denn in Textbox wirklich drinsteht, also ob 1.1.2008, 1-1-2008, 2008/1/1, 0101008 oder sonstwas.
Dann ist es zum Programmfehler finden sehr hilfreich wenn man potentielle Fehlerquellen ausschließen kann.
D.h. im Code schreibst du nicht
strDatum=TextBox7
sondern
strDatum=„01.01.2008“
und schon sind alle möglichen Fehleingaben in Textbox7 vor der Tür.
Dies gilt natürlich auch für Inputboxen u.v.m.

Dies hat noch einen großen Vorteil, wenn du nun vor dem Posten hier deine Prozedur testest und auf einmal ist der Fehler weg, so hast du ihn schon selbst gefunden, irgendwas ist mit Textbox7 falsch!

Speziell zu deinem ersten Code, was mich da abgeschreckt hat, du benutzt da 20 verschiedene variablen für gleichviel Codezeilen, ohne das jetzt geprüft zu haben, da sind doch garantiert die Hälfte der Variablen überflüssig.

Und alle überflüssigen Variablen verschwenden wieder unnötig „Helferzeit“.

Mit auch deshlab habe ich meinen nachfolgenden Code gebastelt, damit war/bin ich schneller fertig als mich in deinen Code einzulesen :smile:

Alles was ich schrieb beziehe jetzt bitte nicht als irgendwie persönlichen Angriff, nie so gedacht, alles gilt als allgemein gesagt, weil wichtig.

Gruß
Reinhard

Option Explicit
'
Private Sub Command1\_Click()
Dim Unterverz As Boolean, Such As String
Such = "abc"
Unterverz = False
Call DateienAuflisten("h:\", Such, Unterverz)
End Sub
'
Sub DateienAuflisten(ByVal Pfad As String, Such As String, ByVal UV As Boolean)
Dim objFolder, Verz, Dat, objFSO
Static Anz As Long, Ges As Long
Dim Satz As String, FF As Integer
Close
Set objFSO = CreateObject("Scripting.FileSystemObject")
 If objFSO.FolderExists(Pfad) Then
 Set objFolder = objFSO.GetFolder(Pfad)
 For Each Dat In objFolder.Files
 Anz = Anz + 1
 Form1.Caption = "Durchsucht: " & Anz & " durchsuche " & Pfad
 FF = FreeFile
 Open Dat For Binary As #FF
 If LOF(FF) 0 Then
 Ges = Ges + 1
 List1.AddItem Dat
 End If
 End If
 Next Dat
 If UV = True Then
 For Each Verz In objFolder.SubFolders
 Call DateienAuflisten(Verz, Such, UV)
 Next
 End If
 End If
Form1.Caption = "Durchsucht: " & Anz & " Gefunden: " & Ges
Set objFolder = Nothing
Set objFSO = Nothing
End Sub

Hallo Rolf,

so nun bin ich wieder Online und lese dies:frowning:

Ich bastel die Tage mal was :wink:
Was die Frage bzgl. InstrRev betrifft schau mal hier :wink:

FAQ:2906

MfG Alex

Hallo,

ich bin nicht weg. Ich lerne nur :smile:)

Hab mir das verinnerlicht (hoffe ich) und bin am F1 drücken und nachlesen :smile:

Gruß Rolf

p. s. Ich gebe dir vollkomen recht.!