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()
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()
Dim vFileName
On Error GoTo ErrorHandle
vFileName = Application.GetOpenFilename("Text Files (*.txt),*.txt")
If vFileName = False Or Right(vFileName, 3) <> "txt" Then
GoTo BeforeExit
End If
Application.ScreenUpdating = False
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
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:
|