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
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.