Redigera CSV- och textfiler säkert med Excel VBA
Publicerad:
Uppdaterad:
Tekniska artiklar > Redigera CSV- och textfiler säkert med Excel VBA
Status 2026 och säker användning
Slutsats: Behandla bara en vanlig textfil radvis när formatet verkligen är radbaserat. CSV-fält kan innehålla kommatecken, citattecken och radbrytningar; använd därför en CSV-parser som följer formatets regler och skriv till en temporär fil innan originalet ersätts.
Det här går artikeln igenom
- Hur VBA:s fil-I/O-lägen skiljer sig för läsning, tillägg och skrivning.
- Hur teckenkodning, radslut, fillåsning och felåterställning påverkar en omskrivning.
- Varför enkel strängdelning inte räcker för CSV-filer med citerade fält och inbäddade radbrytningar.
Målgrupp: Excel-användare som underhåller små och kontrollerade makron för textbearbetning.
Läge 2026: Originalmakrot visar ett specifikt lokalt arbetsflöde och är inte en allmän CSV-parser utan risk för dataförlust. Säkerhetskopiera representativa filer, testa citerade fält och flerradsvärden och skriv aldrig om den enda produktionskopian.
Säkerhetsinformation: Kod- och konfigurationsexemplen i originalartikeln har inte testats på nytt i en aktuell produktionsmiljö. Kontrollera versioner med support, säkerhetskopior, åtkomstkontroller och återställningssteg i en separat testmiljö innan de används.
Viktiga officiella källor
Översikt
Artikeln visar hur radbaserade CSV- och textfiler kan skrivas om med VBA i Excel för följande uppgifter:
- infoga en rad eller text vid en bestämd radposition i en befintlig fil;
- ta bort en bestämd rad ur en befintlig fil.
Innehållsförteckning
1. Arbetsmetod
FileSystemObject har ingen direkt funktion för att infoga text mitt i en rad eller ta bort en bestämd rad. Exemplet läser därför hela filen, bygger upp det nya innehållet och skriver tillbaka resultatet.
Följande funktion visar ett konkret exempel för ett kontrollerat, radbaserat textformat.
Funktionen anropas från en Sub-rutin med filsökväg, arbetsläge, radnummer, text och typ av radslut som argument.
'Parameter Examples
'## filePath C:\Users\user\Desktop\test\test.txt
'## mode false:delete, true:write
'## targetRow 10
'## targetInput If in write mode, any character
'## lineBreakType false:vbLf, true:vbCrLf
Function editFile(filePath As String, mode As Boolean, targetRow As Long, targetInput As String, lineBreakType As Boolean)
'File existence check
If Dir(filePath) = "" Then
MsgBox "File does not exist!"
Exit Function
End If
Dim tempText As String
Dim tempTextBefore As String
Dim tempTextNew As String
Dim tempTextAfter As String
Dim resultText As String
Dim i As Long
'File read
With CreateObject("ADODB.Stream")
.Charset = "UTF-8"
.Open
.LoadFromFile filePath
tempText = .ReadText
.Close
End With
Dim tempTextBeforeRow As Long
tempTextBeforeRow = 0
For i = 1 To targetRow - 1
If lineBreakType Then
tempTextBeforeRow = InStr(tempTextBeforeRow + 1, tempText, vbCrLf)
Else
tempTextBeforeRow = InStr(tempTextBeforeRow + 1, tempText, vbLf)
End If
Next i
If lineBreakType Then
tempTextBeforeRow = tempTextBeforeRow + 1
End If
tempTextBefore = Left(tempText, tempTextBeforeRow)
'write
If mode Then
tempTextAfter = Mid(tempText, tempTextBeforeRow + 1, Len(tempText))
If lineBreakType Then
tempTextNew = targetInput & vbCrLf
Else
tempTextNew = targetInput & vbLf
End If
resultText = tempTextBefore & tempTextNew & tempTextAfter
'delete
Else
Dim tempTextAfterRow As Long
tempTextAfterRow = 0
For i = 1 To CInt(targetRow)
If lineBreakType Then
tempTextAfterRow = InStr(tempTextAfterRow + 1, tempText, vbCrLf)
Else
tempTextAfterRow = InStr(tempTextAfterRow + 1, tempText, vbLf)
End If
Next i
If lineBreakType Then
tempTextAfterRow = tempTextAfterRow + 1
End If
tempTextAfter = Mid(tempText, tempTextAfterRow + 1, Len(tempText))
resultText = tempTextBefore & tempTextAfter
End If
With CreateObject("ADODB.Stream")
.Charset = "UTF-8"
If lineBreakType Then
.LineSeparator = -1
Else
.LineSeparator = 10
End If
.Open
.WriteText tempTextBefore & tempTextNew & tempTextAfter, 0
.SaveToFile filePath, 2
.Close
End With
End Function
Ange argumenten på följande sätt:
- filePath: den fullständiga sökvägen till filen, exempelvis C:\Users\user\Desktop\test\test.txt.
- mode: True infogar en rad och False tar bort den angivna raden.
- targetRow: radpositionen där text ska infogas eller raden som ska tas bort.
- targetInput: texten som ska infogas. Värdet används inte i raderingsläget och kan då vara tomt.
- lineBreakType: True använder vbCrLf och False använder vbLf. Kontrollera filens befintliga radslut innan värdet väljs.
Exemplet använder UTF-8. Om filen har en annan teckenkodning måste båda Charset-inställningarna anpassas och resultatet kontrolleras på en kopia.
Följande Sub-rutin visar två funktionsanrop.
Sub test()
'Exempel på att lägga till test123 på rad 5 i test.txt.(Filer som skapats i Windows.)
editFile "C:\Users\user\Desktop\test\test.txt", True, 5, "test123", True
'Exempel på radering av rad 5 i test.txt.(Filer som skapats i Windows.)
editFile "C:\Users\user\Desktop\test\test.txt", False, 5, "", True
End Sub
För en enkel CSV-rad kan targetInput exempelvis vara "test1,test2,test3". Det fungerar bara när fälten inte kräver citattecken eller inbäddade radbrytningar; använd annars en riktig CSV-parser.
2. Så fungerar koden
Koden behandlar filen som en sammanhängande text och lokaliserar radgränserna med det valda radslutet.
Arbetsflödet skiljer sig något mellan infogning och radering.
Vid infogning:
- 1. Hela textfilen på den angivna sökvägen läses in.
- 2. Positionen efter radslutet före targetRow söks fram. För rad 5 är det positionen efter det fjärde radslutet.
- 3. Texten före infogningspunkten sparas.
- 4. Texten från infogningspunkten till filens slut sparas.
- 5. Prefixet, den nya raden och suffixet fogas samman.
- 6. Det nya innehållet skrivs tillbaka till filen.
Vid radering:
- 1. Hela textfilen på den angivna sökvägen läses in.
- 2. Början av targetRow lokaliseras via föregående radslut.
- 3. Texten före raden som ska tas bort sparas.
- 4. Slutet av targetRow lokaliseras och texten från nästa rad sparas.
- 5. Prefixet och suffixet fogas samman utan den borttagna raden.
- 6. Det nya innehållet skrivs tillbaka till filen.
I båda fallen byggs alltså ett nytt textinnehåll i minnet och sparas över originalfilen. En robust produktionslösning bör i stället skriva till en temporär fil, verifiera resultatet och först därefter ersätta originalet.
3. Sammanfattning
VBA-exemplet kan infoga eller ta bort rader i ett enkelt radbaserat textformat genom att läsa hela filen och skriva om innehållet.
Kontrollera teckenkodning och radslut och arbeta alltid mot en kopia. För allmänna CSV-filer med citerade fält eller radbrytningar inuti fält krävs en CSV-parser som följer formatets regler.