Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1076to1080
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Import txt to xls

Import txt to xls
20.05.2009 08:30:22
Julia
Hallo,
ich verusche eine txt zu importieren. Bisher hat es immer geklappt. Meistens war in der txt ne feste breite oder ein trennzeichen drin. Jetzt habe ich aber eine "komische" txt Datei
Alle Daten stehen in einer Zeile. Excel soll aber nicht alles in eine Zeile importieren. Sobald in der txt die ID 23321 auftaucht soll eine neue Zeile in excel genommen werden bis zur nächsten 23321
Jemand eine Idee?
Gruß

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
geht es so?
20.05.2009 09:08:13
Tino
Hallo,
hier mal ein Beispiel.
Im Beispiel stehen die Daten in der Zelle A1.
Sub Beispiel()
Dim A As Long
Dim strString As String
Dim myAr
Dim rZelle As Range

'hier die Zelle angeben wo die Daten stehen 
Set rZelle = Range("A1")
    
    If InStr(rZelle, "ID 23321") > 0 Then
     strString = Replace(rZelle, "ID 23321", "<|>ID 23321")
     myAr = Split(strString, "<|>")
     rZelle.Resize(Ubound(myAr) + 1) = Application.Transpose(myAr)
    End If

End Sub


Gruß Tino

Anzeige
AW: geht es so?
20.05.2009 09:14:20
Julia
Hi Tino,
wenn ich die Importfunktion aus xls nutze kann ich maximal 256 Spalten importieren. Meine txt hat aber hunderte von Einträge pro Zeile
Irgendwie wird was abgeschnitten
In meiner txt ist jedes Feld (z.B. Vorname, Name usw.) durch eine ID beschrieben.
Jetzt soll alles in eine Zeile importiert werden, tauch aber in der txt dann wieder die ID 23321 auf soll eine neue Zeile genommen werden.
Mein Ausgangsxls ist leer, und die ganzen Infos in einer txt
lade mal eine solche txt Datei. oT.
20.05.2009 09:17:00
Tino
AW: lade mal eine solche txt Datei. oT.
20.05.2009 09:23:39
Julia
Hallo,
habe das ganze nochmal durchdacht und mit Leuten besprochen. Es wäre zu kompliziert die Original txt zu nehmen. Haben aber eine Lösungsidee. Passt aber wohl nicht in das Forum hier. Aber vielleicht hat jemand einen Tipp.
Kann ich über ein Makro bzw. Batch in meinem txt überall eine Semikolon einfügen wo Leerzeichen stehen. Weil dann könnte ich es elegant in Excel importieren....
Anzeige
Leerzeichen durch Semikolon
20.05.2009 09:35:52
Tino
Hallo,
hiermit sollte es gehen.
Sub TXT_Bearbeiten()
Dim sInhalt As String, sFilename As String
Dim F As Integer

sFilename = Application.GetOpenFilename("Text File (*.txt),*.txt")

If sFilename <> CStr(False) Then
    'TXT einlesen 
    F = FreeFile
    Open sFilename For Binary As #F
    sInhalt = Space$(LOF(F))
    Get #F, , sInhalt
    Close #F
    
    'Leerzeichen durch Semikolon ersetzen 
    sInhalt = Replace(sInhalt, " ", ";")
    
    'TXT zurückschreiben 
    Open sFilename For Output As #F
    Print #F, sInhalt
    Close #F
End If

End Sub


Gruß Tino

Anzeige
AW: Leerzeichen durch Semikolon
20.05.2009 09:47:57
Julia
Hi Tino,
dein Makro klappt prima. Nur ein Haken. Wenn zwischen den beiden Elementen in der txt berispielsweise 10 Leerzeichen sind dann macht er 10 mal ";"
Es reicht allerdings immer ein ";" egal wieviele Leerzeichen dazwischen
Geht das?
mit einer zusätzlichen Schleife.
20.05.2009 09:58:22
Tino
Hallo,
habe noch eine Schleife eingebaut, diese musst Du an die Maximale anzahl an Semikolons (bzw. Leerzeichen) anpassen.
Ich bin mal von 10 ausgegangen.
Sub TXT_Bearbeiten()
Dim sInhalt As String, sFilename As String
Dim F As Integer
Dim i As Integer
sFilename = Application.GetOpenFilename("Text File (*.txt),*.txt")

If sFilename <> CStr(False) Then
    'TXT einlesen 
    F = FreeFile
    Open sFilename For Binary As #F
    sInhalt = Space$(LOF(F))
    Get #F, , sInhalt
    Close #F
    
    'Leerzeichen durch Semikolon ersetzen 
    sInhalt = Replace(sInhalt, " ", ";")
    
    'hier die max Anzahl Semikolons angeben die vorkommen könnten 
    'hier bin ich mal von 10 ausgegangen 
    For i = 10 To 2 Step -1
     sInhalt = Replace(sInhalt, String(i, ";"), ";")
    Next i
    
    
    'TXT zurückschreiben 
    Open sFilename For Output As #F
    Print #F, sInhalt
    Close #F
End If

End Sub


Gruß Tino

Anzeige
AW: mit einer zusätzlichen Schleife.
20.05.2009 10:03:45
Julia
Klappt alles perfekt. Vielen Dank
Das einzige was jetzt fehlt ist der Zeilenumbruch. Beim "Externe Daten importieren" Assitent in Excel stell ich Semikolon als Trennzeichen ein. Er importiert dann alles bis 256 Spalten. Weil er wieder alles versucht in eine Zeile zu importieren.
Immer wenn der String "22001Nachname" kommt soll eine neue Zeile angefangen werden.
Hast du da noch eine Idee? Dann klappt alles ;)
AW: mit einer zusätzlichen Schleife.
20.05.2009 10:10:00
Tino
Hallo,
dies wird über den Asi nicht mehr gehen.
Du müsstest den Text aus der TXT in einem String speichern und danach zerlegen und entsprechend in die Zellen schreiben.
Dazu bräuchte ich aber mal eine Beispieldatei mit der ich etwas spielen kann.
Gruß Tino
Anzeige
AW: mit einer zusätzlichen Schleife.
20.05.2009 10:37:42
Julia
Hier die Test.txt
https://www.herber.de/bbs/user/61936.txt
Immer bei "223432Nachname" soll eine neue Zeile genommen werden
Vielleicht hast du ja eine Idee das komplett anders zu lösen
noch eine Frage
20.05.2009 10:49:55
Tino
Hallo,
, bleibt die Nummer 223432 oder der Text Nachname immer gleich?
Gruß Tino
AW: noch eine Frage
20.05.2009 10:52:20
Julia
Die 223432 bleibt gleich
Aus datenschutzrechtlichen Gründen hab ich Nachname geschriben
In der Datei ist ews dann z.B.:
223432Mustermann oder 223432Müller usw.
Optimal wärs wenn mich Excel fragen würde wie die Trenn ID lautet ;)
Aber man kann eigentlich von der 223432 ausgehen
Anzeige
versuche es mal hiermit...
20.05.2009 11:28:03
Tino
Hallo,
nicht einfach zu verstehen bei VBA nein, teste mal ob es so funktioniert.
Habe dies nur an einem einfachen Beispiel getestet.
Option Explicit
Private Function CheckString(strString As String, strNummer As String) As String
Dim objRegExp As Object, objMatch As Object
Dim i As Integer
Set objRegExp = CreateObject("vbscript.regexp")
    
    With objRegExp
        .Global = True
        .Pattern = strNummer & "[a-z]{1,25}"
        .IgnoreCase = True
        Set objMatch = .Execute(strString)
    End With

If objMatch.Count > 0 Then
        CheckString = objMatch(0).Value
End If
    
    
    Set objRegExp = Nothing
End Function

Sub TXT_Bearbeiten()
Dim sInhalt As String, sFilename As String
Dim F As Integer
Dim MyAr1, myAr2, myAr3
Dim A As Long, B As Long, Erste As Long
Dim i As Integer
Dim strNummer As String

'hier erste Zeile angeben wo eingefügt werden soll 
'1 = ab A1; 2 = ab A2 usw. 
Erste = 1

sFilename = Application.GetOpenFilename("Text File (*.txt),*.txt")
strNummer = Application.InputBox("Trennzeichen Nummer?", "Nummer angeben", "223432", , , , , 1)

If sFilename <> CStr(False) Then
    'TXT einlesen 
    F = FreeFile
    Open sFilename For Binary As #F
    sInhalt = Space$(LOF(F))
    Get #F, , sInhalt
    Close #F
    
    'Leerzeichen durch Semikolon ersetzen 
    sInhalt = Replace(sInhalt, " ", ";")
    
    'hier die max Anzahl Semikolons angeben die vorkommen könnten 
    'hier bin ich mal von 10 ausgegangen 
    For i = 10 To 2 Step -1
     sInhalt = Replace(sInhalt, String(i, ";"), ";")
    Next i

    MyAr1 = Split(sInhalt, vbCr)
        
        With Application
         .ScreenUpdating = False
         .EnableEvents = False
          
            ActiveSheet.UsedRange.Value = "" 'Tabelle für neue Daten leer machen 
          
            For A = Lbound(MyAr1) To Ubound(MyAr1)
                sInhalt = CheckString(CStr(MyAr1(A)), strNummer)
                sInhalt = Replace(MyAr1(A), sInhalt, "<|>" & sInhalt)
                
                myAr2 = Split(sInhalt, "<|>")
              
              For B = Lbound(myAr2) To Ubound(myAr2)
               If .WorksheetFunction.Clean(myAr2(B)) <> "" Then
                 myAr3 = Split(.WorksheetFunction.Clean(myAr2(B)), ";")
                    If Ubound(myAr3) >= 0 Then
                     'Daten in Zellen schreiben 
                     Cells(Erste, 1).Resize(, Ubound(myAr3) + 1) = myAr3
                    End If
                 Erste = Erste + 1 'nächste Zelle 
                End If
              Next B
            
            Next A
         
         .ScreenUpdating = True
         .EnableEvents = True
        End With

End If

End Sub


Gruß Tino

Anzeige
besser ist es ...
20.05.2009 11:48:28
Tino
Hallo,
die Inputbox erst nach der Prüfung ob abbrechen gedrückt wurde einbaut.
Option Explicit
Private Function CheckString(strString As String, strNummer As String) As String
Dim objRegExp As Object, objMatch As Object
Dim i As Integer
Set objRegExp = CreateObject("vbscript.regexp")
    
    With objRegExp
        .Global = True
        .Pattern = strNummer & "[a-z]{1,25}"
        .IgnoreCase = True
        Set objMatch = .Execute(strString)
    End With

If objMatch.Count > 0 Then
        CheckString = objMatch(0).Value
End If
    
    
    Set objRegExp = Nothing
End Function

Sub TXT_Bearbeiten()
Dim sInhalt As String, sFilename As String
Dim F As Integer
Dim MyAr1, myAr2, myAr3
Dim A As Long, B As Long, Erste As Long
Dim i As Integer
Dim strNummer As String

'hier erste Zeile angeben wo eingefügt werden soll 
'1 = ab A1; 2 = ab A2 usw. 
Erste = 1

sFilename = Application.GetOpenFilename("Text File (*.txt),*.txt")

If sFilename <> CStr(False) Then
  strNummer = Application.InputBox("Trennzeichen Nummer?", "Nummer angeben", "223432", , , , , 1)
    
    'TXT einlesen 
    F = FreeFile
    Open sFilename For Binary As #F
    sInhalt = Space$(LOF(F))
    Get #F, , sInhalt
    Close #F
    
    'Leerzeichen durch Semikolon ersetzen 
    sInhalt = Replace(sInhalt, " ", ";")
    
    'hier die max Anzahl Semikolons angeben die vorkommen könnten 
    'hier bin ich mal von 10 ausgegangen 
    For i = 10 To 2 Step -1
     sInhalt = Replace(sInhalt, String(i, ";"), ";")
    Next i

    MyAr1 = Split(sInhalt, vbCr)
        
        With Application
         .ScreenUpdating = False
         .EnableEvents = False
          
            ActiveSheet.UsedRange.Value = "" 'Tabelle für neue Daten leer machen 
          
            For A = Lbound(MyAr1) To Ubound(MyAr1)
                sInhalt = CheckString(CStr(MyAr1(A)), strNummer)
                sInhalt = Replace(MyAr1(A), sInhalt, "<|>" & sInhalt)
                
                myAr2 = Split(sInhalt, "<|>")
              
              For B = Lbound(myAr2) To Ubound(myAr2)
               If .WorksheetFunction.Clean(myAr2(B)) <> "" Then
                 myAr3 = Split(.WorksheetFunction.Clean(myAr2(B)), ";")
                    If Ubound(myAr3) >= 0 Then
                     'Daten in Zellen schreiben 
                     Cells(Erste, 1).Resize(, Ubound(myAr3) + 1) = myAr3
                    End If
                 Erste = Erste + 1 'nächste Zelle 
                End If
              Next B
            
            Next A
         
         .ScreenUpdating = True
         .EnableEvents = True
        End With

End If

End Sub


Gruß Tino

Anzeige
AW: besser ist es ...
20.05.2009 11:56:27
Julia
Klappt prima
Habe dann die Originaltxt genommen
Dort kommt Debugger an folgender Stelle:
Cells(Erste, 1).Resize(, UBound(myAr3) + 1) = myAr3
Er importiert mir die ersten 5 Einztäge aber
Müssten aber um die 70 sein
In der Original txt sind auch mehrere Zeilen im Gegensatz zu meiner Beispiel txt
d.h. die Infos ist über mehrere Zeilen verteilt
Hat es damit was zu tun?
AW: besser ist es ...
20.05.2009 11:58:41
Julia
Hab nochmal die Original txt analysiert
Also dort sind in der ersten Zeile auch mehr als 5 Datensätze
Ist es vielleicht im COde irgendwie numerisch beschränkt?
AW: besser ist es ...
20.05.2009 13:10:14
Tino
Hallo,
daher wäre eine Beispieldatei die Deinem Original sehr nahe kommt besser gewesen, so kann ich immer nur raten wie diese aufgebaut ist.
Teste mal.
Sub TXT_Bearbeiten()
Dim sInhalt As String, sFilename As String
Dim F As Integer
Dim MyAr1, myAr2, myAr3
Dim A As Long, B As Long, C As Long, Erste As Long
Dim i As Integer
Dim strNummer As String
Dim objRegExp As Object, objMatch As Object


'hier erste Zeile angeben wo eingefügt werden soll 
'1 = ab A1; 2 = ab A2 usw. 
Erste = 1

sFilename = Application.GetOpenFilename("Text File (*.txt),*.txt")

If sFilename <> CStr(False) Then
  strNummer = Application.InputBox("Trennzeichen Nummer?", "Nummer angeben", "223432", , , , , 1)
    
    'TXT einlesen 
    F = FreeFile
    Open sFilename For Binary As #F
    sInhalt = Space$(LOF(F))
    Get #F, , sInhalt
    Close #F
    
    'Leerzeichen durch Semikolon ersetzen 
    sInhalt = Replace(sInhalt, " ", ";")
    
    'hier die max Anzahl Semikolons angeben die vorkommen könnten 
    'hier bin ich mal von 10 ausgegangen 
    For i = 10 To 2 Step -1
     sInhalt = Replace(sInhalt, String(i, ";"), ";")
    Next i

    MyAr1 = Split(sInhalt, vbCr)
        
    With Application
     .ScreenUpdating = False
     .EnableEvents = False
          

        Set objRegExp = CreateObject("vbscript.regexp")
        
        ActiveSheet.UsedRange.Value = ""
            
            For B = Lbound(MyAr1) To Ubound(MyAr1)
                   With objRegExp
                       .Global = True
                       .Pattern = strNummer & "[a-z]{1,25}"
                       .IgnoreCase = True
                       Set objMatch = .Execute(CStr(MyAr1(B)))
                   End With
           
                   For A = 0 To objMatch.Count - 1
                       MyAr1(B) = Replace(MyAr1(B), objMatch(A).Value, "<|>" & objMatch(A).Value)
                   Next A
                    
                        myAr2 = Split(MyAr1(B), "<|>")
                        
                        For C = Lbound(myAr2) To Ubound(myAr2)
                            myAr3 = Split(myAr2(C), ";")
                            
                            If Ubound(myAr3) > 0 Then
                             Cells(Erste, 1).Resize(, Ubound(myAr3)) = myAr3
                             Erste = Erste + 1
                            End If
                        
                        Next C
     
                    
            Next B
     
     .ScreenUpdating = True
     .EnableEvents = True
    End With

End If

Set objRegExp = Nothing
End Sub


Gruß Tino

Anzeige
Vielen Vielen Dank, klappt 1 A
20.05.2009 13:32:32
Julia
Vielen Vielen Dank, klappt 1 A!!!!

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige