Urejanje datotek CSV in besedilnih datotek z VBA v Excelu


Datum objave:

Posodobljeno:


Tehnični članki > Urejanje datotek CSV in besedilnih datotek z VBA v Excelu

Stanje in varna uporaba v letu 2026

Sklep: Besedilno datoteko obravnavajte po vrsticah le, če njena oblika to res omogoča. Polje CSV lahko vsebuje vejice, narekovaje in prelome vrstic, zato za splošne podatke CSV uporabite ustrezen razčlenjevalnik. Spremenjeno vsebino najprej zapišite v začasno datoteko in šele nato zamenjajte izvirnik.

Kaj boste izvedeli

  • Kako primer funkcije poišče ciljno mesto ter vstavi ali izbriše vrstico.
  • Kako kodiranje, oblika prelomov vrstic, zaklepanje datoteke in obravnava napak vplivajo na prepis.
  • Zakaj preprosto rezanje nizov ni varno za poljubne zapise CSV z narekovaji in večvrstičnimi polji.

Komu je članek namenjen? Uporabnikom Excela, ki vzdržujejo manjše in nadzorovane makre za obdelavo besedilnih datotek.

Opomba za leto 2026: Prvotni makro je namenjen določenemu lokalnemu postopku in ni splošen razčlenjevalnik CSV. Varnostno kopirajte reprezentativne datoteke, preizkusite polja v narekovajih in večvrstične vrednosti ter nikoli ne prepisujte edine produkcijske kopije.

Varnostna opomba: Ukazi in konfiguracijski primeri iz prvotnega članka niso bili znova preizkušeni v sodobnem produkcijskem okolju. Pred uporabo v ločenem preizkusnem okolju preverite podprte različice, izdelajte varnostne kopije ter določite nadzor dostopa in postopek povrnitve.

Uradni viri

Pregled

Primer prikazuje, kako z VBA v Excelu vstaviti ali izbrisati vrstico v besedilni datoteki. Primeren je za datoteke s preprosto vrstično strukturo in naslednji nalogi:

  • Vstavljanje nove vrstice na izbrano mesto v obstoječi besedilni datoteki.
  • Brisanje izbrane vrstice iz obstoječe besedilne datoteke.

Kazalo vsebine

  1. Primer funkcije
  2. Potek kode
  3. Povzetek

1. Primer funkcije

FileSystemObject nima neposredne metode za vstavljanje besedila na sredino datoteke ali brisanje določene vrstice, zato je treba vsebino prebrati, spremeniti in znova zapisati.

Spodnja funkcija je referenčni primer takega postopka.

Funkcijo editFile pokličete iz postopka Sub ter ji posredujete pot, način obdelave, številko vrstice, novo vsebino in obliko prelomov vrstic.

'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

Funkcija sprejme naslednje argumente:

  • filePath: polna pot do datoteke, na primer C:\Users\user\Desktop\test\test.txt.
  • mode: vrednost True vstavi vrstico, False pa izbrano vrstico izbriše.
  • targetRow: številka vrstice, pred katero se vstavi nova vsebina oziroma ki se izbriše.
  • targetInput: vsebina nove vrstice pri vstavljanju; pri brisanju se vrednost ne uporabi in je lahko prazna.
  • lineBreakType: True izbere vbCrLf, False pa vbLf. Za običajne besedilne datoteke sistema Windows se praviloma uporabi True.

Primer bere in zapisuje v kodiranju UTF-8. Če mora datoteka uporabljati drugo kodiranje, je treba dosledno spremeniti obe nastavitvi .Charset = "UTF-8" in rezultat preveriti z reprezentativnimi znaki.

Spodaj je primer klica funkcije.

Sub test()
 
'Primer dodajanja test123 v vrstico 5 v datoteki test.txt.(Datoteke, ustvarjene v sistemu Windows.)
editFile "C:\Users\user\Desktop\test\test.txt", True, 5, "test123", True
 
'Primer brisanja vrstice 5 v datoteki test.txt.(Datoteke, ustvarjene v sistemu Windows.)
editFile "C:\Users\user\Desktop\test\test.txt", False, 5, "", True
 
End Sub

Pri zelo preprosti datoteki z vrednostmi, ločenimi z vejico, je lahko vstavljena vrstica na primer "test1,test2,test3". To ni dovolj za splošni CSV: vejice, narekovaji in prelomi vrstic v poljih zahtevajo pravilno oblikovanje po pravilih CSV.

2. Potek kode

Funkcija najprej prebere celotno datoteko, nato poišče položaje prelomov vrstic in na koncu vsebino prepiše.

Okvirni potek vstavljanja je naslednji:

Vstavljanje vrstice:

  • 1: Prebere besedilno datoteko s poti, podane v argumentu.
  • 2: S štetjem prelomov vrstic poišče položaj pred ciljno vrstico. Pred peto vrstico so na primer štirje prelomi.
  • 3: Shrani del vsebine do konca četrte vrstice.
  • 4: Shrani del vsebine od pete vrstice naprej.
  • 5: Združi prvi del, novo vrstico iz argumenta in preostanek vsebine.
  • 6: Sestavljeno vsebino zapiše v datoteko.

Brisanje vrstice:

  • 1: Prebere besedilno datoteko s poti, podane v argumentu.
  • 2: S štetjem prelomov vrstic poišče položaj pred ciljno vrstico.
  • 3: Shrani del vsebine do konca četrte vrstice.
  • 4: Shrani del vsebine od šeste vrstice naprej.
  • 5: Združi oba dela in tako izpusti peto vrstico.
  • 6: Sestavljeno vsebino zapiše v datoteko.

V obeh primerih funkcija datoteke ne spreminja na mestu, temveč iz prebranih delov sestavi novo vsebino in z njo prepiše izvirnik. Zato pred uporabo ustvarite varnostno kopijo; odpornejša izvedba bi najprej zapisala začasno datoteko in nato izvedla preverjeno zamenjavo.

3. Povzetek

Primer prikazuje vstavljanje in brisanje vrstic v preprosti besedilni datoteki z VBA. Pred uporabo preverite kodiranje, vrsto prelomov vrstic, številko ciljne vrstice in ravnanje ob napaki. Za splošne datoteke CSV uporabite razčlenjevalnik, ki pravilno obravnava narekovaje in večvrstična polja.

Pri uporabi v novejšem okolju upoštevajte tudi opombe o različicah in varnosti na začetku članka.