Hallo,
mit Excel-VBA beschäftige ich mich erst seit kurzem und habe nun gleich zum Beginn einen "Hammer" auf'm Tisch bei dem ich hier auf kompetente Hilfe hoffe.
Zum Backgound: Via in einer Batch verschachtelten Tools und ein wenig VBS (für Regex) suche ich in unterschiedlichen PDF-Dateien nach Begriffe und den dazu gehörenden Werten. Dies klappt auch sehr gut bis dahin, daß mir für jede PDF-Datei eine CSV erstellt wird, die zur besseren Unterscheidung auch gleich den Produktnamen als Dateinamen erhält.
Alle Dateien werden in einem Ordner gespeichert (eine Verteilung auf Unterordner ist angedacht.)
Ich habe mir nun aus den weiten des Netzes ein weiteres Tool gebaut und erweitert um diese CSV-Dateien in Excel einzulesen, zu transponieren und als xslx abzuspeichern. Die dazu gehörige xltm rufe ich in meiner Batch-Datei via call auf.
Nach getaner Arbeit soll sich das Excel-Makro komplett schließen und zur Batch zurückkehren.
Mein bisheriger Code sieht zur Zeit so aus:
Arbeitsmappe:
Modul1:
Im ersten Schritt würde ich nun gerne erreichen, daß für jeden Produktnamen (die ersten 6 Zeichen des Dateinamen (ohne Endung)) ein entsprechendes Tabellenblatt angelegt wird.
Beispiel: abc123...csv => Worksheet.name=abc123, bcd234...csv => Worksheet.name=bcd234, usw.
Da die CSV-Dateien i.d.R. bereits nach Namen sortiert sind sollte das Makro auch nicht ständig zwischen den einzelnen Tabellen hin und her springen müßen, sondern nur einen neuen Tabellennamen anlegen und dort hinein transponieren wenn sich der Dateinamen ändert.
Wie umfangreich wäre einen Anpassung des Codes wenn ich mich mittelfristig entschließen sollte die CSV-Dateien gleich auf entsprechende Unterordner zu verteilen? Kann man auch in einem Arbeitsgang die einzelnen Unterorder durchlaufen?
Und eine allerletzte Frage in diesem Zusammenhang:
Woran liegt es, daß Excel sich nach dem das Makro durchgelaufen ist nicht komplett schließt? Excel bleibt ohne Worksheet offen und muß über's X geschlossen werden.
LG
opiwahn
mit Excel-VBA beschäftige ich mich erst seit kurzem und habe nun gleich zum Beginn einen "Hammer" auf'm Tisch bei dem ich hier auf kompetente Hilfe hoffe.
Zum Backgound: Via in einer Batch verschachtelten Tools und ein wenig VBS (für Regex) suche ich in unterschiedlichen PDF-Dateien nach Begriffe und den dazu gehörenden Werten. Dies klappt auch sehr gut bis dahin, daß mir für jede PDF-Datei eine CSV erstellt wird, die zur besseren Unterscheidung auch gleich den Produktnamen als Dateinamen erhält.
Alle Dateien werden in einem Ordner gespeichert (eine Verteilung auf Unterordner ist angedacht.)
Ich habe mir nun aus den weiten des Netzes ein weiteres Tool gebaut und erweitert um diese CSV-Dateien in Excel einzulesen, zu transponieren und als xslx abzuspeichern. Die dazu gehörige xltm rufe ich in meiner Batch-Datei via call auf.
Nach getaner Arbeit soll sich das Excel-Makro komplett schließen und zur Batch zurückkehren.
Mein bisheriger Code sieht zur Zeit so aus:
Arbeitsmappe:
Code:
Sub Workbook_Open()
Dim iRet As Integer
Dim strPrompt As String
Dim strTitle As String
strPrompt = "Jetzt Durchführen, OK?"
strTitle = "CSV-Import"
iRet = MsgBox(strPrompt, vbOKCancel, strTitle)
If iRet = vbOK Then
CSV_Import
'Else
'ActiveWorkbook.Close
'Application.Quit
End If
End Sub
Modul1:
Code:
Sub CSV_Import()
Dim sInPfad As String
Dim sOutPfad As String
Dim sDatei As String
Dim iFF As Integer
Dim lLZ As Long
Dim sTmp As String
Dim vntTmp As Variant
sInPfad = "C:\PDF2CSV\Output\"
sOutPfad = "C:\PDF2CSV\Results\"
sDatei = Dir(sInPfad & "*.csv")
Do While sDatei <> ""
lLZ = lLZ + 1
iFF = FreeFile()
Open sInPfad & sDatei For Input As iFF
sTmp = Input(LOF(iFF), iFF)
Close iFF
With WorksheetFunction
If lLZ = 1 Then
vntTmp = TextSplitten(sTmp, True)
Tabelle1.Cells(lLZ, 1).Resize(, UBound(vntTmp) + 1) = .Transpose(.Transpose(vntTmp))
lLZ = lLZ + 1
End If
vntTmp = TextSplitten(sTmp)
Tabelle1.Cells(lLZ, 1).Resize(, UBound(vntTmp) + 1) = .Transpose(.Transpose(vntTmp))
End With
sDatei = Dir
Loop
Save_xlsx ActiveWorkbook, sOutPfad & Format(Now, "dd_mm_yyyy_hhmm") & ".xlsx"
ActiveWorkbook.Saved = True
ActiveWorkbook.Close
Application.Quit
End Sub
Sub Save_xlsx(Wb As Workbook, Name As String)
Dim newWb As Workbook
Dim objVBComp As Object
Wb.Sheets.Copy
Set newWb = ActiveWorkbook
With newWb
With .VBProject
For Each objVBComp In .vbcomponents
If objVBComp.Type = 100 Then
With .vbcomponents(objVBComp.Name).CodeModule
.DeleteLines 1, .CountOfLines
End With
End If
Next
End With
.SaveAs Filename:=Name
.Close
End With
Set newWb = Nothing
End Sub
Function TextSplitten(sIN, Optional blnHeader As Boolean)
Dim i As Long
Dim avntA As Variant
avntA = Split(sIN, vbCrLf)
If blnHeader Then
For i = 0 To UBound(avntA)
If InStr(avntA(i), ";") Then _
avntA(i) = Trim$(Left$(avntA(i), InStr(avntA(i), ";") - 1))
Next
Else
For i = 0 To UBound(avntA)
avntA(i) = Trim$(Mid$(avntA(i), InStr(avntA(i), ";") + 1))
Next
End If
TextSplitten = avntA
End Function
Im ersten Schritt würde ich nun gerne erreichen, daß für jeden Produktnamen (die ersten 6 Zeichen des Dateinamen (ohne Endung)) ein entsprechendes Tabellenblatt angelegt wird.
Beispiel: abc123...csv => Worksheet.name=abc123, bcd234...csv => Worksheet.name=bcd234, usw.
Da die CSV-Dateien i.d.R. bereits nach Namen sortiert sind sollte das Makro auch nicht ständig zwischen den einzelnen Tabellen hin und her springen müßen, sondern nur einen neuen Tabellennamen anlegen und dort hinein transponieren wenn sich der Dateinamen ändert.
Wie umfangreich wäre einen Anpassung des Codes wenn ich mich mittelfristig entschließen sollte die CSV-Dateien gleich auf entsprechende Unterordner zu verteilen? Kann man auch in einem Arbeitsgang die einzelnen Unterorder durchlaufen?
Und eine allerletzte Frage in diesem Zusammenhang:
Woran liegt es, daß Excel sich nach dem das Makro durchgelaufen ist nicht komplett schließt? Excel bleibt ohne Worksheet offen und muß über's X geschlossen werden.
LG
opiwahn