Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Textdatei einlesen
Das
Hallo Excelfreunde,
per Aufzeichnung habe ich ein Makro für das Einlesen einer Textdatei erstellt. Da es dort Felder gibt, die Ziffern enthalten können, aber Textformat sein müssen, möchte ich diese über FieldInfo als Text formatieren.
Das ergab folgenden Code:
Sub Einlesen()
Workbooks.OpenText Filename:="G:\KPV\KPV_Export_Einzelfelder.txt", Origin:= _
xlWindows, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=True, _
Comma:=False, Space:=False, Other:=False, 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,  _
1), _
Array(9, 2), Array(10, 2), Array(11, 2), Array(12, 4), Array(13, 4), 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, 1), Array(23, 1), Array(24, 1), Array(25, 4), Array(26, 1), Array(27, 1),  _
Array( _
28, 4), Array(29, 1), Array(30, 1), Array(31, 1), Array(32, 4), Array(33, 4), Array(34,  _
1), _
Array(35, 1), Array(36, 2), Array(37, 2), Array(38, 2), Array(39, 1), Array(40, 1),  _
Array( _
41, 2), Array(42, 1))
' Hier zur besseren Übersicht eine Auflistung der Felder:
' Felder Typ1 =  8, 22-24, 26-27, 29-31, 34-35, 39-40, 42
' Felder Typ2 =  1-7, 9-11, 14-21, 36-38, 41
' Felder Typ4 =  12-13, 25, 28, 32-33
End Sub
Ich finde diesen "Array-Teil" ziemlich unübersichtlich. Kann man das irgendwie vereinfachen?
Gruß Holger

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
Vereinfachte ARRAYs für Textdatei einlesen
09.07.2010 11:13:50
NoNet
Hallo Holger,
hier eine vereinfachte bzgl. übersichtlichere Version :
Sub EinlesenTextDatei()
Dim arSpalte(), arTypen(), lngS As Long
For lngS = 1 To 42 '42=Anzahl der einzulesenden Spalten
ReDim Preserve arSpalte(lngS - 1)
arSpalte(lngS - 1) = lngS
Next
'Typen der 42 einzulesenden Spalten : 1=Standard / 2=Text / 4=Datum
arTypen = Array(2, 2, 2, 2, 2, 2, 2, 1, 2, 2, _
2, 4, 4, 2, 2, 2, 2, 2, 2, 2, _
2, 1, 1, 1, 4, 1, 1, 4, 1, 1, _
1, 4, 4, 1, 1, 2, 2, 2, 1, 1, 2, 1)
Workbooks.OpenText Filename:="G:\KPV\KPV_Export_Einzelfelder.txt", Origin:= _
xlWindows, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=True, _
Comma:=False, Space:=False, Other:=False, FieldInfo:= _
Application.Transpose(Array(arSpalte, arTypen)), TrailingMinusNumbers:=True
End Sub
Ich konnte das natürlich nicht mit DEINER Datei testen, sondern nur mit einer Testdatei von mir, damit hat es sehr gut geklappt ! Bitte überprüfe auch nochmal die Typen im ARRAY arTypen - ich hoffe, ich habe die Reihenfolge korrekt übernommen ;-)
Gruß, NoNet
gegen 0:1  
Anzeige
AW: Vereinfachte ARRAYs für Textdatei einlesen
09.07.2010 11:40:08
Das
Hallo NoNet,
ich musste zwar das "TrailingMinusNumbers:=True" rausnehmen, da es bei mir einen Fehelr verursacht, aber dann funktioniert dein Code fehlerfrei. Danke!
Auch wenn dein Code wesentlich übersichtlicher und besser ist als das aufgezeichnete Makro, finde ich es trotzdem schade, dass man die Wiederholungen im Array (Formattypen) nicht irgendwie zusammenfassen kann.
Gruß Holger
Geringe Vereinfachung des ARRAYs
09.07.2010 12:30:00
NoNet
Hallo Holger,
leider ist die Angabe des Typen-ARRAYs unabdingbar für diese Methode, da das in Excel so vorgegeben ist (Man sagt "works as designed" !).
Eine Alternative zur einzelnen Angabe aller Typen wäre, die Typen zunächst in einem String zusammenzufassen und z.B. anstatt wie im ARRAY "2,2,2,2,2,2" einfach "5x2", anzugeben !
diese Zusammenfassung muss dann allerdings doch wieder per Code in ein ARRAY übertragen werden.
Hier ein Beispiel für Deine Datei :
Sub Einlesen3()
Dim arSpalte(), arTypen(), lngS As Long, lngPosX As Long, lngZ As Long
Dim strTypen As String
For lngS = 1 To 42 '42=Anzahl der einzulesenden Spalten
ReDim Preserve arSpalte(lngS - 1)
arSpalte(lngS - 1) = lngS
Next
'    'Typen der 42 einzulesenden Spalten : 1=Standard / 2=Text / 4=Datum
'    arTypen = Array(2, 2, 2, 2, 2, 2, 2, 1, 2, 2, _
'                    2, 4, 4, 2, 2, 2, 2, 2, 2, 2, _
'                    2, 1, 1, 1, 4, 1, 1, 4, 1, 1, _
'                    1, 4, 4, 1, 1, 2, 2, 2, 1, 1, 2, 1)
'Alternative : Angabe der Wiederholungen eines Typs : 3x2 bedeutet "2,2,2,"
strTypen = "7x2,1,3x2,4,4,8x2,3x1,4,1,1,4,3x1,4,4,1,1,3x2,1,1,2,1"
ReDim arTypen(0)
For lngS = 0 To UBound(Split(strTypen, ","))
lngPosX = InStr(Split(strTypen, ",")(lngS), "x")
If lngPosX Then
For lngZ = 1 To Left(Split(strTypen, ",")(lngS), lngPosX - 1)
ReDim Preserve arTypen(UBound(arTypen) + 1)
arTypen(UBound(arTypen)) = Right(Split(strTypen, ",")(lngS), 1)
Next
Else
ReDim Preserve arTypen(UBound(arTypen) + 1)
arTypen(UBound(arTypen)) = Right(Split(strTypen, ",")(lngS), 1)
End If
Next
For lngS = 0 To UBound(arTypen) - 1
arTypen(lngS) = arTypen(lngS + 1)
Next
ReDim Preserve arTypen(UBound(arTypen) - 1)
Workbooks.OpenText Filename:="G:\KPV\KPV_Export_Einzelfelder.txt", Origin:= _
xlWindows, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=True, _
Comma:=False, Space:=False, Other:=False, FieldInfo:= _
Application.Transpose(Array(arSpalte, arTypen)) ', TrailingMinusNumbers:=True
End Sub
Gruß, NoNet
gegen 0:1  
Anzeige
AW: Geringe Vereinfachung des ARRAYs
09.07.2010 12:37:39
Das
Danke für deine Mühe! Die Alternative bläht den Code wieder auf und macht ihn nicht gerade übersichtlicher. Aber es ist immer interessant auch andere Möglichkeiten zu sehen, das hilft beim erlernen. Ich bleibe bei deinem 1. Code.
Schönes und hoffentlich auch siegreiches Wochenende!
Gruß Holger

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige