Muuda CSV ja tekstifaile Excel VBA-s ilma andmeid rikkumata


Avaldatud:

Uuendatud:


Artiklid › Muuda CSV ja tekstifaile Excel VBA-s ilma andmeid rikkumata

Olukord 2026. aastal ja ohutu kasutamine

Järeldus: käsitlege lihttekstifaili ridadena ainult siis, kui selle vorming on tõesti reale orienteeritud. CSV-väli võib sisaldada komasid, jutumärke ja reavahetusi, seega kasutage üldiste CSV-andmete jaoks CSV-teadlikku parserit ja kirjutage enne originaali asendamist ajutisse faili.

Mida õpid

  • Kuidas erinevad VBA faili sisend-/väljundrežiimid sisendi, lisamise ja väljundi osas.
  • Kuidas kodeerimine, reavahetusstiil, failide lukustamine ja vigade taastamine mõjutavad ümberkirjutamist.
  • Miks on lihtne stringi poolitamine suvaliste RFC-stiilis CSV-kirjete puhul ohtlik.

Kellele artikkel on mõeldud: Exceli kasutajad, kes haldavad väikseid kontrollitud tekstitöötlusmakrosid.

Olukord 2026. aastal: algne makro näitab konkreetset kohalikku töövoogu ja seda ei ole üldistatud kadudeta CSV-teegiks. Varundage tüüpilised failid, testige tsiteeritud ja mitmerealisi väärtusi ning ärge käivitage ainsa tootmiskoopiaga ümberkirjutamist.

Ohutusmärkus: Algse artikli käske ja seadistusnäiteid ei ole tänapäevases tootmiskeskkonnas uuesti käivitatud. Enne rakendamist kontrolli toetatud versioone, tee varukoopia ja valmista eraldi testkeskkonnas ette tagasipööramise plaan.

Ametlikud allikad

Ülevaade

Soovin kirjeldada, kuidas muuta csv- ja tekstifaile VBA (Exceli makrode) abil. Artikkel on mõeldud inimestele, kes soovivad programmeerida järgmisi ülesandeid

  • Ma tahan lisada ridu juba olemasolevasse csv- või tekstifaili. Ma tahan lisada teksti rea keskele.
  • Ma tahan kustutada ridu juba olemasolevas csv- või tekstifailis.

Sisukord

  1. Programmeerimismeetod
  2. Kood Kirjeldus.
  3. Kokkuvõte

1. Programmeerimismeetod

Kokkuvõttes ei ole FileSystemObjectil võimalik lisada rea keskel või kustutada konkreetset rida, seega peate selle ise programmeerima.

Allpool on toodud programmeerimisnäited.

Kuna see on loodud funktsioonis Function, sooviksin, et see oleks toodud sellisena, nagu see on, kopeerimise ja kleepimise teel ja et meetodikutsed oleksid tehtud Subist.

'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

Selle kasutamiseks edastage argumendid järgmiselt.

  • filePath···See on faili täielik tee. Näide).C:\Users\user\Desktop\test\test.txt
  • mode···Pass true, false. Kui True, lisage. Kui false, kustutage rida.
  • targetRow···Määrab sihtridade arvu. Lisamiste puhul on see lisatavate ridade arv ja kustutamiste puhul kustutatavate ridade arv.
  • targetInput···Postskriptide puhul määrake lisatav väärtus. Seda ei kasutata kustutamiseks ja see võib olla suvaline väärtus. Lubatud on ka tühjad tähed.
  • lineBreakType···Uue rea märkide seadmine. Kui True, siis vbCrLf. vbLf kui False. Umbkaudne selgitus on Windowsis loodud failide puhul Tõsi.

Märkide kodeerimine on UTF-8, kuid kui soovite seda muuta, muutke otse funktsiooni koodi. On kaks kohta, kus ".Charset = "UTF-8"".

Allpool on esitatud näide tegeliku funktsioonikõne rakendamisest.

Sub test()
 
'Näide test123 lisamisest test.txt reale 5.(Windowsis loodud failid.)
editFile "C:\Users\user\Desktop\test\test.txt", True, 5, "test123", True
 
'Näide test.txt 5. rea kustutamise kohta.(Windowsis loodud failid.)
editFile "C:\Users\user\Desktop\test\test.txt", False, 5, "", True
 
End Sub

Kui soovite lisada csv-formaadis, tehke liidetava väärtuse argumendiks komadega eraldatud väärtus, siis liidetakse komadega eraldatud väärtus. Näide)."test1,test2,test3"

2. Kood Kirjeldus.

Sellega lõpeb süsteemi kasutusjuhend, millele järgneb koodi selgitus.

Üksikasjad on leitavad koodist, kuid ligikaudne protsessivoog on järgmine.

Järelduseks.

  • 1.Tekstifailide lugemine argumentidena edastatud teekondades.
  • 2.Tähemärkide arv kuni argumendiks edastatud ridade arvuni on määratud uusridade arvust. Näiteks 5. rea puhul on enne 5. rida neli reavahet, seega leidke koht, kus asub neljas reavahetus
  • 3.Tooge teavet kuni reani 4.
  • 4. (ii) Hankige teavet alates reast 5 samamoodi nagu punktis ii).
  • 5.Punktis (3) esitatud teave, argumendina edastatud lisatav teave ja punktis (4) esitatud teave kombineeritakse.
  • 6.Looge fail punktis (5) esitatud teabe põhjal ja kirjutage fail üle.

Kustutamise korral

  • 1.Tekstifailide lugemine argumentidena edastatud teekondades.
  • 2.Tähemärkide arv kuni argumendiks edastatud ridade arvuni on määratud uusridade arvust. Näiteks 5. rea puhul on enne 5. rida neli reavahet, seega leidke koht, kus asub neljas reavahetus
  • 3.Tooge teavet kuni reani 4.
  • 4. (ii) Hankige teavet alates reast 6 samamoodi nagu punktis ii).
  • 5.Punktides iii) ja iv) esitatud teave kombineeritakse. (Loo string ilma viienda reana).
  • 6.Looge fail punktis (5) esitatud teabe põhjal ja kirjutage fail üle.

Lisamise ja kustutamise puhul on mõlemad samad, kuid faili redigeerimise asemel tehakse nii, et algsest failist võetakse välja ainult vajalik teave ja luuakse uus fail, mis salvestatakse üle.

3. kokkuvõte

Kui teil on probleeme csv/tekstifailide redigeerimisega VBA (Exceli makrode) abil, vaadake seda jaotist.

Need on peamised sammud ja piirangud, mida tuleb arvestada.