Arbejd med filer i Excel med VBA
I denne guide vil jeg samle nogle af de ting du kan med filer i VBA. VBA er nemlig god til at arbejde med filer.
VBA kan sagtens fra Excel gøre en del med filer og mapper. Du kan oprette filer, åbne filer, slette filer og flytte filer. Nogle af koderne til disse ting vil jeg samle i denne artikel. Hvis du synes der er noget der mangler er du velkommen til at skrive en kommentar. Se også denne artikel om at arbejde med mapper i VBA.
Bemærk at du kun kan arbejde med filer i Excel til Windows. Dette skyldes at FileSystemObject, som skal bruges til at arbejde med filer, er en del af Windows.
Læs en fil linje for linje
Denne kode læser en tekstfil, linje for linje. Koden kan du så udbygge, så der kigges efter bestemte ting og handles herudfra. Men her er en grundkode.
Dim path As String path = "C:\Users\Bruger\Documents\Test\File.txt" If Dir(path) <> "" Then Const ForReading = 1, ForWriting = 2, ForAppending = 8 Dim fso, MyFile, Filename, TextLine Set fso = CreateObject("Scripting.FileSystemObject") Filename = path Set MyFile = fso.OpenTextFile(Filename, ForReading) Dim result As String result = "" Dim resultarray() As String Do While MyFile.AtEndOfStream <> True TextLine = MyFile.ReadLine resultarray = Split(TextLine, ";") result = resultarray(1) Loop MyFile.Close End if
Koden Dir(path) tjekker om filen eksisterer og kun hvis den gør, begynder den at prøve at læse i filen. Ellers læser den i tekstfilen, linje for linje, og splitter hver linje op efter tegnet “;”. Dette skaber et array og nummer 2 værdi i det array gemmes i variablen result. Det betyder at denne funktion finder værdi nummer to på den sidste linje.
Skriv til en fil
Denne kode skriver noget tekst til en tekstfil.
Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") Dim oFile As Object Set oFile = fso.CreateTextFile("C:\Users\Bruger\Documents\Test\File.txt") oFile.WriteLine "Her er en linje" oFile.Close Set fso = Nothing Set oFile = Nothing
Denne opretter altså en fil der hedder File.txt og tilføjer linjen “Her er en linje”.
Tæl antallet af linjer i en fil
Hvis du vil tælle antallet af linjer i en tekstfil, kan du bruge denne kode:
Private Function CountLines(ByVal Filename As String) As Integer Dim buff() As Byte Dim hF As Integer Dim i As Long, n As Long hF = FreeFile(0) Open Filename For Binary Access Read As #hF ReDim buff(LOF(hF) - 1) Get #hF, , buff() Close #hF For i = 0 To UBound(buff) If buff(i) = 13 Then n = n + 1 Next CountLines = n End Function
Kopier en fil
Med denne kode kan du kopiere en fil:
Dim sSFolder As String sSFolder = "C:\Users\Bruger\Documents\File.txt" Dim sDFolder As String sDFolder = "C:\Users\Bruger\Documents\Test\File.txt" Set fso = CreateObject("Scripting.FileSystemObject") fso.CopyFile sSFolder, sDFolder, True Set fso = Nothing
Dette kopierer altså filen File.txt fra C:\Users\Bruger\Documents\ til C:\Users\Bruger\Documents\Test\. Hvis filen findes allerede overskrives den (det er det sidste argument i koden fso.CopyFile.
Slet en fil
Hvis du bare skal slette en enkelt fil, anvender du koden:
Dim strChosenFolder As String
strChosenFolder = "C:\Users\Bruger\Documents\Test\"
Set fso = CreateObject("Scripting.FileSystemObject")
fso.DeleteFile strChosenFolder & "Fil.txt"
Slet alle filer i en mappe
Først vil jeg vise dig hvordan du sletter samtlige filer i en mappe. Her bruger du koden:
Set wb = ActiveWorkbook Set Sheetname = wb.Sheets("Ark1") myFolder = "C:\Users\Bruger\Documents\Test" Set fso = CreateObject("Scripting.FileSystemObject") Set fldr = fso.GetFolder(myFolder) For Each Filename In fldr.Files Filename.Delete True Next
Dette vil altså slette alle filer i mappen “C:\Users\Bruger\Documents\Test”.
Indlæs filnavne
Med denne kode vil
Dim filetype As String filetype = "jpg" Dim path As String path = "C:\Users\Bruger\Documents\" vFile = Dir(path & "*." & filetype) Dim Fileopened As String Do While vFile <> "" ListBox1.AddItem vFile vFile = Dir Loop
Koden kigger altså efter filer af typen .jpg i mappen “C:\Users\Bruger\Documents\” og indlæser deres filnavne i den listbox der hedder “ListBox1. Her kan du jo så efterfølgende gøre således, at hvis en bruger klikker på et filnavn indlæses billedet i en billedkomponent. Det kan du gøre med koden:
Image1.Picture = LoadPicture(path & ListBox1.Value)
Hvor Image1 er billedkomponenten.