Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1048to1052
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

CSV Import - alle Spalten als String deklarieren

CSV Import - alle Spalten als String deklarieren
17.02.2009 17:12:00
markus
Hallo Forum,
ich möchte mit folgenden VBA-Befehl

Workbooks.OpenText Filename:=pfad, Origin:=xlWindows, StartRow:=1, DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=True,  Comma:=False, Space:=False, Other:=False, OtherChar:=False, _
local:=True


eine CSV Datei als neues Workbook öffnen. Das klappt soweit auch ganz gut. Die Variable "pfad" ist bereits im Vorfeld korrekt belegt worden.
Vorweg etwas zur Struktur der CSV-Datei. Es ist ein Export aus einer riesigen Datenbank.
Am Ende sind es 10.000 Zeilen und 170 Spalten. Beim Export hätte ich die Wahl zwischen .TXT oder .CSV als Ausgabeformat. Auch das Trennzeichen und ob jede Zelle extra mit Hochkommas umschlossen werden soll, kann ich bestimmen. Ich habe mich für CSV als Typ, Semikolons als Trennzeichen und Hochkommas um jede Zelle entschieden, da das fertige Tool auf verschiedenen Rechner mit engl. und deutschen Excel-Versionen eingesetzt werden muss.
Eine typische Zeile sieht also so aus:


"NFO";"1012";"OP";"FENPFUHL";"1";"-A200.22";"";"";"";"=K11+TX11.2"


Der Import dieser Beispielzeile mit dem oben genannten Befehl würde ganz gut klappen. Jedoch interpretiert Excel die letzte Zelle in meinem Beispiel als eine Formel und möchte diese auflösen. Es handelt sich in Wirklichkeit aber nicht um eine Formel, sondern um einen kryptischen Namen. Er soll es also garnicht auflösen.
Hier das Ergebnis:


NFO     1012      OP    FENPFUHL    1    -A200.22                          #NAME?


Soweit so gut. Also benutzte ich bei meinem Öffnen-Befehl noch zusätzlich den optionalen Parameter "FieldInfo". Hier muss man in einem 2-dimensionalen Array jeder Spalte zuordnen, ob es ein String oder was anderes ist. Bei meinen 170 Spalten sieht das dann so aus:


Workbooks.OpenText Filename:=textdatei_pfad, Origin:=xlWindows, StartRow:=1, _
DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, _
Tab:=False, Semicolon:=True, Comma:=False, Space:=False, Other:=False, _
OtherChar:=";", FieldInfo:=Array(Array(1, 2), Array(2, 2), Array(3, 2),  _
Array(4, 2),Array(5, 2), Array(6, 2),  Array(7, 2), Array(8, 2), Array(9, 2),  _
Array(10, 2), Array(11, 2), Array(12, 2), Array(13, 2), Array(14, 2), _
Array(15, 2), Array(16, 2), Array(17, 2), Array(18, 2), Array(19, 2), _
Array(20, 2), Array(21, 2), Array(22, 2), Array(23, 2), Array(24, 2),  _
Array(25, 2), Array(26, 2), Array(27, 2), Array(28, 2), Array(29, 2), _
Array(30, 2), Array(31, 2), Array(32, 2), Array(33, 2), Array(34, 2), _
Array(35, 2), Array(36, 2), Array(37, 2), Array(38, 2), Array(39, 2), _
Array(40, 2), Array(41, 2), Array(42, 2), Array(43, 2), Array(44, 2), _
Array(45, 2), Array(46, 2), Array(47, 2), Array(48, 2), Array(49, 2), _
Array(50, 2), Array(51, 2), Array(52, 2), Array(53, 2), Array(54, 2), _
Array(55, 2), Array(56, 2), Array(57, 2), Array(58, 2), Array(59, 2), _
Array(60, 2), Array(61, 2), Array(62, 2), Array(63, 2), Array(64, 2), _
Array(65, 2), Array(66, 2), Array(67, 2), Array(68, 2), Array(69, 2), _
Array(70, 2), Array(71, 2), Array(72, 2), Array(73, 2), Array(74, 2), _
Array(75, 2), Array(76, 2), Array(77, 2), Array(78, 2), Array(79, 2), _
Array(80, 2)), TrailingMinusNumbers:=True


Wie ihr seht, ist das ein wahnsinnig langer Befehl. Und Excel läßt scheinbar nur eine bestimmte Anzahl an Zeichen pro Befehl zu (selbst dieses Forum ist kein Freund von langen Befehlen :P). Nun habe ich aber manchmal über 170 Spalten, welche alle deklariert werden müssen. Ich frage mich nun, ob es nicht eine Möglichkeit gibt, diesen Parameter "Fieldinfo" etwas zu verkürzen. Es sind ja eh immer Strings. Ihm quasi als Standart vorzugeben, dass er jede Spalte als String importieren soll.
Einen Import-Befehl, welcher alle Zellen als String importiert, egal ob es ein "=" am Anfang hat, wäre also meine ideale Lösung.
Ein weiterer Lösungsansatz wäre folgender:
Ich importiere alles wie gehabt und belasse den Fehler erstmal so.
Danach suche ich in der Kopfspalte die Spalten, in denen diese Fehler auftreten können.
Es sind nämlich nur 3 ganz bestimmte Spalten, von denen ich die Namen kenne. Aber nicht deren Position. Also ich weiß nicht, ob es die 150te Spalte oder 171te Spalte ist. (Das ist auch der Grund, warum im ersten Ansatz stets alle 255 Spalten als String deklariert werden müssten.)
Ich finde also per Find-Befehl diese Spalten und möchte nun möglichst elegant die komplette Spalte (mit 10.000 Zeilen!) so darstellen, dass der Formelinhalt direkt lesbar ist.
Der geneigte Excel User würde nun antworten:
"Haja dann mach doch einfach 'n einfaches Anführungszeichen vors Ist-Gleich. Oder aktiviere die Formelansicht." Beides leider keine akzeptablen Lösungen.
Auch der Ansatz jede Zelle einzeln per "FormulaLocal" umzuwandeln würde bei so vielen Zellen zuviel Zeit in Anspruch nehmen. (vermute ich stark - ist nicht getestet).
Wie zeige ich also in einer ganzen Spalte die Formeln an?
Das ganze Problem beschäftigt mich nun schon seit Tagen. Stundenlange Google-Suche brachte mich so zum Verzweifeln, dass ich nun diesen ellenlangen Text hier verfasse und all meine Hoffnung auf euch setze. Wenn jemand einen Lösungsansatz hat, würde ich mich über eine etwas ausführlichere Beschreibung freuen, denn meine VBA-Kenntnisse sind "überschaubar" :)

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: CSV Import - alle Spalten als String deklarieren
17.02.2009 18:02:00
Daniel
HI
wenn du jede Spalte gleich formatieren willst, kannst du ja als Array eine Variable verwenden und diese schon vorher füllen.
Da die Variabele auch mehr Felder haben kann als Spalten vorkommen, gibt kein problem:

Sub Makro2()
Dim i As Long '
Dim Spaltenformat(255)
For i = 0 To 255
Spaltenformat(i) = 2
Next
Range("H28").Select
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;C:\Dokumente und Einstellungen\Slowboarder\Eigene Dateien\49791.txt", _
Destination:=Range("c3"))
.Name = "49791"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 850
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = True
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Spaltenformat
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
End Sub


Gruß, Daniel

Anzeige
AW: CSV Import - alle Spalten als String deklarieren
18.02.2009 00:16:00
markus
Hallo Daniel,
deine Lösung über QueryTables funktioniert einwandfrei :)
Ich bedanke mich und kann nun in Ruhe weiterarbeiten.
Eine kleine Änderung musste ich aber erst noch rausfinden.
Die Zeile

.TextFilePlatform = 850


musste ich ausklammern bzw. löschen.
Da er sonst alle Umlaute nicht erkannt hat.
Ohne die Zeile importiert er auch Ä,Ö und Ü korrekt.
zwei kleine Bitten habe ich allerdings noch.
1) Könntest du mir eine Seite linken, auf der ich mich über die ganzen Parameter informieren kann, welche du oben benutzt hast? Die meißten sind selbsterklärend, aber die F1 Hilfe bringt mich bei den mir unbekannten Stellen nicht weiter. Zum Beispiel würde ich gerne wissen was die Werte für ANSI und UTF-8 sind, welche ich dann dort eingetragen hätte.
Aber es sind noch mehr Sachen die ich fragen müsste. Deshalb hoffe ich auf einen kleinen Link, damit ich mich selbst informieren kann.
Wenn es dir nicht zuviel Mühe macht wäre ich über einen direkten Link sehr dankbar.
2) Excel merkt sich ja diese Abfrage. Kann man diese Abfrage nach erfolgreichen Import wieder löschen ohne die importierten Daten zu berühren? Wenn ja, wie?
Vielen Dank nochmal für die Lösung von oben :)

Anzeige
AW: CSV Import - alle Spalten als String deklarieren
18.02.2009 01:01:00
Daniel
HI
zu 1)
sorry, dazu hab ich keinen Link
solche Funktionen erstelle ich normalerweise mit dem Recorder und verändere nur dann gezielt einzelne Parameter falls erforderlich
zu 2)
konkret weiß ich da auch nichts, vielleicht mal mit KOPIEREN - INHALTE EINFÜGEN - WERTE probieren.
das klappt zumindest auch bei Pivot-Tabellen
Gruß, Daniel

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige