Gewisse Excel Spalten seperat als einzelne TXT Datei speichern
Hallo,
ich habe eine Frage bzw. Problem.
habe eine CSV Datei, welche ich in Excel öffne,
Diese hat ab Zeile 8 Spalten befüllt ( Spaltenbezeichnung z.b. ID, STATUS, Titel, Description ect...
nun möchte ich folgendes erreichen.
Aus jeder Zeile soll eine sep. TXT Datei erzeugt werden,
Hier möchte ich aber per VBA die Spalten beeinflussen, welche exportiert werden.
Gleichzeitig soll aus 2 Spalten der Dateiname gebildet werden (Sondezeichen die für Dateinamen nicht zulässig sind sollen per "blank" gefiltert werden.
Wie kann dieses am besten umgesetzt werden.
Grüße aus München
ich habe eine Frage bzw. Problem.
habe eine CSV Datei, welche ich in Excel öffne,
Diese hat ab Zeile 8 Spalten befüllt ( Spaltenbezeichnung z.b. ID, STATUS, Titel, Description ect...
nun möchte ich folgendes erreichen.
Aus jeder Zeile soll eine sep. TXT Datei erzeugt werden,
Hier möchte ich aber per VBA die Spalten beeinflussen, welche exportiert werden.
Gleichzeitig soll aus 2 Spalten der Dateiname gebildet werden (Sondezeichen die für Dateinamen nicht zulässig sind sollen per "blank" gefiltert werden.
Wie kann dieses am besten umgesetzt werden.
Grüße aus München
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 268482
Url: https://administrator.de/forum/gewisse-excel-spalten-seperat-als-einzelne-txt-datei-speichern-268482.html
Ausgedruckt am: 23.12.2024 um 02:12 Uhr
13 Kommentare
Neuester Kommentar
Moin,
ich würde das schnell ohne Excel mit Powershell abfackeln geht wesentlich schneller:
Hier ne Demo
Gruß jodel32
ich würde das schnell ohne Excel mit Powershell abfackeln geht wesentlich schneller:
Hier ne Demo
function Replace-IllegalPathChars([parameter(ValueFromPipeline=$true)]$string,$replaceString='_'){
return ($string -replace '^com[1-9]|^lpt[1-9]|^con|^nul|^prn|[\\/:?<>|"*]',$replaceString)
}
# Ausgabepfad der einzelnen Zeilen
$outPath = "C:\temp\ordner"
# Spalten welche exportiert werden sollen
$spalten = "ID","Description","Titel"
# CSV-Datei importieren ab Zeile 8 als Objekt importieren
$csv = gc "C:\temp\data.csv" | select -skip 7 | convertfrom-csv -Delimiter ";"
# für jede Zeile der CSV-Datei
$csv | select $spalten | %{
# setze Namen der Textdatei zusammen aus Spalte 'Description' + '_' + 'Titel' und ersetze illegale Zeichen im Namen
$newpath = $outPath + "\" + (($_.Description + "_" + $_.Titel) | Replace-IllegalPathChars -replaceString ' ').Trim()
# übertrage die Zeile in die neue Datei
$_ | convertto-csv -Delimiter ";" -NoTypeInformation | select -skip 1 | set-content $newpath
}
Moin,
du weißt aber schon das man immer den kompletten Pfad oder den relativen zum Script angeben muss !!
Wenn du sich im gleichen Verzeichnis wie das Script befindest musst du
schreiben.
Und was soll das ps vor dem Scriptnamen ? Das geht natürlich nicht ... das ist ja selber ein Alias für das CMDLet get-process... deswegen die Fehlermeldung.
Gruß jodel32
du weißt aber schon das man immer den kompletten Pfad oder den relativen zum Script angeben muss !!
Wenn du sich im gleichen Verzeichnis wie das Script befindest musst du
.\kb.ps1
Und was soll das ps vor dem Scriptnamen ? Das geht natürlich nicht ... das ist ja selber ein Alias für das CMDLet get-process... deswegen die Fehlermeldung.
Eine Fage habe ich, mit Lerrstellen in dne Zeilen kommt er ohne Probleme klar?
Was heißt das ? ganze leere Zeilen oder nur Blanks in den Spalten ? Das ist kein Problem ...Gruß jodel32
Du musst die Executionpolicy in einer administrativen Powershell-Konsole umstellen !
Und dort dann
eingeben
Und dort dann
Set-Executionpolicy RemoteSigned
Zur Info...
@colinardo hat hier auch eine Anfänger Anleitung für Powershell-Scripte gepostet ...
Batch bei bestimmten Wörtern jeweilige Zeile entfernen
@colinardo hat hier auch eine Anfänger Anleitung für Powershell-Scripte gepostet ...
Batch bei bestimmten Wörtern jeweilige Zeile entfernen
OK also bist du Domain-User ohne lokale Admin-Rechte ?
Na dann ... melde ich mich später nochmal mit einem VBS.
Ist das korrekt das die Werte/Überschriften erst ab Zeile 8 in der CSV stehen ? wenn ja, mit welchem Delimiter sind die Spalten voneinander getrennt ?
Am besten du postest hier mal die ersten 10 Zeilen als Beispiel, so sind Missverständnisse ausgeschlossen.
Gruß jodel32
Na dann ... melde ich mich später nochmal mit einem VBS.
Ist das korrekt das die Werte/Überschriften erst ab Zeile 8 in der CSV stehen ? wenn ja, mit welchem Delimiter sind die Spalten voneinander getrennt ?
Am besten du postest hier mal die ersten 10 Zeilen als Beispiel, so sind Missverständnisse ausgeschlossen.
Gruß jodel32
Hier der VBA-Code für dein Excel-Sheet. Kommentare findest du im Code.
http://we.tl/k4FAFMiqSl
Gruß jodel
http://we.tl/k4FAFMiqSl
Sub ExportData()
'Ausgabe-Pfad für die neuen Dateien
Const OUTPATH = "C:\temp\ordner"
Dim rngTable As Range, strNewFile As String, cell As Range, fso As Object, arrBuildNameFromColumns As Variant, arrColumns As Variant
Set fso = CreateObject("Scripting.FileSystemObject")
'Array der zu exportierenden Spalten (beginnend mit 0)
arrColumns = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)
'Spalten aus denen der Name der Datei gebildet wird (beginnt mit 0 zu zählen)
arrBuildNameFromColumns = Array(3, 4)
With ActiveSheet
'Anzahl der Zeilen ermitteln
Set rngRows = .Range("A9:A" & .Cells(Rows.Count, "A").End(xlUp).row)
'Für jede Zeile
For Each cell In rngRows
'Array der Spalten der aktuellen Zeile
Dim arrLine()
ReDim arrLine(UBound(arrColumns))
'Die gewünschten Spalten ins Array schreiben
For i = 0 To UBound(arrColumns)
arrLine(i) = cell.Offset(0, arrColumns(i)).Value
Next
'Neuen Dateinamen zusammensetzen
strNewFile = OUTPATH & "\" & ReplaceIllegalChars(arrLine(arrBuildNameFromColumns(0)) & "_" & arrLine(arrBuildNameFromColumns(1))) & ".csv"
'Zeile in neue Datei schreiben
fso.OpenTextFile(strNewFile, 2, True).WriteLine (Join(arrLine, ";"))
Next
End With
Set fso = Nothing
End Sub
'Funktion um Sonderzeichen durch ein Leerzeichen zu ersetzen
Function ReplaceIllegalChars(strText)
Set regex = CreateObject("vbscript.regexp")
regex.Pattern = "[\\/:?<>|""*]"
regex.Global = True
ReplaceIllegalChars = regex.Replace(strText, " ")
Set regex = Nothing
End Function
Es erfolgt ein Fehler dass er den Pfad nicht findet, sobald die Spalten welche ich Vorgebe leer sind
Was soll dann deiner Meinung nach passieren, das kann man natürlich mit einer einfachen IF-Abfrage prüfen .. was in diesem Fall passieren soll weißt nur du Da gibt's ja 1001 Möglichkeiten (Random string generieren, File auslassen, etc)Im unten stehenden Code wird einfach unspecified ergänzt. Ich gehe mal davon aus das die No. aber nicht leer ist, wenn das der Fall ist musst du diesen Fall unten noch ergänzen.
Gleichzeitig ist das Problem, dass er die Werte nicht jeweils untereinander schreibt, sondern als zusammenhägenden String ausgibt.
wurde ja eingangs nicht erwähnt , war davon ausgegangen das die Zeile so wie sie ist übertragen werden sollte.Ist aber kein Problem, indem Fall dann etwas abgeändert:
Sub KB_einlesen()
'Ausgabepfad der neuen Dateien
Const OUTPATH = "C:\temp\KB_IM"
Dim rngTable As Range, strNewFile As String, cell As Range, fso As Object, arrBuildNameFromColumns As Variant, arrColumns As Variant, strPart1 as String, strPart2 as String
Set fso = CreateObject("Scripting.FileSystemObject")
'Array der zu exportierenden Spalten (beginnend mit 0)
arrColumns = Array(1, 3, 4, 5, 6)
'Spalten aus denen der Name der Datei gebildet wird (beginnt mit 0 zu zählen)
arrBuildNameFromColumns = Array(0, 2)
With ActiveSheet
'Anzahl der Zeilen ermitteln
Set rngRows = .Range("A9:A" & .Cells(Rows.Count, "A").End(xlUp).row)
'Für jede Zeile
For Each cell In rngRows
'Werte für den Dateinamen
strPart1 = cell.Offset(0, arrBuildNameFromColumns(0)).Value
strPart2 = cell.Offset(0, arrBuildNameFromColumns(1)).Value
'Wenn länge des zweiten Parts länger als 100 Zeichen, kürzen
If Len(strPart2) > 100 Then
strPart2 = Left(strPart2, 100)
End If
'Neuen Dateinamen zusammensetzen / wenn Incident Status leer ist schreibe stattdessen 'unspecified' als Name der Textdatei
If strPart2 <> "" Then
strNewFile = OUTPATH & "\" & ReplaceIllegalChars(strPart1 & "_" & strPart2) & ".txt"
Else
strNewFile = OUTPATH & "\" & ReplaceIllegalChars(strPart1) & "_" & "unspecified.txt"
End If
'Neue Textdatei erstellen
Set f = fso.CreateTextFile(strNewFile, True, True)
'Die gewünschten Spalten in die Textdatei schreiben
For i = 0 To UBound(arrColumns)
f.WriteLine .Range("A8").Offset(0, arrColumns(i)).Value & ":" 'Spaltenüberschrift
f.WriteLine cell.Offset(0, arrColumns(i)).Value 'Spaltenwert
f.WriteLine "" 'Leerzeile
Next
'Datei schließen
f.Close
Next
End With
Set fso = Nothing
End Sub
'Funktion um Sonderzeichen durch ein Leerzeichen zu ersetzen
Function ReplaceIllegalChars(strText)
Set regex = CreateObject("vbscript.regexp")
regex.Pattern = "[\\/:?<>|""*]"
regex.Global = True
ReplaceIllegalChars = regex.Replace(strText, " ")
Set regex = Nothing
End Function