CSV ir teksto failų redagavimas su Excel VBA


Paskelbimo data:

Atnaujinta:


Techniniai straipsniai > CSV ir teksto failų redagavimas su Excel VBA

2026 m. būsena ir saugus naudojimas

Išvada: teksto failą apdorokite eilutėmis tik tada, kai jo formatas iš tiesų yra eilutinis. CSV laukuose gali būti kablelių, kabučių ir eilučių lūžių, todėl bendruoju atveju naudokite CSV formatą išmanantį analizatorių ir prieš pakeisdami originalą rašykite į laikiną failą.

Ką išmoksite

  • Kuo skiriasi VBA failų atvėrimo režimai Input, Append ir Output.
  • Kaip kodavimas, naujos eilutės stilius, failų užrakinimas ir klaidų atkūrimas veikia perrašymą.
  • Kodėl paprastas eilučių skaidymas yra nesaugus savavališkiems RFC stiliaus CSV įrašams.

Kam tai skirta: Excel naudotojams, prižiūrintiems nedideles, kontroliuojamas teksto apdorojimo makrokomandas.

2026 m. kontekstas: pradinė makrokomanda demonstruoja konkrečią vietinę darbo eigą, o ne universalų CSV failų apdorojimą be duomenų praradimo. Išbandykite tipinių failų kopijas, ypač laukus su kabutėmis ar eilučių lūžiais, ir niekada neperrašykite vienintelės gamybinių duomenų kopijos.

Saugos pastaba: pradiniame straipsnyje pateiktos komandos ir konfigūracijos pavyzdžiai nebuvo pakartotinai vykdomi dabartinėje gamybos aplinkoje. Prieš taikydami, patikrinkite palaikomas versijas, atsargines kopijas, prieigos valdiklius ir atšaukimo veiksmus atskiroje bandymo aplinkoje.

Pagrindiniai oficialūs šaltiniai

Apžvalga

Šiame straipsnyje parodyta, kaip su VBA makrokomanda įterpti arba pašalinti eilutę paprastame CSV ar teksto faile. Pavyzdys skirtas šioms užduotims:

  • įterpti tekstą į nurodytą esamo CSV ar teksto failo eilutę;
  • pašalinti nurodytą esamo CSV ar teksto failo eilutę.

Turinys

  1. Programavimo metodas
  2. Kodo paaiškinimas
  3. Santrauka

1. Programavimo metodas

FileSystemObject neturi atskiro metodo eilutei failo viduryje įterpti ar pašalinti. Pavyzdinė funkcija perskaito turinį, suformuoja naują tekstą ir perrašo failą.

Toliau pateikiamas funkcijos pavyzdys.

Funkcija kviečiama iš Sub procedūros. Prieš naudodami ją savo duomenims, perskaitykite kodą ir išbandykite su kopija.

'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

Funkcijai perduodami šie argumentai:

  • filePath: visas failo kelias, pavyzdžiui, C:\Users\user\Desktop\test\test.txt.
  • mode: True įterpia eilutę, o False ją pašalina.
  • targetRow: eilutės numeris, prieš kurį įterpiamas tekstas, arba pašalinamos eilutės numeris.
  • targetInput: įterpiamas tekstas; šalinimo režime ši reikšmė nenaudojama ir gali būti tuščia.
  • lineBreakType: True naudoja vbCrLf, o False – vbLf. Reikšmę rinkitės pagal konkretaus failo eilučių pabaigas.

Pavyzdyje naudojama UTF-8 koduotė. Norėdami ją pakeisti, abiejose funkcijos vietose pataisykite nuostatą „.Charset = "UTF-8"“.

Toliau pateikiamas faktinio funkcijos iškvietimo įgyvendinimo pavyzdys.

Sub test()
 
'Pavyzdys, kaip prie test.txt 5 eilutės pridėti test123.("Windows" sukurti failai.)
editFile "C:\Users\user\Desktop\test\test.txt", True, 5, "test123", True
 
'Test.txt 5 eilutės ištrynimo pavyzdys.("Windows" sukurti failai.)
editFile "C:\Users\user\Desktop\test\test.txt", False, 5, "", True
 
End Sub

Paprastam CSV pavyzdžiui įterpiamą eilutę galima perduoti kaip „test1,test2,test3“. Jei laukuose gali būti kablelių, kabučių ar eilučių lūžių, vien tokio sujungimo nepakanka – naudokite CSV formatą išmanantį analizatorių.

2. Kodo paaiškinimas

Toliau apibendrinta funkcijos veikimo eiga.

Eilutės įterpimas

  • 1. Perskaitomas filePath nurodytas teksto failas.
  • 2. Pagal eilučių pabaigas randama įterpimo vieta. Pavyzdžiui, prieš penktą eilutę yra keturios eilučių pabaigos.
  • 3. Išsaugoma teksto dalis iki ketvirtos eilutės.
  • 4. Išsaugoma teksto dalis nuo penktos eilutės.
  • 5. Abi dalys sujungiamos, tarp jų įterpiant targetInput.
  • 6. Gautas turinys įrašomas į failą.

Eilutės pašalinimas

  • 1. Perskaitomas filePath nurodytas teksto failas.
  • 2. Pagal eilučių pabaigas randama šalinamos eilutės pradžia ir pabaiga.
  • 3. Išsaugoma dalis iki šalinamos eilutės.
  • 4. Išsaugoma dalis po šalinamos eilutės.
  • 5. Abi dalys sujungiamos, praleidžiant pasirinktą eilutę.
  • 6. Gautas turinys įrašomas į failą.

Abiem atvejais failas neredaguojamas vietoje: iš originalo suformuojamas naujas turinys ir juo perrašomas failas. Todėl prieš vykdant būtina turėti atsarginę kopiją.

3. Santrauka

Pavyzdinė VBA funkcija gali įterpti arba pašalinti eilutę kontroliuojamo formato teksto faile. Bendriesiems CSV duomenims rinkitės CSV analizatorių, o prieš perrašydami visada išbandykite kopiją.