Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

csv import mit vba

14 views
Skip to first unread message

Thom

unread,
Mar 21, 2010, 2:57:51 PM3/21/10
to
Hallo Liebe NG

Ich hab da mal ne Frage. Ich habe ne CSV Datei, dort sind die zu
importierenden Felder mit ; getrennt. Nun kann es sein, dass ein Datenwert
zwischen den ; ein , enthält.

Beispiel

Name;Datum;Heinz, Kasper;Strasse;;;;;

mit folgendem Script importiere ich die CSV Datei in ein anderes Excel File.
Das funktioniert soweit problemlos. Solange nirgends ein Komma in einem
Datenfeld ist. So wie bei "Heinz, Kasper". Dort stoppt das Scripft und ich
werde ich gefragt ob ich den Datensatz überscheiben soll. Muss also manuell
intervenieren.

Hat jemand einen Tipp. Ich hoffe ich hab mich einigermassen verständlich
ausgedrückt...

Danke und Gruss Thom

Script :

Sub imp_resdaten_n()
' löschen der Daten im Arbeitsblatt Cockpit_news

Dim TargetFilname As String
TargetFilename = ActiveWorkbook.Name

Sheets("Cockpit_news").Select
Range("A2:O2000").Select
Selection.ClearContents
Range("A1").Select
Sheets("Menu").Select

' Importiert die Daten aus resdaten_n_JJJJMMTT.csv
Sheets("Cockpit_news").Select
Range("a2").Select
Workbooks.OpenText ActiveWorkbook.Path & "/resdaten_n_*.csv"
Range("A1:o2000").Select
Selection.Copy

Dim Filname As String
Filename = ActiveWorkbook.Name

Windows(TargetFilename).Activate
Range("A2").Select
ActiveSheet.Paste
Range("a2").Select

If Range("a2") <> "" Then

Range(Selection, Selection.End(xlDown)).Select
Selection.TextToColumns Destination:=Range("A2"), DataType:=xlDelimited,
_
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False,
Tab:=False, _
Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo
_
:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5,
1), Array(6, 1), _
Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1),
Array(12, 1), Array(13, 1 _
), Array(14, 1), Array(15, 1)), TrailingMinusNumbers:=True

Columns("L:L").Select
Selection.NumberFormat = "0000"
Range("A2").Select

Else
End If

Sheets("Menu").Select
Range("b1").Select
Selection.Copy
ActiveCell.PasteSpecial

Windows(Filename).Activate
ActiveWindow.Close

Windows(TargetFilename).Activate
Sheets("Menu").Select

End Sub


Hubert Scheidgen

unread,
Mar 21, 2010, 6:53:25 PM3/21/10
to
Thom schrieb

> Ich hab da mal ne Frage. Ich habe ne CSV Datei, dort sind die zu importierenden Felder mit ; getrennt. Nun kann es sein, dass ein
> Datenwert zwischen den ; ein , enth�lt.
>


Hallo Thom,

ich hab mal das hier gemacht:

Workbooks.OpenText FileName:=sFile _
, Origin:=xlWindows, StartRow:=1, DataType:=xlDelimited, TextQualifier _
:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:= _
False, Comma:=False, Space:=False, Other:=FalseWenn Du hier Tab auf false und Semicolon auf true setzt,geht es dann?M�sste dann
eigentlich das Komma ignorieren.Das ganze damalige Projekt ist
hier:http://www.scheidgen.de/Excel/wuehltisch/bestandsabwertung/bestandsabwertung-01.htmdort findest Du die Codezeile im Kontext,
wenn's Dich interessiert.Aber eigentlich m�sste Dir schon mit der einen Zeile hier oben geholfensein. Sagst Du Bescheid, ob's
geht?Gru�Huberthttp://www.scheidgen.de/excel


Hubert Scheidgen

unread,
Mar 21, 2010, 6:58:32 PM3/21/10
to
Sorry, weiß auch nicht, was da passiert ist.
Hier das Ganze noch mal in lesbarer Form.
--------------------------------------------

ich hab mal das hier gemacht:

Workbooks.OpenText FileName:=sFile _
, Origin:=xlWindows, StartRow:=1, DataType:=xlDelimited, TextQualifier _
:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:= _
False, Comma:=False, Space:=False, Other:=False

Wenn Du hier Tab auf False und Semicolon auf True setzt, geht es dann?
Müsste dann eigentlich das Komma ignorieren.

dort findest Du die Codezeile im Kontext, wenn's Dich interessiert.

Aber eigentlich müsste Dir schon mit der einen Zeile hier oben
geholfen sein. Sagst Du Bescheid, ob's geht?

Gruß
Hubert
http://www.scheidgen.de/excel


Thom

unread,
Mar 22, 2010, 8:20:16 AM3/22/10
to
Hallo Hubert

Danke dir. Ich habe in meinem Scribt den Tab auf False und Semicolon bereits
auf True

Range(Selection, Selection.End(xlDown)).Select
Selection.TextToColumns Destination:=Range("A2"), DataType:=xlDelimited,
_
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False,
Tab:=False, _
Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo
_
:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5,
1), Array(6, 1), _
Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1),
Array(12, 1), Array(13, 1 _
), Array(14, 1), Array(15, 1)), TrailingMinusNumbers:=True

Gruss Thom


"Hubert Scheidgen" <hube...@scheidgen1.de> schrieb im Newsbeitrag
news:ho687r$6rj$1...@online.de...

Andreas Killer

unread,
Mar 22, 2010, 12:07:47 PM3/22/10
to
On 21 Mrz., 19:57, "Thom" <tstu...@nzzmedia.ch> wrote:

> Ich hab da mal ne Frage. Ich habe ne CSV Datei, dort sind die zu
> importierenden Felder mit ; getrennt. Nun kann es sein, dass ein Datenwert
> zwischen den ; ein , enthält.

...


> mit folgendem Script importiere ich die CSV Datei in ein anderes Excel File.
> Das funktioniert soweit problemlos. Solange nirgends ein Komma in einem
> Datenfeld ist. So wie bei "Heinz, Kasper". Dort stoppt das Scripft und ich
> werde ich gefragt ob ich den Datensatz überscheiben soll. Muss also manuell
> intervenieren.

Das bedeutet das dort in den Zellen etwqs steht. Schaun wir mal...

> Hat jemand einen Tipp. Ich hoffe ich hab mich einigermassen verständlich
> ausgedrückt...

Hast Du Dir schon mal angekuckt was zu diesem Zeitpunkt in dem
Zellbereich drin steht? Ich denke hier ist die Lösung zu suchen.

> Script :

>     Sheets("Cockpit_news").Select
>     Range("A2:O2000").Select
>     Selection.ClearContents

Sowas solltest Du nicht machen, bei den ganzen Select/Selection führt
eine Änderung schnell zu Fehlern und langsam ist es außerdem.

So geht das auch:
Sheets("Cockpit_news").Range("A2:O2000"). ClearContents

>     Workbooks.OpenText ActiveWorkbook.Path & "/resdaten_n_*.csv"
>     Range("A1:o2000").Select
>     Selection.Copy

...
>     ActiveSheet.Paste
Hier ist im Prinzip der "Übertäter", ich vermute mal das dieses Paste
schon die Daten auftrennt und in mehrere Zeilen schreibt.

>     Selection.TextToColumns Destination:=Range("A2"), DataType:=xlDelimited,

...


>         Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo

Hier ist alles korrekt gesetzt.

Könnte es sein das Du vorher irgendwo anders einmal TextToColumns mit
Comma:=True benutzt hast (ggf. auch aus der Oberfläche heraus)?

Excel speichert diese Einstellungen und verwendet sie beim nächsten
Paste automatisch. Und da liegt IMHO der Hase begraben.

Kuck mal nach was direkt nach dem Paste im Blatt steht, wenn dem so
ist wie ich vermute schaun wir weiter.
Und probier auch mal das Makro direkt nach dem Öffnen auszuführen ob
dann der Fehler auch kommt.

Andreas.

Thom

unread,
Mar 23, 2010, 11:43:20 AM3/23/10
to
Hi Andreas

"Andreas Killer" <andreas...@gmx.net> schrieb im Newsbeitrag
news:8a6367d4-2c02-4e05...@e7g2000yqf.googlegroups.com...


On 21 Mrz., 19:57, "Thom" <tstu...@nzzmedia.ch> wrote:

> Ich hab da mal ne Frage. Ich habe ne CSV Datei, dort sind die zu
> importierenden Felder mit ; getrennt. Nun kann es sein, dass ein Datenwert
> zwischen den ; ein , enthält.
...
> mit folgendem Script importiere ich die CSV Datei in ein anderes Excel
> File.
> Das funktioniert soweit problemlos. Solange nirgends ein Komma in einem
> Datenfeld ist. So wie bei "Heinz, Kasper". Dort stoppt das Scripft und ich
> werde ich gefragt ob ich den Datensatz überscheiben soll. Muss also
> manuell
> intervenieren.
Das bedeutet das dort in den Zellen etwqs steht. Schaun wir mal...

- hier liegt der Hund begraben

> Hat jemand einen Tipp. Ich hoffe ich hab mich einigermassen verständlich
> ausgedrückt...
Hast Du Dir schon mal angekuckt was zu diesem Zeitpunkt in dem
Zellbereich drin steht? Ich denke hier ist die Lösung zu suchen.

- Da ich den Range A2:O2000 lösche, kann da gar nix drin stehen. Wen nich
das Komma bei "Heinz, Kasper" enferne, so klappt es ohne porbleme.


> Script :

> Sheets("Cockpit_news").Select
> Range("A2:O2000").Select
> Selection.ClearContents
Sowas solltest Du nicht machen, bei den ganzen Select/Selection führt
eine Änderung schnell zu Fehlern und langsam ist es außerdem.

So geht das auch:
Sheets("Cockpit_news").Range("A2:O2000"). ClearContents

- Danke habs angepasst

> Workbooks.OpenText ActiveWorkbook.Path & "/resdaten_n_*.csv"
> Range("A1:o2000").Select
> Selection.Copy
...
> ActiveSheet.Paste
Hier ist im Prinzip der "Übertäter", ich vermute mal das dieses Paste
schon die Daten auftrennt und in mehrere Zeilen schreibt.

- nein tut es nicht.

> Selection.TextToColumns Destination:=Range("A2"), DataType:=xlDelimited,
...
> Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo
Hier ist alles korrekt gesetzt.

Könnte es sein das Du vorher irgendwo anders einmal TextToColumns mit
Comma:=True benutzt hast (ggf. auch aus der Oberfläche heraus)?

- nein

Excel speichert diese Einstellungen und verwendet sie beim nächsten
Paste automatisch. Und da liegt IMHO der Hase begraben.

- Ostern kommt bald

Kuck mal nach was direkt nach dem Paste im Blatt steht, wenn dem so
ist wie ich vermute schaun wir weiter.
Und probier auch mal das Makro direkt nach dem Öffnen auszuführen ob
dann der Fehler auch kommt.

- Fehler kommt auch

Andreas.

Ich hab mal das excel und die CSV Datei in ein ZIP hochgeladen. Evtl. gehts
dann besser zum probieren. Beide Dateien müssen nur im selben Verzeichnis
sein.

http://www.nzz-media.ch/TLOG/test

Dort ist es die Datei Cockpit_n.zip

Danke im Voraus und Gruss Thom


Andreas Killer

unread,
Mar 23, 2010, 1:49:50 PM3/23/10
to
Thom schrieb:

> Hier ist im Prinzip der "Übertäter", ich vermute mal das dieses Paste
> schon die Daten auftrennt und in mehrere Zeilen schreibt.
> - nein tut es nicht.

Ich konnte Dein Problem nicht nachvollziehen, aber bitte probier mal
bitte das angehängte Makro.

Andreas.

Sub imp_resdaten_n()
Dim TargetBook As Workbook, SourceBook As Workbook
Dim R As Range

'Bildschirm aus
Application.ScreenUpdating = False

'Unsere Mappe merken
Set TargetBook = ActiveWorkbook
'CSV öffnen
Workbooks.OpenText ActiveWorkbook.Path & "/resdaten_n_*.csv"
Set SourceBook = ActiveWorkbook

With TargetBook.Sheets("Cockpit_news")
'Löschen der Daten im Arbeitsblatt Cockpit_news
.UsedRange.Offset(1, 0).ClearContents
'Datenbereich im CSV ermitteln
Set R = SourceBook.ActiveSheet.UsedRange
'Datenbreich in Cockpit anpassen
With .Range("A2").Resize(R.Rows.Count)
'Daten eintragen
.Value = R.Value
'Nach CSV splitten
.TextToColumns Semicolon:=True
End With
'CSV schliessen
SourceBook.Close False
End With

'Bildschirm ein
Application.ScreenUpdating = True
End Sub

Thom

unread,
Mar 23, 2010, 4:14:16 PM3/23/10
to
Hallo Andreas

Danke dir. Es konnte auch nicht funktionieren. Die CSV Datei war ja auch
korrekt. Grins. Sorry. Hab's sie jetzt manipuliert.
Die Zweite Zeile hat ein Koma drin und gibt dann die Meldung aus. Mit deinem
Script gibt es keine Meldung, jedoch wird alles
nach dem Koma nicht importiert..

Ich hoffe jetzt ist das Test.zip besser verständlich.

Gruss Thom


"Andreas Killer" <andreas...@gmx.net> schrieb im Newsbeitrag

news:4ba8ff3a$0$6878$9b4e...@newsspool2.arcor-online.net...

Andreas Killer

unread,
Mar 24, 2010, 12:17:56 PM3/24/10
to
Thom schrieb:

> Danke dir. Es konnte auch nicht funktionieren. Die CSV Datei war ja auch
> korrekt. Grins. Sorry. Hab's sie jetzt manipuliert.

Heißt das jetzt das Problem hat sich erledigt?

Andreas.

Thom

unread,
Mar 24, 2010, 2:58:16 PM3/24/10
to

"Andreas Killer" <andreas...@gmx.net> schrieb im Newsbeitrag
news:4baa3b2f$0$6991$9b4e...@newsspool4.arcor-online.net...

Hi
Leider nein. Die Zip Datei hat jetzt die Daten die den Fehler provoziert...

Gruss Thom


Peter Schleif

unread,
Mar 24, 2010, 4:44:26 PM3/24/10
to
Thom schrieb am 24.Mrz.2010 19:58 Uhr:
>
> Leider nein. Die Zip Datei hat jetzt die Daten die den Fehler provoziert...

Wenn das Komma soviel Probleme bereitet, teile die Zeilen doch selbst am
";" auf. Der Code öffnet die CSV-Datei ohne Excel's Import-Logik und
schreibt die ge'spliteten Daten zeilenweise in "Cockpit_news". Ich habe
allerdings nicht verstanden, was Du in den folgenden Zeilen machst.

Sheets("Menu").Select
Range("b1").Select
Selection.Copy
ActiveCell.PasteSpecial

Sieht aus als würdest Du den Inhalt der Zelle [B1] auf sich selbst
kopieren. Ich habe es wie folgt ersetzt:

[B1].FormulaLocal = [B1].Value

Peter


Sub imp_resdaten_n()
Dim filename As String
Dim file As Object
Dim fso As Object
Dim item As Variant
Dim r As Range

Sheets("Cockpit_news").[A2:O2000].ClearContents
filename = Dir(ThisWorkbook.Path & "\resdaten_n_*.csv")
If filename = "" Then Exit Sub

Set fso = CreateObject("Scripting.FileSystemObject")
Set file = fso.OpenTextFile(ThisWorkbook.Path & "\" & filename,1)
Set r = Sheets("Cockpit_news").[A2]

While Not file.AtEndOfStream
For Each item In Split(file.ReadLine, ";")
r.FormulaLocal = item
Set r = r.Offset(, 1)
Next
Set r = r.EntireRow.Cells(2, 1)
Wend

r.Worksheet.[L:L].NumberFormat = "0000"
Sheets("Menu").Select
[B1].FormulaLocal = [B1].Value
End Sub

0 new messages