Start » VBA-exempel för Excel | Effektiva lösningar på konkreta problem » Excel | Interaktion med andra program » Skriva och läsa textfiler direkt från Excel VBA

Skriva och läsa textfiler direkt från Excel VBA





asciiTextfiler är enkla dokument som man kan redigera via lika enkla program som t ex Notepad i Windows. Ibland kallas dessa dokument för Ascii-filer efter en nordamerikansk teckenuppsättning från 1970-talet.

Sitt enkla format till trots så är dessa filer fortfarande oerhört viktiga i datavärlden. Ofta så använder man textfiler som enkla “databaser” för att lagra enkel information. En enkel variant av databas helt enkelt. Andra använder Notepad som ordbehandlare.

Ett annat mycket viktigt område för textfiler är de tillämpningar som kan uppnås om filerna skrivs i så kallat CSV-format. CSV är en förkortning för Comma Separated Values och är ett system för att simulera kolumnuppdelning fastän sådan ju inte finns i en vanlig textfil. Men genom att man inkluderar ett speciellt tecken (ibland ett komma men det finns andra bättre varianter) så markerar man var en ny kolumn börjar.

Tänk på att textfiler inte per definition behöver ha filändelsen .txt utan i princip vilket suffix som helst. Det är alltså innehållet som räknas. Kom ihåg att det inte är filändelsen som styr om du kan koppla upp dig mot en fil eller ej.

Hur som helst, CSV-filer är en specialvariant av en vanlig textfil som har en mängd smarta tillämpningar i Excel vilket jag kommer att skriva om i senare artiklar. Men till en början så beskrivs nedan hur du kan koppla upp ditt Excelprogram mot vilken textfil som helst via VBA-kod.

Längst ned på sidan så beskrivs med hjälp av två exempel hur hur man kan skriva resp. läsa in data från en textfil via Excel VBA.

OPEN – öppna textfiler från Excel VBA

Via kommandot OPEN kan vi erhålla åtkomst till textfiler direkt från Excel. Det är denna koppling som senare kommer att ge oss möjligheterna att läsa och skriva till denna fil.

OPEN-kommandot erbjuder tre grundmöjligheter, nämligen Output, Append samt Input. Exempel på dessa tre varianter visas nedan.

OUTPUT
Denna variant öppnar en indikerad fil (eller skapar den om den inte redan finns). I det fallet som filen redan finns så kommer allt eventuellt tidigare innehåll att raderas. Effekten är alltså att en koppling till en tom fil skapas.

strTextFil = "C:mintextfil.txt"
f = FreeFile
Open strTextFil For Output As #f

APPEND
Via Append så öppnar vi en indikerad fil alternativt skapar den om den inte redan finns. Till skillnad från OUTPUT så ger APPEND att eventuellt tidigare innehåll i textfilen inte raderas vid öppnandet utan man fortsätter att skriva på den sist använda raden i filen.

strTextFil = "C:mintextfil.txt"
f = FreeFile
Open strTextFil For Append As #f

INPUT
Via Input-kommandot så öppnar vi en kanal till filen som gör att vi kan läsa den och ingenting annat. Dvs att Input skall användas när vi skall importera innehåll i en textfil till Excel.

strTextFil = "C:mintextfil.txt"
f = FreeFile
Open strTextFil For Input As #f

Angående instruktionen ‘#f’
För att kunna arbeta med dessa kommandon/filer så måste filerna tilldelas namn enligt ett nummersystem. Men genom att vi använder oss av tillägget #f (som betyder FREEFILE) så behöver vi inte bry oss om detta.

PRINT – skriva till en textfil via Excel VBA

Kommandot PRINT skriver “rätt upp och ned” i textfilen. Man tar inga hänsyn till kolumnuppdelningar. I exemplet nedan så skrivs texten “Dagens datum:” ut följt av aktuellt systems datumgivning.

Print #f, "Dagens datum: " & Date

WRITE – skriva till en textfil via VBA och inkludera kolumnuppdelningar

Denna variant av att skicka text till en textfil är riktigt användbar på det sättet att den medger att vi stoppar in ett speciellt tecken där vi vill att en kolumnuppdelning skall markeras. Dvs att vi skapar en CSV-fil.

Write #f, "Dagens datum: " & Date ;  Application.UserName

I exemplet ovan så skrivs dagens datum ut liksom aktuell Excelinstallations användarnamn. Men där finns ytterligare en finnes inbyggt i detta, nämligen ett semikolon som underlättar framtida kolumnuppdelning.

Exempel 1 : Skriva till en fil via OUTPUT

Sub Skapa_Och_Skriva_Till_Textfil()
 
Dim strFilnamn as String
Dim strSokVag as String
Dim strTextfil As String
Dim f As Integer
 
'namn och sökväg till textfilen
strSokVag = "C:"
strFilnamn = "min_textfil.txt"
strTextfil = strSokVag & strFilnamn
 
'vi öppnar textfilen för att kunna skriva till den
f = FreeFile
Open strTextfil For Output As #f
 
'vi skriver till filen
Print #f, "Dagens datum: " & Date
Print #f, "Användare: " ; Application.UserName
 
'slutligen så stänger vi uppkopplingen till textfilen
Close f
 
End Sub

I exemplet ovan så används Output istället för Append. Hade vi använt Append så hade eventuellt tidigare innehåll i textfilen sparats och vi hade börjat skriva på nästa tomma rad i filen.

Exempel 2: Läsa in data från en textfil till Excel via INPUT

Nu skall vi också titta på hur man kan importera data från en Ascii-fil till ditt kalkylblad i Excel. Metoden är lik den som vi använt i ovanstående exempel, fast nu tillämpar vi kommandot Input.

Sub Lasa_In_Asciifil_Till_Excel
 
Dim strFilnamn as String
Dim strSokVag as String
Dim strTextfil As String
Dim strText As String
Dim f as Integer
Dim i As Integer
 
'namn och sökväg till textfilen
strSokVag = "C:"
strFilnamn = "min_textfil.txt"
strTextfil = strSokVag & strFilnamn
 
'vi öppnar textfilen för att kunna läsa från den
f = FreeFile
Open strTextfil For Input As #f
 
'vi läser in textfilsdatan till en kolumn i Excels kalkylblad
i = 1
While Not EOF(f)
Line Input #f, strText
Cells(i, 1) = strText
i = i + 1
Wend
 
'importen är klar och vi stänger ned kopplingen till textfilen
Close f
 
End Sub

Slutsats

Med hjälp av ovanstående enkla programmering i Excel VBA kan du alltså koppla upp dig mot vilken textfil som helst och antingen exportera Exceldata till filen eller läsa in uppgifter från den.

Det kan även tilläggas att möjlighet finns att koppla upp sig även mot textfiler som ligger utanför din egen dator, dvs på nätverket eller på annat sätt åtkomlig via internet.





Lämna en kommentar