Rediger CSV- og tekstfiler sikkert med Excel VBA


Udgivet:

Opdateret:


Artikler › Rediger CSV- og tekstfiler sikkert med Excel VBA

Status i 2026 og sikker brug

Konklusion: Behandl kun en almindelig tekstfil som linjer, når dens format virkelig er linjeorienteret. Et CSV-felt kan indeholde kommaer, anførselstegn og linjeskift, så brug en CSV-bevidst parser til generelle CSV-data og skriv til en midlertidig fil, før du erstatter originalen.

Det lærer du

  • Hvordan VBA's fil-I/O-tilstande er forskellige for input, tilføjelse og output.
  • Hvordan kodning, nylinjestil, fillåsning og fejlgendannelse påvirker en omskrivning.
  • Hvorfor simpel strengopdeling er usikker for vilkårlige CSV-poster i RFC-stil.

Målgruppe: Excel-brugere, der vedligeholder små, kontrollerede tekstbehandlingsmakroer.

Aktuel status i 2026: Den originale makro demonstrerer en specifik lokal arbejdsgang og er ikke blevet generaliseret til et tabsfrit CSV-bibliotek. Sikkerhedskopier repræsentative filer, test citerede og multiline værdier, og kør ikke en omskrivning mod den eneste produktionskopi.

Sikkerhedsbemærkning: Kommandoerne og konfigurationseksemplerne i den oprindelige artikel er ikke kørt igen i et aktuelt produktionsmiljø. Kontrollér understøttede versioner, tag backup, og forbered en rollback i et separat testmiljø før ændringerne anvendes.

Officielle kilder

Oversigt

Nedenfor beskrives, hvordan man redigerer csv- og tekstfiler med VBA (Excel-makroer). Artiklen er beregnet til personer, der ønsker at programmere følgende opgaver

  • Jeg ønsker at tilføje rækker til en allerede eksisterende csv- eller tekstfil. Jeg vil gerne tilføje tekst midt på en linje.
  • Jeg ønsker at slette linjer i en allerede eksisterende csv- eller tekstfil.

Indholdsfortegnelse

  1. Programmeringsmetode
  2. Kode Beskrivelse.
  3. Opsummering

1. Programmeringsmetode

Det kan konkluderes, at FileSystemObject ikke har mulighed for at tilføje midt i en linje eller slette en bestemt linje, så du skal selv programmere det.

Nedenfor er vist referenceeksempler på programmering.

Da den er oprettet i Function, håber jeg, at du kan bringe den ind som den er ved at kopiere og indsætte den, og få den til at kalde metoder fra Sub.

'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

For at bruge den skal du angive følgende argumenter.

  • filePath···Dette vil være den fulde sti til filen. Eksempel).C:\Users\user\Desktop\test\test.txt
  • mode···Passer sandt, falsk. Hvis sand, tilføj. Hvis falsk, slettes rækken.
  • targetRow···Angiver antallet af målrækker. I tilfælde af tilføjelser er det antallet af linjer, der skal tilføjes, og i tilfælde af sletninger er det antallet af linjer, der skal slettes.
  • targetInput···For postscripts skal du angive den værdi, der skal tilføjes. Den bruges ikke til sletning og kan være en vilkårlig værdi. Tomme bogstaver er også acceptable.
  • lineBreakType···Indstilling af newline-tegn. Hvis True, vbCrLf. vbLf hvis False. Kort sagt: Sandt for filer, der er oprettet i Windows.

Tegnkodningen er UTF-8, men hvis du ønsker at ændre den, skal du ændre funktionskoden direkte. Der er to steder, hvor ".Charset = "UTF-8"".

Nedenfor er vist et eksempel på en implementering af et faktisk funktionsopkald.

Sub test()
 
'Eksempel på tilføjelse af test123 til linje 5 i test.txt.(Filer oprettet i Windows.)
editFile "C:\Users\user\Desktop\test\test.txt", True, 5, "test123", True
 
'Eksempel på sletning af linje 5 i test.txt.(Filer oprettet i Windows.)
editFile "C:\Users\user\Desktop\test\test.txt", False, 5, "", True
 
End Sub

Hvis du vil vedhæfte som en csv-fil, skal du gøre argumentet for den værdi, der skal vedhæftes, til en kommasepareret værdi, og der vil blive vedhæftet en kommasepareret værdi. Eksempel)."test1,test2,test3"

2. Kode Beskrivelse.

Dette er slutningen af vejledningen om, hvordan systemet skal bruges, efterfulgt af en forklaring af koden.

Detaljerne kan findes i koden, men et groft procesforløb er som følger.

Til efterskrift.

  • 1.Læsning af tekstfiler i stier, der er angivet som argumenter.
  • 2.Antallet af tegn op til det antal linjer, der er angivet i argumentet, er angivet ud fra antallet af newlines. For linje 5 er der f.eks. fire linjeskift før linje 5, så find den position, hvor det fjerde linjeskift er fundet
  • 3.Hent oplysninger op til og med linje 4.
  • 4. (2) Indsaml oplysninger fra linje 5 og frem på samme måde som i (2).
  • 5.Oplysningerne i (3), de oplysninger, der skal vedhæftes som et argument, og oplysningerne i (4) kombineres sammen.
  • 6.Opret en fil baseret på oplysningerne i (5), og overskriv filen.

I tilfælde af sletning

  • 1.Læsning af tekstfiler i stier, der er angivet som argumenter.
  • 2.Antallet af tegn op til det antal linjer, der er angivet i argumentet, er angivet ud fra antallet af newlines. For linje 5 er der f.eks. fire linjeskift før linje 5, så find den position, hvor det fjerde linjeskift er fundet
  • 3.Hent oplysninger op til og med linje 4.
  • 4. (2) Indsaml oplysninger fra linje 6 og frem på samme måde som i (2).
  • 5.Oplysningerne i (iii) og (iv) kombineres sammen. (Opret en streng uden femte linje).
  • 6.Opret en fil baseret på oplysningerne i (5), og overskriv filen.

I tilfælde af tilføjelse og sletning er begge dele det samme, men i stedet for at redigere filen gøres det, som om kun de nødvendige oplysninger udtrækkes fra den oprindelige fil, og en ny fil oprettes og gemmes i stedet.

3. resumé

Hvis du har problemer med at redigere csv/tekstfiler med VBA (Excel-makroer), kan du læse dette afsnit.

Det opsummerer de vigtigste trin og begrænsninger.