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
  2. Så fungerar koden
  3. Sammanfattning

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.