Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Stringsuche in Datei mit VBA

Frage Entwicklung VB for Applications

Mitglied: manuel5

manuel5 (Level 1) - Jetzt verbinden

02.10.2008, aktualisiert 03.10.2008, 13665 Aufrufe, 9 Kommentare

Dateiinhalte suchen und Dateiname mit Pfad ausgeben

Hallo zusammen,

bin seit geraumer Zeit auf der Suche nach ner Lösung.
Habe einen Suchcode der mir supergut die Dateien findet und auch anzeigt, das Problem ist, das ich in die Suche den korrekten Dateinnamen eingeben muss.
Was ich aber brauche ist das er mit nach Dateiinhalten sucht. Also quasi die Desktopsuche von MS.
Habe es über SearchFile versucht - das klappt auch - nur leider nur in Office 2003. Ab 2007 gibts SearchFile nicht mehr

Hat jemand ne Lösung wie ich unten angegebenen Code so umwandle das er mit die gesamte Datei nach Inhalt nach Textinhalten durchsucht?


Option Explicit

Dim fso As New FileSystemObject
Dim fld As Folder

Private Sub cmdFSuchen_Click()
Dim nDirs As Long, nFiles As Long, lSize As Currency
Dim sDir As String, sSrchString As String
Dim fText As String


ListBox1.Clear
sDir = "c:\test\"
fText = TextBox1
'MousePointer = vbHourglass
Label1.Caption = "Searching " & vbCrLf & UCase(sDir) & "..."
lSize = FindFile(sDir, fText, nDirs, nFiles)
'MousePointer = vbDefault
MsgBox Str(nFiles) & " " & " Dateien mit dem Namen " & sSrchString & " gefunden in" & Str(nDirs) & _
" Verzeichnis", vbInformation
'MsgBox "Total Size = " & lSize & " bytes"
End Sub

Private Function FindFile(ByVal sFol As String, sFile As String, _
nDirs As Long, nFiles As Long) As Currency
Dim tFld As Folder, tFil As File, FileName As String
Dim fText As String
On Error GoTo Catch
Set fld = fso.GetFolder(sFol)
FileName = dir(fso.BuildPath(fld.path, sFile), vbNormal Or _
vbHidden Or vbSystem Or vbReadOnly)
While Len(FileName) <> 0
FindFile = FindFile + FileLen(fso.BuildPath(fld.path, _
FileName))
nFiles = nFiles + 1
ListBox1.AddItem fso.BuildPath(fld.path, dir) ' Load ListBox
FileName = dir() ' Get next file
DoEvents
Wend
Label1 = "Searching " & vbCrLf & fld.path & "..."
nDirs = nDirs + 1
If fld.SubFolders.Count > 0 Then
For Each tFld In fld.SubFolders
DoEvents
FindFile = FindFile + FindFile(tFld.path, sFile, nDirs, nFiles)
Next
End If
Exit Function
Catch: FileName = ""
Resume Next
End Function

Private Sub CommandButton2_Click()
Unload frmOrdnerSuchen
End Sub

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim dir As String
dir = ListBox1
Shell "explorer.exe " & dir, vbNormalFocus

End Sub



Danke und Gruß Manuel
Mitglied: RDiller
02.10.2008 um 14:08 Uhr
Hallo Manuel,

lies die Datei doch komplett ein und suche dann in dem Inhalt. Z.B.:

Public Function Search_Content(ByVal sFilename As String, Suchstring) As String

Dim F As Integer
Dim sInhalt As String

' Existiert die Datei ?
If Dir$(sFilename, vbNormal) <> "" Then
' Textdatei im Binärmodus öffnen und gesamten
' Inhalt in einem Rutsch auslesen
F = FreeFile
Open sFilename For Binary As #F
sInhalt = Space$(LOF(F))
Get #F, , sInhalt
Close #F
if instr(sIhnalt,SuchstringThen 'Hier einfach den Suchbegriff in dem Dateiinhalt suchen
msgbox "Gefunden" ' oder was imm Du dann machen willst; evtl Search_Content=True oder so
end if
End if

End Function


Gruß

Ralf
Bitte warten ..
Mitglied: manuel5
02.10.2008 um 14:34 Uhr
Hi Ralf,

danke erstmal. Das Problem ist hier, ich versuche hundert von Ordner (in welchen Dateien drinsind (*.txt)) nach einer Nummer (welche in einer oder auch mehrern der Datein sich bfindet) zu durchsuchen. Wenn er die Nummer dann gefunden hat, soll er mit in einer Listbox den Pfad + Dateinamen anzeigen.

Das mit der Listbox und Pfad und so das alles is kein Problem. Nur soll er mir eben diese Nummern finden (kann aber auch alphanummerisch sein ((( )

Habe deinen mal etwas "angepasst" - aber er zeigt mir garnuescht an - auch keinen Fehler.

Private Sub CommandButton1_Click()
Dim sfilename As String
Dim suchstring As String

Dim F As Integer
Dim sInhalt As String
sInhalt = txtSFile
sfilename = "c:\test"
' Existiert die Datei ?
If Dir$(sfilename, vbNormal) <> "" Then
' Textdatei im Binärmodus öffnen und gesamten
' Inhalt in einem Rutsch auslesen
F = FreeFile
Open sfilename For Binary As #F
sInhalt = Space$(LOF(F))
Get #F, , sInhalt
Close #F
If InStr(sIhnalt, suchstring) Then 'Hier einfach den Suchbegriff in dem Dateiinhalt suchen
listbox.AddItem sfilename ' oder was imm Du dann machen willst; evtl Search_Content=True oder so
End If
End If

End Sub

Er soll also quasi Ordner mit Unterordner durchsuchen.
Heisst ich hinterlege nur den ungefähren Pfad "c:\test" und darunter sind noch einige Unterordner.

in listbox1.additem soll er mr eben den gesamten Pfad anzeigen.

Gruß Manuel
Bitte warten ..
Mitglied: bastla
02.10.2008 um 16:23 Uhr
Hallo manuel5!

Unter CMD gibt es für solche Zwecken "findstr" - und wenn Dich das CMD-Fenster nicht stört, kannst Du diesen Befehl auch von VBA aus nutzen, zB (ungetestet):
01.
Pfad = "c:\test\*.txt" 
02.
Suchbegriff = "Dein Text" 
03.
Set objShell = CreateObject("WScript.Shell") 
04.
Set objExecObject = objShell.Exec("%comspec% /c findstr /m /s /c:""" & Suchbegriff & """ """ & Pfad & """") 
05.
i = 1 
06.
If Not objExecObject.StdOut.AtEndOfStream Then 
07.
    FileList = Split(Trim(objExecObject.StdOut.ReadAll()), vbCrLf) 
08.
    For i = 0 To UBound(FileList) - 1 
09.
        listbox.AddItem FileList(i) 
10.
    Next 
11.
End If
Grüße
bastla
Bitte warten ..
Mitglied: manuel5
02.10.2008 um 16:49 Uhr
Hallo Bastla,

hab mit cmd kein Problem, nur zum Ergebnis solls kommen

Tuts aber leider noch nicht.

Private Sub CommandButton1_Click()
Dim sInhalt As String
sInhalt = txtSFile
Pfad = "c:\test\*.txt"
Suchbegriff = "Langen"
Set objShell = CreateObject("WScript.Shell")
Set objExecObject = objShell.Exec("%comspec% /c findstr /m /s /c:""" & Suchbegriff & """ """ & Pfad & """")
i = 1

If Not objExecObject.StdOut.AtEndOfStream Then
FileList = Split(Trim(objExecObject.StdOut.ReadAll()), vbCrLf)
For i = 0 To UBound(FileList) - 1
ListBox1.AddItem FileList(i)
Next
End If

End Sub

Da "zuckt" nur kurz das Dos-Fenster hoch - aba finden tuts mir noch nichts.

Gruß Manuel
Bitte warten ..
Mitglied: bastla
02.10.2008 um 17:25 Uhr
Hallo manuel5!

Die Pfadangabe mit der Einschränkung auf den Dateityp ".txt" passt? Falls nicht: "*.*" verwenden ...

Um die Suche ohne Unterscheidung von Klein- und Großbuchstaben durchzuführen, kannst Du zusätzlich noch den Schalter "/i" bei "findstr" verwenden.

Mit dem folgenden Code (inklusive angesprochene Änderungen) wird zur Kontrolle vorweg die Kommandozeile ausgegeben (aus der dafür verwendeten "InputBox" kannst Du sie leicht kopieren und in ein CMD-Fenster einfügen, um sie unmittelbar testen zu können):
01.
Pfad = "c:\test\*.*" 
02.
Suchbegriff = "Langen" 
03.
Set objShell = CreateObject("WScript.Shell") 
04.
CommandLine = "%comspec% /c findstr /m /s /i /c:""" & Suchbegriff & """ """ & Pfad & """" 
05.
Dummy = InputBox("CommandLine", , CommandLine) 
06.
 
07.
Set objExecObject = objShell.Exec(CommandLine) 
08.
If Not objExecObject.StdOut.AtEndOfStream Then 
09.
    FileList = Split(Trim(objExecObject.StdOut.ReadAll()), vbCrLf) 
10.
    For i = 0 To UBound(FileList) - 1 
11.
        ListBox1.AddItem FileList(i) 
12.
    Next 
13.
End If
Grüße
bastla
Bitte warten ..
Mitglied: manuel5
02.10.2008 um 19:08 Uhr
JAWOHL!

Ett löfft!


Aber sowas von - super!

Danke - super !

Gruß Manuel
Bitte warten ..
Mitglied: manuel5
03.10.2008 um 11:51 Uhr
Hallo bastla,

noch ne ups zwei Fragen -->

1 - wie bekomm ich das Dos-Shell/Fenster in de Hintergrund - mit hidden schaff ich es ned.

2. wie bekomme ich den Ordner auf in welchen die gesuchte Datei steckt?

Habe ja -->

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim pfad As String
pfad = ListBox1
Shell "explorer.exe " & pfad, vbNormalFocus

End Sub

hier macht er mir die Datei selber auf, was ich aber brauch ist das er mit den Ordner aufmacht.
Die Listbox füllt er mir mit ->

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
ListBox1.AddItem FileList(i)
Next
Else
ListBox1.AddItem "Datei nicht gefunden"
End If

Hast du ne Idee?

Gruß Manuel
Bitte warten ..
Mitglied: bastla
03.10.2008 um 14:30 Uhr
Hallo manuel5!

1 - wie bekomm ich das Dos-Shell/Fenster in de Hintergrund - mit hidden schaff ich es ned.
Deswegen der Hinweis in meinem ersten Kommentar ...

Als (sehr unschöner) Workaround fiele mir nur ein, die Dateiliste aus CMD in eine Datei schreiben zu lassen (und diese dann mit dem Script wieder einzulesen), da in diesem Fall "Shell" verwendet werden könnte. Die Commandline müsste dann um eine Umleitung erweitert werden, etwa:
01.
CommandLine = "%comspec% /c findstr /m /s /i /c:""" & Suchbegriff & """ """ & Pfad & """ >%temp%\Dateiliste.txt"
Einzulesen wäre dann aus "%temp%\Dateiliste.txt".

2. wie bekomme ich den Ordner auf in welchen die gesuchte Datei steckt?
Dazu musst Du eigentlich nur den Pfad an der Position des letzten enthaltenen "\" abschneiden, also:
01.
PathOnly = Left(Pfad, InStrRev(Pfad, "\"))
Grüße
bastla
Bitte warten ..
Mitglied: manuel5
03.10.2008 um 17:41 Uhr


Ok, ist im Prinzip ja kein Problem, wenn s vorne ist.

Das mit dem Pathonly....hätt ich schon so versucht - bei mir gings ned da ich.....hmmm....irgendwo was falsch hatte - jetzt futzt es aber.

Somit danke ich dir recht herzlich für deine Geduld und Hilfe

Gruß Manuel
Bitte warten ..
Ähnliche Inhalte
Microsoft
Excel-Datei mit VBA speichern
gelöst Frage von 116408Microsoft6 Kommentare

Guten Tag Ich habe eine Excel-Datei, in der in D4 der Kundenname und in D11 das Projekt benennt wird. ...

VB for Applications
Dateien in Tabellenblat mit VBA beladen
Frage von lupi1989VB for Applications8 Kommentare

Hallo liebe Leute, bin neu in diesem Forum und würde eure Hilfe brauchen. Bin leider kein VBA-Experte und versuche ...

VB for Applications
VBA Excel Dateien zusammenfassen
Frage von cberndtVB for Applications3 Kommentare

Hi Leute. Ich bin dabei einen Ordner mit Excellisten zusammenzufassen. Im Ordner sind gut 600 einzelne Excel Dateien die ...

Microsoft Office
VBA Import Datei nicht gefunden
gelöst Frage von Latex78Microsoft Office3 Kommentare

Hi Leute, ich bekomme mehrere Textdatei von einer Software auf den Rechner geschrieben. Dazu habe ich mir einen TXT-Import ...

Neue Wissensbeiträge
MikroTik RouterOS

Mikrotik - Lets Encrypt Zertifikate mit MetaROUTER Instanz auf dem Router erzeugen

Anleitung von colinardo vor 9 StundenMikroTik RouterOS4 Kommentare

Einleitung Folgende Anleitung ist aus der Lage heraus entstanden das ein Kunde auf seinem Mikrotik sein Hotspot Captive Portal ...

Sicherheit

Sicherheitslücke in HP-Druckern - Firmware-Updates stehen bereit

Information von BassFishFox vor 10 StundenSicherheit

Ein weiterer Grund, dass Drucker keinerlei Verbindung nach "auswaerts" haben sollen. Unter Verwendung spezieller Malware können Angreifer aus der ...

Administrator.de Feedback

Entwicklertagebuch: Die Startseite wurde überarbeitet

Information von admtech vor 12 StundenAdministrator.de Feedback9 Kommentare

Hallo Administrator User, mit dem Release 5.7 haben wir unsere Startseite überarbeitet und die Beiträge und Fragen voneinander getrennt. ...

Vmware

VMware Desktopprodukte sind verwundbar

Information von Penny.Cilin vor 17 StundenVmware

Die VMware-Anwendungen zum Umgang mit virtuellen Maschinen Fusion, Horizon Client und Workstation sowie die Plattform NSX sind verwundbar. Davon ...

Heiß diskutierte Inhalte
Visual Studio
Vb.net-Tool zum Erzeugen einer Outlook-E-Mail
Frage von ahstaxVisual Studio24 Kommentare

Hallo, ich möchte gerne ein vb.net-Tool schreiben, das am Ende eine Outlook-E-Mail erzeugt. Grundsätzlich ist mir klar, wie das ...

Windows Server
RDP macht Server schneller???
Frage von JaniDJWindows Server16 Kommentare

Hallo Community, wir betrieben seit geraumer Zeit diverse virtuelle Maschinen und Server mit Windows Server 2012. Leider haben wir ...

Windows Netzwerk
Netzwerk Neustrukturierung
Frage von IT-DreamerWindows Netzwerk16 Kommentare

Hallo verehrte Community und Admins, bei uns im Haus steht eine Neustrukturierung an. Dafür benötige ich von euch ein ...

Windows 10
Windows 10 dunkler Bildschirm nach Umfallen
Frage von AkcentWindows 1015 Kommentare

Hallo, habe hier einen Windows 10 Rechner der von einem User umgefallen wurde (Beine übers Knie, an den PC ...