Supportnet Computer
Planet of Tech

Supportnet / Forum / Anwendungen(Java,C++...)

csv-Datei in Excel importieren... aber wie?





Frage

Hi, Leute! Ich habe vor, eine csv-Datei in Excel zu importieren. Allerdings sollte das nicht über die Menüs laufen (das kann ja [fast] jeder), sondern über einen Button (oder anders) mit passendem Makro. Diese Makro sollte also die besagte Datei öffnen, und deren Inhalt passend in die Tabelle reinkopieren. Da das Feldtrennzeichen ein "|" ist (also keine RICHTIGE csv-Datei), und ich nicht so der Profi in VB bin, stoße ich hier leider auf meine Grenzen... zumal die Anzahl der Datensätze AÜßERST Variabel ist. Von 50 bis 500 ist alles drin... Wie kann ich es hinbekommen: a) Die Datei zu öffnen (ich vermute mal mit "Open"...) b) Die Daten _irgendwie_ in meine Tabelle zu bekommen, so dass jeder Datensatz eine Zeile bekommt, und jedes Feld eine Spalte (allerdings, OHNE dass sich ein Menü öffnet) c) Die Datei logischerweise auch wieder zu schließen. (Wird wohl "Close" sein...) So ist die Datei im Prinzip aufgebaut: [code] Tim|21682|Stade Christian|21723|Hollern Kalle|21706|Drochtersen [/code] Ok, a und c habe ich auch schon geschafft (SO weit habe ich mich doch schon durch die Hilfe durchgehangelt), nur der zweite Teil (der knifflige) ist das echte Problem... Weil ich zuviel Zeit habe, hier nochmal der Plan: Ich habe eine csv-Datei, die von einem Programm erstellt wird. Dieses Programm soll Excel aufrufen, und das Makro starten können (simpel :P). Dadurch werden dann die "alten" Datenn in der Tabelle gelöscht und durch die neuen ersetzt. So kann ich Daten aus einem Programm exportieren, und mir in Excel angucken und/oder anderweitig auswerten. Falls jemand mal sowas gemacht hat, wäre ich froh, wenn er/sie sein/ihr Wissen mit mir teilt ^^ Danke schonmal für die (hoffentlich eintreffenden) Antworten! mfg bored

Antwort 1 von Holler

Ab Excel 2000 finktioniert das ganz einfach mit der Split-Funktion:

Dim i As Long
Dim z As String
Dim a As Variant
Dim n As Long
Open "c:\test.csv" For Input As #1
n = 0
While Not EOF(1)
 n = n + 1
 Line Input #1, z
 a = Split(z, "|")
 For i = 0 To UBound(a)
  Cells(n, i + 1) = a(i)
 Next
Wend
Close #1

Bei einer älteren Excel-Version mußt Du die Split-Funktion selbst definieren:

Function Split(z, t) As Variant
 Dim i As Long
 Dim i2 As Long
 Dim n As Long
 Dim m As Long
 i = InStr(z, t)
 n = 0
 While i > 0
  n = n + 1
  If i + 1 <= Len(z) Then
   i = InStr(i + 1, z, t)
  Else
   i = 0
  End If
 Wend
 If n = 0 Then
  ReDim a(0)
  a(0) = z
 Else
  ReDim a(n)
  i = 0
  For m = 0 To n - 1
   i2 = InStr(i + 1, z, t)
   a(m) = Mid(z, i + 1, i2 - i - 1)
   i = i2
  Next
  a(m) = Mid(z, i2 + 1)
 End If
 Split = a
End Function


Allerdings ist bei Excel anscheinend nach 256 Zellen Schluß mit der Zeile!Wenn man das nicht umgehen kann, mußt Du halt eine andere Lösung finden, z.B. in der nächsten Zeile weiterschreiben ..

Antwort 2 von bored

Danke für die Antwort!

Habe auch eine Lösung mit google gefunden. Werde die morgen mal posten :D

Antwort 3 von bored

Wie versprochen für alle, die es interessiert:


Sub Auto_Open()

    Application.DisplayStatusBar = True
´DDE-Anfrage an das Programm, um den Speicherpfad zu ermitteln
    Localdir = funktion.Getlocal

´Leeren der Zellen, bevor die Datei importiert wird
´so erscheint keine Meldung bei der Trennung der Zellen
        indexnr = funktion.create_index("Übersicht")
        Worksheets(indexnr).Activate
        Worksheets(indexnr).Range("A7:B65535").Delete

´Einlesen und Ausgeben der Quelldatei
        Dim Text1 As String
        Dim txtlines As Long, i As Long, n As Long
        Dim tWkb As Workbook, tWks As String
        Dim textArr As Variant
        Dim ReadFile As String
        Dim OldStatusbar

        On Error GoTo Ende
´Ist die Datei nicht vorhanden, wird das Makro beendet
        ReadFile = Localdir + "\quelle.txt"
        Frei = FreeFile
        Open ReadFile For Input As #Frei
        txtlines = 0
        Do While Not EOF(Frei)
            Line Input #Frei, Text1
            txtlines = txtlines + 1
        Loop
        Close #1

        Open ReadFile For Input As #Frei
        ReDim textArr(txtlines)
        For i = 0 To txtlines - 1
            Line Input #Frei, textArr(i)
        Next i
        Close #Frei

        Set tWkb = ActiveWorkbook
        n = 1
        For i = 1 To txtlines
            Application.StatusBar = "Datensatz " & i & " von " & txtlines & " wird eingelesen"
            tWks = ActiveSheet.Name
            tWkb.Worksheets(tWks).Cells(n + 6, 1) = textArr(i)
            n = n + 1
        Next i

        Worksheets("Übersicht").Columns("A").Replace What:="|", Replacement:=";"

        Application.StatusBar = "Datentrennung wird vorgenommen"
        Range("A7:A65535").Select
        Selection.TextToColumns Destination:=Range("A7"), Semicolon:=True
        Range("A1").Select
        Application.DisplayStatusBar = OldStatusbar
    
´Aktualisieren der einzelnen Tabellen
        Call funktion.actual_sort(3, "interner Tabellenname")
    
´ Kopieren der Excel-Datei ins Verzeichnis
        Ziel = Localdir + "\Module.xls"
        
        On Error GoTo Speichern
        Dim fs, f, s
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set f = fs.GetFile(Ziel)
        f.Delete
Speichern:
        ThisWorkbook.SaveAs (Ziel)
    
Ende:
    End If

End Sub


Ist noch ein wenig unnützer (?) Kram drin, der jetzt nicht zur Fragestellung direkt passt, aber ich war zu faul, das Ding noch ne halbe Stunde zu überarbeiten! XD

MfG bored

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: