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:
Bei einer älteren Excel-Version mußt Du die Split-Funktion selbst definieren:
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 ..
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
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:
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
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