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" :)