RSS

Hurtig import af tekstfiler med Excel VBA makro

Hvis man som jeg ofte importerer tekstfiler til Excel, bliver man hurtigt træt af at bruge Excels guide. Hver eneste gang skal man vælge, om de enkelte værdier er adskilt af mellemrum, semikolon, tabulatortegn osv. og bladre gennem flere sider.

Med Excel VBA kan man læse og importere tekstfiler (som vist her), og det er fint til "skræddersyede" formål, men om muligt skal man altid bruge Excels indbyggede funktioner, da de er meget hurtigere.

Denne side viser, hvordan man kan automatisere importen, så man slipper for at bladre sig gennem guiden. Man skal bare vide på forhånd, om tekstfelterne (kolonnerne) er adskilt med semikolon, tabulatortegn eller noget andet.

Det eneste, man skal gøre, er at vælge filen, der skal importeres. Resten klarer makroen i et snuptag.

Lad os lige se, hvordan VBA-koden ser ud, hvis vi importerer en tekstfil med makrooptageren slået til. I dette eksempel en semikolonsepareret tekstfil:


Sub Makro1()

'
' Makro1 Makro
' Makro indspillet 13-07-2013 af Eric Bentzen
'

'
Workbooks.OpenText Filename:="C:\textexample.txt", _
   Origin:=xlMSDOS, StartRow:=1, 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)), _
   TrailingMinusNumbers:=True
End Sub

Skal makroen kunne bruges til andre filer end "C:\textexample.txt", skal vi i stedet have fat i en brugervalgt fil, og vi skal også slette de filspecifikke oplysninger om "FieldInfo ..." - dem behøver vi ikke.

For at få et brugervalgt filnavn, bruger vi VBA-funktionen "Application.GetOpenFilename". Den lader brugeren vælge en fil uden at åbne filen, og filnavnet + sti indlæser vi så i en variabel, som bruges i stedet for "C:\textexample.txt".

Den færdige makro ser ud som nedenfor. Du kan evt. markere teksten med musen, kopiere med CTRL+C og indsætte den i et VBA-modul. Alternativt kan du downloade det zip-komprimerede eksempelregneark. Zip-filen indeholder også en semikolon-separeret tekstfil, du kan lege med.


Sub ImportTextFile()
'Importerer en tekstfil med Excels indbyggede
'importfunktion.
Dim vFileName

On Error GoTo ErrorHandle

'Funktionen GetOpenFileName snupper filnavnet
'uden at åbne filen.
'Her bruges et filter, så kun tekstfiler med "*.txt"
'vises. Hvis du udelader parentesen, vises alle filer.
'Der er flere muligheder, som du kan læse om i
'hjælpen til VBA.
vFileName = Application.GetOpenFilename("Text Files (*.txt),*.txt")

'Hvis brugeren annullerede eller ikke valgte en tekstfil,
'forlades proceduren.
If vFileName = False Or Right(vFileName, 3) <> "txt" Then
   GoTo BeforeExit
End If

'Slår skærmopdatering fra.
Application.ScreenUpdating = False

'Nu importeres den valgte tekstfil, og data indsættes
'i et nyt regneark. Vil man bruge en anden adskiller
'end semikolon, skal "Semicolon:=True" ændres til
'"Semicolon:=False" og den anden adskiller (fx "Tab")
'sættes til True.
'For nylig opdagede jeg, at man undertiden kan
'undgå formateringsproblemer (fx med datoer), hvis
'man som nedenunder tilføjer "Local:=True" til
'sidst. Det afhænger af lokale indstillinger og
'Excel-version, men tilføjelsen gør ingen skade.
Workbooks.OpenText Filename:=vFileName, _
    Origin:=xlMSDOS, StartRow:=1, DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, _
    ConsecutiveDelimiter:=False, Tab:=False, _
    Semicolon:=True, Comma:=False, Space:=False, _
    Other:=False, TrailingMinusNumbers:=True, _
    Local:=True

'For eksemplets skyld autotilpasses bredden af kolonne A.
Columns("A:A").EntireColumn.AutoFit

BeforeExit:
Application.ScreenUpdating = True
Exit Sub
ErrorHandle:
MsgBox Err.Description
Resume BeforeExit
End Sub

Jeg har lavet et regneark, hvor jeg bare skal trykke på en knap for at køre makroen, og det bruger jeg, når jeg skal importere tekstfiler. Tekstfilens data indsættes i et nyt regneark uden at "kompromittere" regnearket med makroen.

Du kan downloade en zip-komprimeret version af regnearket her, og zip-filen indeholder også en semikolon-separeret tekstfil, du kan lege med.

Bemærk at importkoden i regnearket IKKE er opdateret med "Local:=True" som i eksemplet ovenfor.

Relateret: