romberto
Goto Top

EXCEL Mehrzeiler aus Textdatei als Mehrzeiler in eine einzlene Zeile importieren

Hallo Gemeinde,

Kann sein, dass ich mal wieder komplett um 5 Ecken denke. Ich erläuter am besten mal mein Problem:

Ich habe eine Textdatei welche wievolgt aufgebaut ist:

Dateiname [Tapstop] Datum [Tapstop] Mehrzeilige Erläuterung

Beispiel:

testdatei.zip      2012-08-17      Diese Datei enthält
                                   diverse Projekte:
                                   BLABLALBA.....
nächstedatei.zip   Datum           Blablabla
                                   blablabla

Wenn ich das nun in Excel importiere werden die Spalten zwar richtig angelegt, wie bekomme ich es aber hin, dass die Mehrzeilige Erläuterung mit Zeilenumbruch in einer einzelnen Zeile steht, dass ich so zusagen in Zeile 2 auch schon die nächste Datei habe?

Ich hoffe ihr könnt einem Excel Neuling etwas unter die Arme greifen...

Viele Grüße

Robert

Content-Key: 189751

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

Printed on: May 5, 2024 at 13:05 o'clock

Mitglied: 76109
76109 Aug 17, 2012 updated at 09:32:46 (UTC)
Goto Top
Hallo Robert!

Dazu müsstest Du den Text zuvor entsprechend konvertieren.

Ein normaler Zeilenumbruch besteht aus zwei Zeichen CR + LF und wenn Du Mehrzeiler in einer Zelle haben willst, dann müssen die betreffenden CR's entfernt werden. D.h. das an den bereffenden Stellen nur ein LF steht und das wiederum entspricht einem 'Alt+Return' innerhalb einer Zelle.

Gruß Dieter
Member: bastla
bastla Aug 17, 2012 at 10:04:36 (UTC)
Goto Top
Hallo romberto!

Wenn am Beginn der Zeilen 2, 3 und 5 jeweils 2 TAB stehen und es genügt, die Zeilenschaltungen durch Leerzeichen zu ersetzen, sollte das folgende VBScript eine für den Import passende Datei erstellen:
Ein = "D:\MitUmbruch.txt"  
Aus = "D:\OhneUmbruch.txt"  

Set fso = CreateObject("Scripting.FileSystemObject")  
Set rE = New RegExp
rE.Global = True
rE.Pattern = "\r\n\t\t"  

fso.CreateTextFile(Aus).Write rE.Replace(fso.OpenTextFile(Ein).ReadAll, " ")  
Wenn Du die Zeile 5 durch
Set rE = CreateObject("VBScript.RegExp")
ersetzt, kannst Du das auch als Makro in einer Excel-Datei verwenden ...

Grüße
bastla
Mitglied: 76109
76109 Aug 18, 2012 updated at 12:44:54 (UTC)
Goto Top
Hallo bastla!

Habe festgestellt, dass der Textimport die LF's als normalen Zeilenumbruch interpretiert, also indem Fall leider doch nicht funktioniertface-sad

Für Dein Skript hätte ich folgenden Verbesserungsvorschlag:
rE.Pattern = "\r\n\s{1,}"  
wobei alle Tabs/Leerzeichen nach einem Zeilenumbruch ersetzt werden.

Gruß Dieter
Member: bastla
bastla Aug 18, 2012 at 13:23:09 (UTC)
Goto Top
@Dieter
Habe festgestellt, dass der Textimport die LF's als normalen Zeilenumbruch interpretiert
... weswegen ich auch in meinem Vorschlag Leerzeichen anstelle des LF angeboten habe face-wink ...

Dein Verbesserungsvorschlag ist sinnvoll face-smile und lässt sich noch etwas eleganter formulieren:
rE.Pattern = "\r\n\s+"
Grüße
bastla
Mitglied: 76109
76109 Aug 18, 2012 updated at 16:30:08 (UTC)
Goto Top
[OT]
@bastla
... und lässt sich noch etwas eleganter formulieren:
rE.Pattern = "\r\n\s+"
Stimmt, hatte allerdings mit einem
rE.Pattern = "\r\s{2,}"
gerechnetface-smile

Gruß Dieter
[/OT]
Member: bastla
bastla Aug 18, 2012 at 14:50:59 (UTC)
Goto Top
Hallo Dieter!

Das würde zwar meinem obigen Ansatz genauer entsprechen, aber es fehlt ja ohnehin noch ein Feedback, ob die Annahme, dass die Folgezeilen mit jeweils 2 TAB beginnen würden, überhaupt stimmt - um dem geposteten Beispiel zu entsprechen, passt es aber mit nur einem Whitespace am Zeilenanfang ...

Grüße
bastla
Mitglied: 76109
76109 Aug 18, 2012 updated at 16:31:02 (UTC)
Goto Top
[OT]
Hallo bastla!

Ob der Zeilenanfang jetzt mit 1, 2, 3... Tabs oder Leerzeichen beginnen ist ja ohne Bedeutung. Von dem abgesehen würden 2 Tab's eh nicht ausreichen, um die unteren Texte in die Beispiel-Position zu bringen. Daher war/ist mein Ansatz eigentlich, nach dem '\r' mindestens 2 Zeichen aus (\n, \t, " ", ...) und x-beliebig nachfolgende (/t oder " "), was ja auch mit "\r\n\s+" gegeben ist. Insofern war mein letzter Ansatz eigentlich als nicht ernstzunehmender Scherz gedacht und hoffe Du vergibst mirface-wink

Gruß Dieter
[/OT]
Member: bastla
bastla Aug 18, 2012 at 16:32:00 (UTC)
Goto Top
Hallo Dieter!
Von dem abgesehen würden 2 Tab's eh nicht ausreichen, um die unteren Texte in die Beispiel-Position zu bringen.
Hatte ich auch überlegt;
Wenn ich das nun in Excel importiere werden die Spalten zwar richtig angelegt
würde aber wieder darauf hinweisen, dass es doch genau die 2 TAB sind ...
Insofern war mein letzter Ansatz eigentlich als nicht ernstzunehmender Scherz gedacht und hoffe Du vergibst mirface-wink
Aber nur ausnahmsweise face-wink

Grüße
bastla
Member: rubberman
rubberman Aug 18, 2012 updated at 16:46:37 (UTC)
Goto Top
Hallo Zusammen!

Um tatsächlich die Zeilenumbrüche in Spalte 3 so zu setzen, wie sie in der Textdatei auftreten, könnte man eure Ansätze gleich in ein Excel Makro packen.
Etwa so:
Sub import()
    Dim sFName, iFNum As Integer, sText As String, i As Long, aLines, _
        oWb As Excel.Workbook, oWs As Excel.Worksheet
    sFName = Application.GetOpenFilename( _
        Title:="Wähle eine Datei zum Importieren aus ...", _  
        FileFilter:="Text Dateien *.txt (*.txt),", _  
        MultiSelect:=False)
    If sFName = False Then Exit Sub
    iFNum = FreeFile()
    Open sFName For Input As iFNum
    sText = Input(LOF(iFNum), iFNum)
    Close iFNum
    Set oWb = Application.Workbooks.Add(xlWBATWorksheet)
    Set oWs = oWb.Worksheets(1)
    oWs.Name = _
        CreateObject("Scripting.FileSystemObject").GetFileName(sFName)  
    With CreateObject("VBScript.RegExp")  
        .Global = True
        .Pattern = "\r\n\s+"  
        sText = .Replace(sText, vbLf)
    End With
    aLines = Split(sText, vbCrLf)
    For i = 0 To UBound(aLines)
        oWs.Range(Cells(i + 1, 1), Cells(i + 1, 3)) = Split(aLines(i), vbTab)
    Next
End Sub

Grüße
rubberman
Mitglied: 76109
76109 Aug 18, 2012 at 21:44:29 (UTC)
Goto Top
Hallo rubberman!

Nach dem Motto, Nägel mit Köpfen machenface-wink dann der Vollständigkeit halber noch die Vorlage-Variante (.*xlt) mit Leerzeichen. Gefällt mir im Tabellenblatt optisch besser und per AutoFit kann die optimale Spaltenbreite angepasst werden, was beim Mehrzeiler leider nicht funktioniert.
Option Explicit

Private Const DlgT = "Wähle eine Datei zum Importieren aus ..."  
Private Const DlgF = "Text Dateien (*.txt), *.txt"  

Sub TextImport()
    Dim sFileName As Variant, Text As Variant, i As Long

    sFileName = Application.GetOpenFilename(Title:=DlgT, FileFilter:=DlgF, MultiSelect:=False)
    
    If sFileName = False Then Exit Sub
    
    Text = CreateObject("Scripting.FileSystemObject").OpenTextFile(sFileName).ReadAll  
    
    With CreateObject("VBScript.RegExp")  
        .Global = True
        .Pattern = "\r\n\s+"  
         Text = Split(.Replace(Text, " "), vbCrLf)  
    End With
    
    With Sheets(1)
       .Cells.ClearContents
        For i = 0 To UBound(Text)
            If Text(i) <> "" Then  
                Cells(i + 1, "A").Resize(1, 3) = Split(Text(i), vbTab)  
            End If
        Next
       .Columns("A:C").AutoFit  
    End With
End Sub

Gruß Dieter
Member: rubberman
rubberman Aug 19, 2012 at 12:09:17 (UTC)
Goto Top
Hallo Dieter!

Zitat von @76109:
... per AutoFit kann die optimale Spaltenbreite angepasst werden, was beim Mehrzeiler leider nicht funktioniert.

Jein. Wenn die Breite dabei kleiner wird, funktioniert es. Muss sie größer werden, dann nicht. (Warum das so ist, wird mir wohl ewig ein Rätsel bleiben.)
Workaround könnte so aussehen:
~~~ snip ~~~
    With oWs.UsedRange
        .Cells.VerticalAlignment = xlTop
        .ColumnWidth = 200
        .RowHeight = 300
        .Columns.AutoFit
        .Rows.AutoFit
    End With
~~~ snip ~~~

Grüße
rubberman
Mitglied: 76109
76109 Aug 19, 2012 updated at 12:21:45 (UTC)
Goto Top
Hallo rubberman!

Funktioniertface-smile Danke für den Tip!

Gruß Dieter