CSV- en tekstbestanden veilig bewerken met Excel VBA
Datum van publicatie:
Bijgewerkt:
Artikelen > CSV- en tekstbestanden veilig bewerken met Excel VBA
2026 status en veilig gebruik
Conclusie: Behandel een platte tekstbestand alleen als regels wanneer het formaat echt lijngericht is. Een CSV-veld kan komma's, citaten en regelpauzes bevatten, dus gebruik een CSV-aware parser voor algemene CSV-gegevens en schrijf naar een tijdelijk bestand voordat u het origineel vervangt.
Wat je zult leren
- Hoe VBA's bestand I/O modi verschillen voor invoer, toevoegen en uitvoer.
- Hoe codering, newline stijl, file locking, en foutherstel invloed hebben op een herschrijven.
- Waarom eenvoudige string splitsen onveilig is voor willekeurige RFC-stijl CSV records.
Voor wie: Excel gebruikers onderhouden kleine, gecontroleerde tekstverwerking macro's.
Actualisatie voor 2026: De oorspronkelijke macro laat een specifieke lokale workflow zien en is niet in een verliesloze CSV-bibliotheek veralgemeend. Een back-up van representatieve bestanden, test geciteerde en multiline waarden, en voer geen herschrijven met de enige productiekopie.
Veiligheidsopmerking: de opdrachten en configuratievoorbeelden uit het oorspronkelijke artikel zijn niet opnieuw in een moderne productieomgeving uitgevoerd. Controleer ondersteunde versies, back-ups, toegangsbeheer en terugrolstappen eerst in een afzonderlijke testomgeving.
Officiële primaire bronnen
Overzicht
Ik wil graag beschrijven hoe je csv en tekst bestanden kunt bewerken met VBA (Excel macro's). Dit artikel is bedoeld voor mensen die de volgende taken willen programmeren
- Ik wil rijen toevoegen aan een reeds bestaand csv of tekst bestand. Ik wil tekst toevoegen in het midden van een regel.
- Ik wil regels verwijderen in een reeds bestaand csv- of tekstbestand.
Inhoudsopgave
1. Programmeer methode
Kortom, FileSystemObject heeft niet de mogelijkheid om in het midden van een regel toe te voegen of een specifieke regel te verwijderen, dus je moet het zelf programmeren.
Referentievoorbeelden van programmering worden hieronder gegeven.
Aangezien het is gemaakt in Function, hoop ik dat je het kunt binnenhalen zoals het is door kopiëren en plakken, en het methodes van Sub kunt laten aanroepen.
'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
Om het te gebruiken, geef je de volgende argumenten door.
- filePath: Dit zal het volledige pad van het bestand zijn. Voorbeeld.) C:\Users\user\Desktop\test\test.txt
- mode: Pas waar, onwaar. Indien waar, toevoegen. Indien onwaar, verwijder de rij.
- targetRow: Specificeert het aantal doelrijen. In het geval van toevoegingen is het het aantal toe te voegen regels en in het geval van schrappingen is het het aantal te schrappen regels.
- targetInput: Voor postscripts, specificeer de waarde die moet worden toegevoegd. Het wordt niet gebruikt voor verwijdering en kan een willekeurige waarde zijn. Lege letters zijn ook aanvaardbaar.
- lineBreakType: Instelling van newline-tekens. Indien waar, vbCrLf. vbLf als Onwaar. In het kort, True voor bestanden gemaakt in Windows.
De tekencodering is UTF-8, maar als u die wilt wijzigen, wijzigt u de Functiecode rechtstreeks. Er zijn twee plaatsen waar ".Charset = "UTF-8"".
Hieronder volgt een voorbeeldimplementatie van een werkelijke functie-oproep.
Sub test()
'Voorbeeld van het toevoegen van test123 aan regel 5 van test.txt.(Bestanden gemaakt in Windows.)
editFile "C:\Users\user\Desktop\test\test.txt", True, 5, "test123", True
'Voorbeeld van het verwijderen van regel 5 van test.txt.(Bestanden gemaakt in Windows.)
editFile "C:\Users\user\Desktop\test\test.txt", False, 5, "", True
End Sub
Als u wilt appenderen als een csv, maak dan van het argument van de toe te voegen waarde een door komma's gescheiden waarde, en een door komma's gescheiden waarde zal worden append. Voorbeeld.)"test1,test2,test3"
2. Code Omschrijving.
Dit is het einde van de instructies over het gebruik van het systeem, gevolgd door een uitleg van de code.
De details zijn te vinden in de code, maar een ruwe processtroom is als volgt.
Voor naschrift.
- 1. Lezen van tekstbestanden in paden die als argumenten zijn doorgegeven.
- 2. Het aantal tekens tot aan het aantal regels dat in het argument wordt doorgegeven, wordt bepaald aan de hand van het aantal nieuwe regels. Bijvoorbeeld, voor regel 5 zijn er vier regeleindes, dus zoek de positie waar de vierde regeleindes zich bevindt
- 3. Haal informatie op tot en met regel 4.
- ④(2) Verzamel informatie vanaf regel 5 op dezelfde wijze als (2).
- ⑤De informatie in (3), de toe te voegen informatie die als argument wordt doorgegeven en de informatie in (4) worden samengevoegd.
- ⑥Maak een bestand aan op basis van de informatie in (5) en overschrijf het bestand.
In geval van schrapping
- 1. Lezen van tekstbestanden in paden die als argumenten zijn doorgegeven.
- 2. Het aantal tekens tot aan het aantal regels dat in het argument wordt doorgegeven, wordt bepaald aan de hand van het aantal nieuwe regels. Bijvoorbeeld, voor regel 5 zijn er vier regeleindes, dus zoek de positie waar de vierde regeleindes zich bevindt
- 3. Haal informatie op tot en met regel 4.
- ④(2) Verzamel informatie vanaf regel 6 op dezelfde manier als (2).
- ⑤De informatie onder (iii) en (iv) wordt samengevoegd. (Maak een string zonder vijfde regel.)
- ⑥Maak een bestand aan op basis van de informatie in (5) en overschrijf het bestand.
In het geval van appending en deleting zijn beide hetzelfde, maar in plaats van het bestand te bewerken, wordt het gemaakt alsof alleen de noodzakelijke informatie uit het oorspronkelijke bestand wordt gehaald en wordt een nieuw bestand gemaakt en overgeslagen.
3. samenvatting
Indien u problemen heeft met het bewerken van csv/tekst bestanden met VBA (Excel macro's), raadpleeg dan deze sectie.