Rediģēt CSV un teksta failus Excel VBA, nesabojājot datus


Publikācijas datums:

Atjaunināts:


Tehniskie raksti > Rediģēt CSV un teksta failus Excel VBA, nesabojājot datus

2026. gada statuss un droša lietošana

Galvenais: apstrādājiet teksta failu pa rindām tikai tad, ja tā formāts patiešām ir rindu orientēts. CSV laukā var būt komati, pēdiņas un rindu pārtraukumi, tāpēc vispārīgiem CSV datiem izmantojiet CSV formātu saprotošu parsētāju un pirms oriģināla aizstāšanas rakstiet pagaidu failā.

Ko jūs uzzināsiet

  • Kā atšķiras VBA failu ievades un izvades režīmi Input, Append un Output.
  • Kā kodēšana, jaunās rindas stils, failu bloķēšana un kļūdu atkopšana ietekmē pārrakstīšanu.
  • Kāpēc vienkārša virkņu sadalīšana nav droša patvaļīgiem RFC stila CSV ierakstiem.

Kam tas paredzēts: Excel lietotājiem, kuri uztur nelielus, kontrolētus teksta apstrādes makro.

2026. gada konteksts: sākotnējais makro parāda konkrētu lokālu darbplūsmu, nevis universālu CSV bibliotēku bez datu zuduma. Izveidojiet raksturīgu failu dublējumus, pārbaudiet laukus pēdiņās un vairākrindu vērtības un nepārrakstiet vienīgo ražošanas datu kopiju.

Drošības piezīme. Sākotnējā rakstā esošās komandas un konfigurācijas piemēri nav atkārtoti izpildīti pašreizējā ražošanas vidē. Pirms to lietošanas pārbaudiet atbalstītās versijas, dublējumus, piekļuves vadīklas un atcelšanas darbības atsevišķā testa vidē.

Galvenie oficiālie avoti

Pārskats

Šajā rakstā parādīts, kā ar VBA (Excel makro) rediģēt CSV un teksta failus. Piemērs aptver šādus uzdevumus.

  • Pievienot rindu esošam CSV vai teksta failam vai ievietot tekstu starp esošajām rindām.
  • Dzēst noteiktu rindu no esoša CSV vai teksta faila.

Satura rādītājs

  1. Risinājuma izveide
  2. Koda skaidrojums
  3. Kopsavilkums

1. Risinājuma izveide

FileSystemObject nevar faila vidū ievietot tekstu vai izdzēst vienu izraudzītu rindu tieši. Parasti saturs jāielasa atmiņā, jāizmaina un pēc tam fails droši jāpārraksta.

Tālāk dots šādas apstrādes piemērs.

Piemērā darbība definēta kā Function, ko var izsaukt no Sub procedūras. Pirms pielāgošanas pārskatiet kļūdu apstrādi, dublēšanu un faila kodējumu.

'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 jānodod šādi argumenti.

  • filePath — pilns faila ceļš. Piemērs: C:\Users\user\Desktop\test\test.txt
  • mode — True pievieno rindu, bet False dzēš rindu.
  • targetRow — mērķa rindas numurs: vieta, kur ievietot jauno rindu, vai dzēšamās rindas numurs.
  • targetInput — pievienojamā vērtība. Dzēšanas režīmā šo argumentu neizmanto, tāpēc var nodot arī tukšu virkni.
  • lineBreakType — rindu beigu veids. True izmanto vbCrLf, bet False — vbLf; Windows vidē veidotiem failiem parasti izmanto True.

Piemērā izmantots UTF-8 kodējums. Lai to mainītu, abās vietās, kur norādīts ".Charset = "UTF-8"", pielāgojiet funkcijas kodu un pārbaudiet, vai rakstzīmes pēc ierakstīšanas un atkārtotas nolasīšanas nav izmainītas.

Tālāk parādīts funkcijas izsaukuma piemērs.

Sub test()
 
'Test123 pievienošanas piemērs test.txt 5. rindai.(Failus, kas izveidoti operētājsistēmā Windows.)
editFile "C:\Users\user\Desktop\test\test.txt", True, 5, "test123", True
 
'Test.txt 5. rindas dzēšanas piemērs.(Failus, kas izveidoti operētājsistēmā Windows.)
editFile "C:\Users\user\Desktop\test\test.txt", False, 5, "", True
 
End Sub

Lai pievienotu vienkāršu CSV rindu, argumentā var nodot ar komatiem atdalītu virkni, piemēram, "test1,test2,test3". Šis piemērs nekodē komatus, rindu pārtraukumus vai pēdiņas pašos laukos; ja tādas vērtības ir iespējamas, izmantojiet CSV formātam piemērotu risinājumu.

2. Koda skaidrojums

Pēc lietošanas piemēra aplūkosim, kā darbojas kods.

Detalizēta īstenošana redzama kodā; pievienošanas procesa pamatsoļi ir šādi.

Rindas pievienošana

  • 1. Nolasa teksta failu no argumentā norādītā ceļa.
  • 2. Pēc rindu pārtraukumiem atrod pozīciju pirms mērķa rindas. Piemēram, pirms 5. rindas ir četri rindu pārtraukumi, tāpēc jāatrod ceturtā pārtraukuma pozīcija.
  • 3. Iegūst saturu līdz 4. rindas beigām.
  • 4. Ar tādu pašu paņēmienu iegūst saturu no 5. rindas.
  • 5. Apvieno sākuma daļu, argumentā nodoto jauno saturu un atlikušo daļu.
  • 6. No apvienotā satura izveido failu un pārraksta iepriekšējo failu.

Rindas dzēšana

  • 1. Nolasa teksta failu no argumentā norādītā ceļa.
  • 2. Pēc rindu pārtraukumiem atrod pozīciju pirms mērķa rindas.
  • 3. Iegūst saturu līdz 4. rindas beigām.
  • 4. Ar tādu pašu paņēmienu iegūst saturu no 6. rindas.
  • 5. Apvieno abas daļas, izveidojot virkni bez 5. rindas.
  • 6. No apvienotā satura izveido failu un pārraksta iepriekšējo failu.

Abos gadījumos fails netiek rediģēts vietā. No sākotnējā satura izveido vajadzīgo jauno saturu un pēc tam visu failu pārraksta.

3. Kopsavilkums

Piemērā parādīta faila rediģēšanas pamatplūsma ar VBA. Pirms tās izmantošanas svarīgiem CSV vai teksta datiem izmēģiniet makro ar kopiju un pārbaudiet kodējumu, rindu beigas un kļūdu gadījumus.