yannosch
Goto Top

Excel mit VBS bearbeiten und Speichern Unter

Hallo zusammen,

stehe vor einer schnell zu lösenden Aufgabe & bin ein wenig überfordert.

In einem Ordner mit ca. 64 Dateien, sollen alle Dateien Bearbeitet werden und unter einem anderen Namen abgespeichert werden.

Die Bearbeitung: Es sollen lediglich alle Zeilen der Dokumente gelöscht werden, bis zwei Mal ein bestimmtes Wort in der Zeile A erscheint.

Dann soll die Datei unter anderem Namen abgespeichert werden.

Ich dachte an VBS und einer Schleife. ...

Weiß nur nicht wie ich es anstellen soll, dass alle Dateien im Ordner nacheinander bearbeitet und gespeichert werden ...

Kann mir jemden helfen? Wäre sehr sehr nett face-smile

Liebe Grüße
Yannosch

Content-Key: 315326

Url: https://administrator.de/contentid/315326

Printed on: April 25, 2024 at 04:04 o'clock

Mitglied: 129813
129813 Sep 15, 2016 updated at 08:21:50 (UTC)
Goto Top
Search the board, there are multiple solutions available like this:
VBScript alle Word dateien einem Verzeichnis und Unterverzeichnissen öffnen und Makro Ausführen

Regards
Member: Yannosch
Yannosch Sep 15, 2016 at 08:33:53 (UTC)
Goto Top
Ich suche nach der Bearbeitung von Excel & vor allem, dass alle Dateien im Ordner nacheinander aufgerufen werden sollen ....
Leider habe ich von VBS nicht so die Ahnung wie der ein oder andere Profi..

Danke face-smile
Mitglied: 129813
129813 Sep 15, 2016 at 08:51:20 (UTC)
Goto Top
If you would have looked at the code you would heave noticed that it processes Excel files as well...
Member: Yannosch
Yannosch Sep 15, 2016 at 09:06:11 (UTC)
Goto Top
Ich habe gerade gesehen, dass es csv. Dateien sind ... habe aber die Dateiextension hinzugefügt.

Nun weiß ich nur nicht wie ich die Schleife in der Funktion aufbauen soll , dass jede Zeile gelöscht wird, bis das word "Trace" in Spalte A vorkommt.
Dort hakt es bei mir ...

Jemand eine Idee ?
Du vielleicht Highload?...
Mitglied: 129813
129813 Sep 15, 2016 updated at 09:14:47 (UTC)
Goto Top
Zitat von @Yannosch:

Ich habe gerade gesehen, dass es csv. Dateien sind ... habe aber die Dateiextension hinzugefügt.

Nun weiß ich nur nicht wie ich die Schleife in der Funktion aufbauen soll , dass jede Zeile gelöscht wird, bis das word "Trace" in Spalte A vorkommt.
Dort hakt es bei mir ...

Jemand eine Idee ?
Du vielleicht Highload?...
With objWB.Sheets(1)
        Set f = .Range("A:A").Find("Trace", , -4163, 2)  
        If Not f Is Nothing Then
            .Range("1:" & f.Row - 1).Delete  
        End If
End With
Member: Yannosch
Yannosch Sep 15, 2016 at 09:19:29 (UTC)
Goto Top
'Pfad zu den Dokumenten  
Const strPathDocs = "D:\Mess-Dateien"  
'Logfile für eventuell auftretende Fehler  
Const strPathLogfile = "D:\logfile.txt"  
'Erweiterungen der Dateien die bearbeitet werden sollen  
arrFileExtensions = Array("doc","docm","xlsm","xls","csv")  

Set fso = Wscript.CreateObject("Scripting.Filesystemobject")  
Set objShell = CreateObject("Wscript.Shell")  
Dim intDocCount, intErrCount, objExcel, objWord
Set objExcel = CreateObject("Excel.Application")  
Set objWord = WScript.CreateObject("Word.Application")  
'Applikation anzeigen und eventuelle Dialoge für Batchbetrieb unterdrücken  
objExcel.Visible = True
objExcel.DisplayAlerts = 0
objWord.Visible = True
objWord.DisplayAlerts = 0

'Im Ordner Rekursiv alle Dokumente mit den angegebenen Extensions verarbeiten  
parseFolders fso.GetFolder(strPathDocs), True

objExcel.DisplayAlerts = True
objExcel.Quit
objWord.DisplayAlerts = True
objWord.Quit

If intErrCount = 0 Then
	MsgBox "Es wurden insgesamt " & intDocCount & " Dokumente verarbeitet.", vbInformation, "Verarbeitung abgeschlossen"  
Else
	MsgBox "Es wurden insgesamt " & intDocCount & " Dokumente verarbeitet." & vbCrLf & "Davon ist bei " & intErrCount & " Dokumenten ein Fehler aufgetreten!", vbInformation, "Verarbeitung abgeschlossen"  
	objShell.Run "Notepad.exe " & strPathLogfile  
End If

Set objShell = Nothing
Set objWord = Nothing
Set objExcel = Nothing
Set fso = Nothing
'Ende  

Function parseFolders(fldr, boolRecursion)
    For Each file In fldr.Files
    	For i = 0 To UBound(arrFileExtensions)
			If LCase(arrFileExtensions(i)) = LCase(fso.GetExtensionName(file.Path)) And file.DateLastModified > DateAdd("m",-1,Now()) Then  
				intDocCount = intDocCount + 1 
				Select Case Left(LCase(fso.GetExtensionName(file.Path)),2)
					Case "xl"	' wenn es ein Excel-Workbook ist ....  
						
						'Fehlerbehandlung für den Fall das ein Fehler beim Öffnen eines Dokumentes auftritt  
						On Error Resume Next
			            Set objWB = objExcel.Workbooks.Open(file.Path)
			            If Err.Number <> 0 Then
			            	intErrCount = intErrCount + 1
			            	WriteLog "!!ERROR!! Fehler beim öffnen der Datei: -> '" & file.Path & "'"  
                                        Err.Clear
			            Else
			            	' Funktion im Workbook ausführen  
			            	With objWB.Sheets(1).Range("A:A")  
							Set f = .Find("Trace", , -4163, 2)  
								If Not f Is Nothing Then
									Range("1:" & f.Row - 1).Delete  
								End If
							End With
			            	'-------------------------------  
			            	objWB.Save
			            	objWB.Close
			            	WriteLog "Workbook wurde verarbeitet: ->'" & file.Path & "'"  
			            End If
						
						
					Case "do"	' wenn es ein Word-Dokument ist ....  
						
						'Fehlerbehandlung für den Fall das ein Fehler beim Öffnen eines Dokumentes auftritt  
			            On Error Resume Next
			            Set objDoc = objWord.Documents.Open(file.Path)
			            If Err.Number <> 0 Then
			            	intErrCount = intErrCount + 1
			            	WriteLog "!!ERROR!! Fehler beim öffnen der Datei: -> '" & file.Path & "'"  
                                        Err.Clear
			            Else
			            	'Funktion ausführen  
			            	objWord.Run "Modul1.MyTestModul"  
			            	'------------------  
			            	objDoc.Save
			            	objDoc.Close
			            	WriteLog "Dokument wurde verarbeitet: ->'" & file.Path & "'"  
			            End If
			            
				End Select
				Exit For
	         End If
		Next
    Next
    
    'Funktion wird rekursiv aufrufen wenn das durchsuchen aller Unterordner gewünscht ist  
    If boolRecursion Then
		For Each subFolder in fldr.SubFolders
			parseFolders subFolder, True
		Next
	End If
End Function

Function WriteLog(strText)
	Set objLog = fso.OpenTextFile(strPathLogfile,8,True)
	logline = Now & " - " & strText  
	objLog.WriteLine(logline)
	objLog.Close
End Function

Es werden keine Daten verarbeitet... im Errorlog steht nichts drin.

Ich betone nochmal, dass es keine xls sondern eine csv Datei ist ....
Und die Datei sollte danach auch unter anderem Namen abgespeichert werden ....

Ich checks nicht face-sad

Liebe Grüße ...
Member: Biber
Solution Biber Sep 15, 2016 at 10:33:41 (UTC)
Goto Top
Moin Yannosch,

wenn ich dich richtig verstanden habe, willst du doch eigentlich nur ein einem albernen Ordner 64 Csv-Dateien durchnudeln und um ein paar Zeilen gekürzt unter einem neuen Namen speichern.

Ich würde das eben schnell mit einem Oneliner vom CMD-Prompt machen.

ich habe in einem Verzeichnis ein paar CSV-Dateien abgelegt.
Beispiel Yannosch_001.csv
"Feld1","Feld2","Feld3"
"Kein Trace", "Was anderes", "01.07.2016"
"Auch kein Trace", "Noch was anderes", "03.07.2016"
"immer noch kein Trace", "Wieder was anderes", "04.07.2016"
"immer noch kein Trace", "Wieder was anderes", "04.07.2016"
"immer noch kein Trace", "Wieder was anderes", "04.07.2016"
"immer noch kein Trace", "Wieder was anderes", "04.07.2016"
"Trace", "Das wird die erste neue Zeile", "05.07.2016"
"Auch kein Trace", "Noch was anderes", "12.07.2016"
"Auch kein Trace", "Noch was anderes", "23.07.2016"
"Auch kein Trace", "Noch was anderes", "25.07.2016"

Wenn ich diene Anforderung richtig verstehe, dann soll alles vor dem ersten Auftauchen des Wortes "Trace" am Zeilenanfang einer Zeile verworfen werden und der verbleibende Rest unter neuem Namen gespeichert werden.

Also geh in das Verzeichnis mit den CSVs und copy&paste:
PoC:
for %i in (yann*.csv) do @for /f "delims=: tokens=1,*" %x in ('findstr /n /i "^\"Trace\"" %i') do @((echo %y) & more +%x %i)  

Mit Speichern unter neuem Namen:
for %i in (yann*.csv) do @for /f "delims=: tokens=1,*" %x in ('findstr /n /i "^\"Trace\"" %i') do @((echo %y) & more +%x %i)>neu%i  

Die neuen Dateien werden bei mir als "neualterdateiname" im gleichen Verzeichnis abgelegt.
Inhalt von so einer:
Y:\Biber\spielkrams>type neuyannosch_002.csv
"Trace", "Das wird die erste neue Zeile", "05.07.2016"
"Auch kein Trace", "Noch was anderes", "12.07.2016"
"Auch kein Trace", "Noch was anderes", "23.07.2016"
"Auch kein Trace", "Noch was anderes", "25.07.2016"

Grüße
Biber
Member: Yannosch
Yannosch Sep 15, 2016 at 10:45:38 (UTC)
Goto Top
Danke für deine Antwort @Biber! face-smile

@colinardo hat mir derzeit auch schon weitergeholfen - mit der Powershell.

Folgender Code hat die perfekte Lösung für dieses Problem gebracht:

$source = 'A:\Yannosch\source'  
$target = 'A:\Yannosch\target'  
$search = 'trace'  
gci $source -Filter *.csv -Recurse | %{
    (gc $_.FullName | out-string) -replace "(?ism)(.*?)(^[^\r\n]*$([regex]::Escape($search)).*)",'$2' | set-content "$target\$($_.Basename)_bearbeitet$($_.Extension)"  
}

Vielen Dank an alle die mitgewirkt haben face-smile