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
Secinājums: vienkārša teksta failu uzskatiet par rindām tikai tad, ja tā formāts patiešām ir orientēts uz rindiņām. CSV laukā var būt komats, pēdiņas un rindiņu pārtraukumi, tāpēc vispārīgiem CSV datiem izmantojiet CSV parsētāju un pirms oriģināla aizstāšanas ierakstiet pagaidu failā.
Ko jūs uzzināsiet
- Kā atšķiras VBA failu ievades/izvades režīmi ievadei, pievienošanai un izvadei.
- 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 ir paredzēts: Excel lietotājiem, kas uztur mazus, kontrolētus teksta apstrādes makro.
2026. gada konteksts: sākotnējais makro parāda noteiktu lokālo darbplūsmu, un tas nav vispārināts par bezzudumu CSV bibliotēku. Dublējiet reprezentatīvos failus, pārbaudiet citētās un vairākrindu vērtības un neveiciet pārrakstīšanu, izmantojot vienīgo produkcijas 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.
Vēlos aprakstīt, kā rediģēt csv un teksta failus, izmantojot VBA (Excel makrus). Šis raksts ir paredzēts cilvēkiem, kuri vēlas ieprogrammēt šādus uzdevumus.
- Es gribu pievienot rindas jau esošam csv vai teksta datnei. Vēlos pievienot tekstu rindas vidū.
- Vēlos dzēst rindas jau esošā csv vai teksta failā.
Satura rādītājs
1. Programmēšanas metode
Nobeigumā jāsecina, ka FileSystemObject nespēj pievienot rindas vidū vai izdzēst konkrētu rindu, tāpēc tas ir jāprogrammē pašam.
Tālāk ir sniegti atsauces piemēri par programmēšanu.
Tā kā tas ir izveidots funkcijā Function, es gribētu, lai tas tiktu ievietots, kā tas ir, kopējot un ielīmējot, un lai metodes izsaukumi tiktu veikti no Sub.
'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
Lai to izmantotu, iesniedziet šādus argumentus.
- filePath: Tas būs pilns faila ceļš. Piemērs.)C:\Users\user\Desktop\test\test.txt
- mode: Pass true, false. Ja ir True, pievienojiet. Ja false, izdzēsiet rindu.
- targetRow: Norāda mērķa rindu skaitu. Pievienošanas gadījumā tas ir pievienojamo rindu skaits, bet dzēšanas gadījumā - dzēšamo rindu skaits.
- targetInput: Postskriptu gadījumā norādiet pievienojamo vērtību. To neizmanto dzēšanai, un tā var būt patvaļīga vērtība. Pieņemami ir arī tukši burti.
- lineBreakType: Jaunās rindiņas rakstzīmju iestatīšana. Ja True, vbCrLf. vbLf if False. Īsāk sakot, True - Windows sistēmā izveidotiem failiem.
Rakstzīmju kodējums ir UTF-8, bet, ja vēlaties to mainīt, modificējiet funkcijas kodu tieši. Ir divas vietas, kur ".Charset = "UTF-8"".
Tālāk ir parādīts faktiskā funkcijas izsaukuma implementācijas 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
Ja vēlaties pievienot kā csv, pievienojamās vērtības argumentu norādiet kā ar komatiem atdalītu vērtību, un tiks pievienota ar komatiem atdalīta vērtība. Piemērs.)"test1,test2,test3"
2. Kods Apraksts.
Tas ir sistēmas lietošanas pamācības beigas, kam seko koda skaidrojums.
Sīkāka informācija ir atrodama kodā, bet aptuvenā procesa plūsma ir šāda.
Postskriptam.
- 1: Teksta failu lasīšana ceļos, kas iesniegti kā argumenti.
- 2: Rakstzīmju skaits līdz argumentā nodoto rindu skaitam tiek noteikts no jauno rindu skaita. Piemēram, 5. rindā pirms 5. rindas ir četri rindu pārrāvumi, tāpēc atrodiet pozīciju, kurā atrodas ceturtais rindu pārrāvums.
- 3: Iegūstiet informāciju līdz 4. rindai.
- ④(2) Iegūstiet informāciju no 5. rindas un tālāk tādā pašā veidā kā 2. punktā.
- ⑤Informācija (3), pievienojamā informācija, kas nodota kā arguments, un informācija (4) tiek apvienota kopā.
- ⑥Izveidojiet datni, pamatojoties uz (5) sniegto informāciju, un pārrakstiet datni.
Dzēšanas gadījumā
- 1: Teksta failu lasīšana ceļos, kas iesniegti kā argumenti.
- 2: Rakstzīmju skaits līdz argumentā nodoto rindu skaitam tiek noteikts no jauno rindu skaita. Piemēram, 5. rindā pirms 5. rindas ir četri rindu pārrāvumi, tāpēc atrodiet pozīciju, kurā atrodas ceturtais rindu pārrāvums.
- 3: Iegūstiet informāciju līdz 4. rindai.
- ④(2) Iegūstiet informāciju no 6. rindas un tālāk tādā pašā veidā kā 2. punktā.
- ⑤Informācija iii) un iv) apakšpunktā ir apvienota kopā. (Izveido virkni bez piektās rindas.)
- ⑥Izveidojiet datni, pamatojoties uz (5) sniegto informāciju, un pārrakstiet datni.
Gan pievienošanas, gan dzēšanas gadījumā abas darbības ir vienādas, taču tā vietā, lai rediģētu failu, no sākotnējā faila tiek izņemta tikai nepieciešamā informācija, un tiek izveidots jauns fails, kas tiek saglabāts no jauna.
3. kopsavilkums
Ja jums rodas problēmas ar csv/teksta failu rediģēšanu, izmantojot VBA (Excel makrus), skatiet šo sadaļu.
Paldies, ka noskatījāties līdz beigām.