CSV és szövegfájlok szerkesztése Excel VBA-ban az adatok megsértése nélkül


Közzétéve:

Frissítve:


Cikkek › CSV és szövegfájlok szerkesztése Excel VBA-ban az adatok megsértése nélkül

A 2026-os helyzet és biztonságos használat

Következtetés: A sima szöveges fájlt csak akkor kezelje sorként, ha a formátuma valóban sororientált. A CSV-mezők vesszőt, idézőjeleket és sortöréseket tartalmazhatnak, ezért használjon CSV-tudatos elemzőt az általános CSV-adatokhoz, és írjon egy ideiglenes fájlba, mielőtt lecserélné az eredetit.

Amit megtudhat

  • Hogyan különböznek a VBA fájl I/O-módjai a bemenet, a hozzáfűzés és a kimenet tekintetében.
  • Hogyan befolyásolja a kódolás, az újsor stílusa, a fájlok zárolása és a hibák helyreállítása az újraírást.
  • Miért nem biztonságos az egyszerű karakterláncfelosztás tetszőleges RFC-stílusú CSV-rekordok esetén?

Kinek szól a cikk: Excel-felhasználóknak, akik kisméretű, ellenőrzött szövegfeldolgozási makrókat tartanak fenn.

Aktuális helyzet 2026-ban: Az eredeti makró egy adott helyi munkafolyamatot mutat be, és nem lett általánosítva veszteségmentes CSV-könyvtárrá. Készítsen biztonsági másolatot a reprezentatív fájlokról, tesztelje az idézett és többsoros értékeket, és ne futtasson átírást az egyetlen éles példányon.

Biztonsági megjegyzés: Az eredeti cikk parancsait és konfigurációs példáit nem futtattuk újra modern éles környezetben. Alkalmazás előtt ellenőrizze a támogatott verziókat, készítsen biztonsági másolatot, és külön tesztkörnyezetben készítse elő a visszaállítást.

Hivatalos források

Áttekintés

A következőkben ismertetjük, hogyan lehet csv és szöveges fájlokat szerkeszteni VBA-val (Excel makrók). A cikk azoknak szól, akik a következő feladatokat szeretnék programozni

  • Sorokat szeretnék hozzáadni egy már meglévő csv- vagy szöveges fájlhoz. Szöveget szeretnék hozzáadni egy sor közepén.
  • Egy már meglévő csv- vagy szöveges fájlból szeretnék sorokat törölni.

Tartalomjegyzék

  1. Programozási módszer
  2. Kód Leírás.
  3. Összefoglalás

1. Programozási módszer

Összefoglalva, a FileSystemObject nem képes a sor közepén csatolni vagy törölni egy adott sort, ezért ezt magadnak kell programoznod.

A programozásra vonatkozó referenciapéldák az alábbiakban találhatók.

Mivel a Function-ben jön létre, szeretném, ha másolással és beillesztéssel úgy hoznám be, ahogy van, és a metódushívások a Sub-ból történnének.

'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

Használatához adja meg az argumentumokat a következőképpen.

  • filePath···Ez lesz a fájl teljes elérési útvonala. Példa).C:\Users\user\Desktop\test\test.txt
  • mode···Pass true, false. Ha True, add. Ha false, törli a sort.
  • targetRow···Megadja a célsorok számát. Hozzáadás esetén a hozzáadandó sorok száma, törlés esetén pedig a törlendő sorok száma.
  • targetInput···Utóirat esetén adja meg a csatolandó értéket. Törlésre nem használatos, és tetszőleges érték lehet. Az üres betűk is elfogadhatók.
  • lineBreakType···Újsor karakterek beállítása. Ha True, vbCrLf. vbLf if False. Röviden: Igaz a Windowsban létrehozott fájlokra.

A karakterkódolás UTF-8, de ha meg akarja változtatni, közvetlenül a Function kódot módosíthatja. Két helyen van ".Charset = "UTF-8"".

Az alábbiakban egy tényleges függvényhívás példaimplementációja látható.

Sub test()
 
'Példa a test123 csatolására a test.txt 5. sorához.(Windowsban létrehozott fájlok.)
editFile "C:\Users\user\Desktop\test\test.txt", True, 5, "test123", True
 
'Példa a test.txt 5. sorának törlésére.(Windowsban létrehozott fájlok.)
editFile "C:\Users\user\Desktop\test\test.txt", False, 5, "", True
 
End Sub

Ha csv-ként szeretné csatolni, a csatolandó érték argumentumát tegye vesszővel elválasztott értékké, és egy vesszővel elválasztott érték lesz csatolva. Példa)."test1,test2,test3"

2. Kód Leírás.

Itt ér véget a rendszer használatára vonatkozó utasítás, amelyet a kód magyarázata követ.

A részletek a kódban találhatók, de a durva folyamatmenet a következő.

Utóiratnak.

  • 1.Szöveges fájlok olvasása az argumentumként átadott elérési utakban.
  • 2.A karakterek száma az argumentumban átadott sorok számáig az újsorok számából adódik. Például az 5. sorban négy sortörés van az 5. sor előtt, tehát keresse meg azt a pozíciót, ahol a negyedik sortörés található.
  • 3.Információ lekérdezése a 4. sorig.
  • 4. (2) Szerezze be az információkat az 5. sortól kezdve a (2) bekezdéssel megegyező módon.
  • 5.A (3) információ, az argumentumként átadott, csatolandó információ és a (4) információ kombinálódik.
  • 6.Hozzon létre egy fájlt az (5) pontban megadott információk alapján, és írja felül a fájlt.

Törlés esetén

  • 1.Szöveges fájlok olvasása az argumentumként átadott elérési utakban.
  • 2.A karakterek száma az argumentumban átadott sorok számáig az újsorok számából adódik. Például az 5. sorban négy sortörés van az 5. sor előtt, tehát keresse meg azt a pozíciót, ahol a negyedik sortörés található.
  • 3.Információ lekérdezése a 4. sorig.
  • 4. (2) A 6. sortól kezdődően a (2) bekezdéssel megegyező módon szerezze be az információkat.
  • 5.A iii. és iv. pontban szereplő információk együttesen szerepelnek. (Hozzon létre egy stringet ötödik sor nélkül).
  • 6.Hozzon létre egy fájlt az (5) pontban megadott információk alapján, és írja felül a fájlt.

A csatolás és a törlés esetében mindkettő ugyanaz, de a fájl szerkesztése helyett úgy történik, mintha csak a szükséges információkat vennénk ki az eredeti fájlból, és egy új fájlt hoznánk létre és mentenénk át.

3. összefoglaló

Ha problémái vannak a csv/text fájlok VBA-val (Excel makrók) történő szerkesztésével, kérjük, olvassa el ezt a részt.

Ezek a legfontosabb figyelembe veendő lépések és korlátozások.