Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
904to908
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
904to908
904to908
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Import TXT

Import TXT
15.09.2007 07:46:28
Roger
Hallo Zusammen,
es geht wieder einmal um den Import von einer txt (csv) Datei. Mit Hilfe des Archivs und dem Internet habe ich nun folgendes Makro zusammen kopiert.

Sub TextImport()
Dim iRow As Integer, iCol As Integer
Dim sFile As String, sTxt As String
Dim varRetVal As Variant, strFileName As String
ChDrive ThisWorkbook.Path
ChDir ThisWorkbook.Path
varRetVal = Application.GetOpenFilename( _
FileFilter:="Text-Dateien (*.csv), *.csv", _
Title:="Daten aus Text-Datei importieren")
If varRetVal = False Then Exit Sub
sFile = varRetVal
If Dir(sFile) = "" Then
Beep
MsgBox "Datei wurde nicht gefunden!"
Exit Sub
End If
iRow = 1
iCol = 1
Close
Open sFile For Input As #1
Do Until EOF(1)
Line Input #1, sTxt
Do While InStr(sTxt, ";")
Cells(iRow, iCol).Value = Left(sTxt, InStr(sTxt, ";") - 1)
sTxt = Right(sTxt, Len(sTxt) - InStr(sTxt, ";"))
iCol = iCol + 1
Loop
Cells(iRow, iCol).Value = sTxt
iRow = iRow + 1
iCol = 1
Loop
Close
End Sub


Es funktioniert perfekt, aber trotzdem habe ich noch ein paar Fragen dazu.
Ist es möglich irgendwie zu sagen das es nur die Zeilen importiert die in der ersten "Spalte" eine Zahl haben und kann ich den import auf die ersten 3 "Spalten" begrenzen?
Meine Lösung wäre alles zu importieren und dann im Excel die unnötigen Spalten und Zeilen zu entfernen.
Aber kann man das nicht auch schon beim Import machen?
Ein anderes Problem was ich in diesem Zuammenhang noch habe ist, dass ich in der Vorlagendatei die erste Spalte von 0 bis 1000 durchnummeriert habe. Die Txt - Datei enthält in der ersten "Spalte" zwar Zahlen, aber es kann vorkommen das diese nicht ganz durchgehend sind, also 1,2,3,5,6,9,11.
Ist es möglich beim Import das gleiche Ziel wie bei einem Sverweis zu erreichen?
Also das quasi die Vorlagendatei mit den Daten des imports nur dort aufgefüllt werden, wo es informationen hat.
Würde micht freuen wenn jemand eine Idee hat.
Besten Dank im voraus.
Gruss Roger

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Import TXT
15.09.2007 13:57:06
Daniel
Hallo
also auf alle deine Fragen fällt mir jetzt auch keine Lösung ein aber:
aber um den Import auf die ersten 3 Spalten und nur die Zeilen, die in der ersten Spalte eine Zahl beinhalten zu beschränken, könntest du das Makro folgendermassen abändern (achtung, nicht getestet):

Sub TextImport()
Dim iRow As Integer, iCol As Integer
Dim sFile As String, sTxt As String
Dim varRetVal As Variant, strFileName As String
 Dim Text() as string
ChDrive ThisWorkbook.Path
ChDir ThisWorkbook.Path
varRetVal = Application.GetOpenFilename( _
FileFilter:="Text-Dateien (*.csv), *.csv", _
Title:="Daten aus Text-Datei importieren")
If varRetVal = False Then Exit Sub
sFile = varRetVal
If Dir(sFile) = "" Then
Beep
MsgBox "Datei wurde nicht gefunden!"
Exit Sub
End If
iRow = 1
iCol = 1
Close
Open sFile For Input As #1
Do Until EOF(1)
Line Input #1, sTxt
Text = Split(sTxt, ";")
If IsNumeric(Text, 0) Then
For icol = 1 To 3
Cells(irow, icol) = Text(icol - 1)
Next
End If
iRow = iRow + 1
Loop
Close
End Sub


zum Rest fällt mir leider auch nichts ein, daher lass ich die Frage offen.
Gruß, Daniel

Anzeige
AW: Import TXT
15.09.2007 14:20:57
Roger
Hallo Daniel,
danke für Deinen Vorschlag.
Wenn ich aber Dein Makro verwende kommt die Fehlermeldung:
"Falsche Anzahl an Argumenten oder ungültige Zuweisung zu einer Eigenschaft"
Dabei wird auch der Befehl "IsNumeric" eingefärbt.
In der Hilfe bekommt der Fehler noch eine Nummer "450"
Nun stehe ich vor einem neuen Problem :O)
Hast Du noch eine Idee dazu?

AW: Import TXT
15.09.2007 15:15:30
Daniel
Hi
kleiner Tippfehler von mir, ändere die Zeile mal so um:
if IsNumeric(text(0)) then
Gruß, Daniel

AW: Import TXT
15.09.2007 15:37:50
Roger
Hallo Daniel,
Nun funktioniert es!!
Jedoch kommt ein Laufzeitfehler 9, weil die Txt - Datei die ich importieren möchte am Anfang in der Mitte und am Ende Text hat in der ersten Spalte.
Lösche ich diesen klappt es wunderbar.
Kann man den Code noch erweitern, dass das Makro sobald es in der ersten Spalte ein Text steht, die Spalte auslässt und gleich zu nächsten springt?
Wenn das gehen würde wäre es Perfekt!!
Hast Du eine Idee?

Anzeige
AW: Import TXT
15.09.2007 15:58:00
Daniel
Hi
der Laufzeitfehler könnte daher kommen, daß an dieser Stelle deine Importzeile weniger als 3 Spalten hat,
änder mal die FOR - Schleife so ab:

For icol = 1 To worksheetfunction.min(3, ubound(text)+1)


eigentlich sollte die Zeile nur dann importiert werden, wenn der erste Teil eine Zahl ist.
um das zu prüfen, müsstest du den Import mal im Einzelstep-Modus durchtesten und dir genau anschauen, wie die einzlnen Variablen genau aussehen
außderdem ist noch ein kleiner Fehler drin, das irow = irow + 1 muss innerhalb des IF-Bereichs stehen (also vor End If), sonst kommt in dem Fall, daß die Zelle nicht importiert wird, an der Stelle ne Leerzeile rein.
Gruß, Daniel

Anzeige
AW: Import TXT
15.09.2007 16:36:00
Roger
Du hast natürlich recht!
Das Makro hat ein Probleme wenn in der zu importierenden Datei eine leere Linie vorhanden ist.
Ich habe es schritt für schritt duchlaufen lassen, bis die Fehlermeldung gekommen ist. Danach habe ich die leeren Zeilen gelöscht.
Nun geht es einwandfrei.
Das heisst man müsste dem Makro sagen:
Ist Text oder gar nichts vorhanden spring weiter bis zu der nächsten Zeile.
Aber mit Text or "" geht es nicht.
Aus meinem Makro wird Daniels Makro :O)
Gibt es auch hier für noch einen Trick?

AW: Import TXT
15.09.2007 17:03:56
Daniel
Hi
wenn komplett leer Linien vorkommen können, müsste man es damit abfangen:

Line Input #1, sTxt
if sTxt  "" then
Text = Split(sTxt, ";"


und natürlich das End IF an der entsprechenden Stelle nicht vergessen.
Gruß, Daniel

Anzeige
Inteligenter Import
15.09.2007 17:21:00
Roger
Hallo Daniel,
ich möchte mich bei Dir bedanken.
Mit Deiner hilfe habe ich nun ein tolles Makro das einwandfrei funktioniert.
Nun bleibt nur noch eine Frage offen:
Wenn ich eine Tabelle habe die in der ersten Spalte von 1 bis 1000 nummeriert ist, kann ich dann die Textdatei so importieren, dass die Information die in der Textdatei zum Beispiel hinter der Zahl 5 steht auch gleich in der 5 Zeile der Tabelle angehängt wird?
Also gleichem zu gleichem quasi.
Wenn hier nun auch noch jemand eine Idee hat dann wäre das Super.

AW: Inteligenter Import
15.09.2007 17:35:58
Daniel
Hi
wenns sauber durchnummeriert ist, kannst du ja einfach den den Inhalt der ersten Spalte als Zeilen-Nr. vewenden, dh.
irow = CDbl(text(0))
ggf kannst du ja noch den festen Wert für den Versatz durch Überschriften oder so dazuaddieren.
sollte es nicht sortiert sein, müsstest du über
irow = Range("A:A").find(what=text(0), lookat:=xlwhole).row
oder
irow = worksheetfunction.match(text(0), Range("A:A"), 0)
die entsprechende Zeilen-Nr. herausfinden.
in dieser einfachen Funktion müssen die Werte aber vorhanden sein, sonst gibts ne Fehlermeldung und du müsstest erst prüfen, ob der Wert in der Liste überhaupt vorhanden ist und klären, was in diesem Fall passieren soll.
diese Prüfung könntest du mit Worksheetfunction.Countif(Range("A:A"), Text(0)) erledigen, diese Funktion entspricht dem ZählenWenn in Excel.
Ist der Wert nicht vorhanden, gibts als Ergebnis 0, aber keinen Fehler , so wie bei .FIND oder Worksheetfunction.Match
Gruß, Daniel

Anzeige
AW: Inteligenter Import
15.09.2007 18:00:00
Roger
Hallo Daniel ;O)
ich habe nun also das ganze mit dem sverweis probiert und das geht nicht.
Also kam ich zu dem Schluss dass es anders angegangen werden muss.
Wenn ich in der Tabelle eine fortlaufende Nummerierung habe von 1 bis 1000 könnte man das ja auf eine andere Variante lösen. Das Makro fängt an zu vergleichen.
Angefangen bei der Zahl 1, schaut es ob in der Txt - Datei Informationen vorhanden sind, wenn ja schreibt es die dahinter, wenn nicht geht es weiter zu der Zahl 2 bis es am Ende ankommt.
Hast Du das etwa gemeint? Wenn ja konnte ich das irow = CDbl(text(0))
nicht richtig interpretieren.

Anzeige
AW: Inteligenter Import
15.09.2007 18:25:49
Daniel
Hi
mir ist nicht so ganz klar, was wie wo hin soll und welche Zahlen wo stehen, da müssteset du mal beide Dateien hochladen
CDbl wandelt einen aus Ziffern bestehenden Text in eine Zahl um, mit der Excel auch rechnen kann.
also
CDbl("12") ist 12
da irow per Definiton eine Zahl ist, kannst du ihr nicht den Wert aus einer Textvariablen zuweisen (auch wenn der Inhahlt einer Zahl entspricht). da musst du erst mit Cdbl umwandeln.
Gruß, Daniel

AW: Inteligenter Import
15.09.2007 19:07:42
Roger
Ich bin sicher das ich Dir das so erklären kann das Du das ganze nachvollziehen kannst.
Ich habe auf der einen Seite eine Tabelle die in Excel ist. Diese ist bereits schön gestaltet und formatiert.
in der ersten Spalte (A) dieser Tabelle habe ich eine Nummerierung von momentan 1 bis 1000. es kann aber auch ein Bereich von 80 bis 2000 sein. Jedoch steht die erste Zahl immer in der Zelle A1
Aber diese Tabelle enthält auser den Zahlen noch keine Informationen.
Dazu muss ich nun die TXT - Datei einlesen. Diese hat in der ersten "Spalte" ebenfalls Zahlen die immer im gleichen Bereich sind wie diese in der Tabelle. Diese Zahlen sind immer der Reihe nach in der TXT - Datei aufgelistet, jedoch kommt es oft vor das Zahlen fehlen. (Also 1,3,5,6,) Hier fehlt also die 2+4
Nun soll der Import so vorsich gehen. Das Makro schaut was für eine Zahl in der Zelle A1 steht und schaut ob diese in der TXT - Datei vorkommt. Wenn ja fügt es die Informationen ein die hinter dem ersten und zweiten Dezimalkomma stehen. Dann geht es weiter zu der Zelle A2. Der Vorgang wiederholt sich.
Tabelle:
1
2
3
4
5
6
Textdatei:
1;info1;info2
3;info1;info2;info3
5;info1;info2
6;info1;info2
Nach dem import in der Tabelle:
1 info1 info2
2
3 info1 info2
4
5 info1 info2
6 info1 info2

Anzeige
AW: Inteligenter Import
15.09.2007 19:48:00
Daniel
Hi
so wie du das Vorstellst, geht das nicht.
dazu müsstest du erst die ganze Datei importieren, um nachzuschauen, ob der Wert vorhanden ist, bei deiner Importmethode hast du aber immer nur eine Zeile der Importdatei im Speicher.
du müsstest also die gesamte Importfunktion umbauen.
Ist aber nicht notwendig, denn deine Nummern in der Tabelle (und entsprechend in der Import-Datei) entsprechen ja den Zeilen-Nummern von Excel, nur ggf. um einen bestimmten, festen Betrag versetzt.
Daher kannst du deinen Wunsch mit folgendem Code realisieren:

Do Until EOF(1)
Line Input #1, sTxt
if stxt  "" then
Text = Split(sTxt, ";")
If IsNumeric(Text(0)) Then
irow = 1 + cdbl(text(0)) - range("A2").value
For icol = 2 To 3
on error resume next
Cells(irow, icol) = Text(icol - 1)
on error goto 0
Next
End If
end if
Loop


gruß, Daniel

Anzeige
Delux Variante!!
15.09.2007 20:08:38
Roger
Hallo Daniel,
nun funktioniert das Makro wie eine 1.
Herzlichen Dank für Deine Geduld und Deine Zeit.
Wünsche Dir nun einen schönen Abend.
Gruss Roger

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige