Úprava CSV a textových súborov vo VBA pre Excel bez poškodenia dát


Dátum vydania:

Aktualizované:


Technické články > Úprava CSV a textových súborov vo VBA pre Excel bez poškodenia dát

Stav a bezpečné používanie v roku 2026

Záver: Obyčajný textový súbor spracúvajte po riadkoch iba vtedy, ak je jeho formát skutočne riadkový. Pole v CSV môže obsahovať čiarky, úvodzovky a zlomy riadkov, preto na všeobecné údaje CSV použite parser formátu CSV a pred nahradením originálu zapíšte výsledok do dočasného súboru.

Čo sa naučíte

  • Ako sa v jazyku VBA líšia režimy otvorenia súboru na čítanie, pridávanie a zápis.
  • Ako kódovanie, typ konca riadka, uzamknutie súboru a zotavenie po chybe ovplyvňujú prepis.
  • Prečo jednoduché rozdelenie reťazcov nie je bezpečné pre ľubovoľné záznamy CSV v štýle RFC.

Pre koho je to určené: Používatelia Excelu, ktorí udržiavajú malé a kontrolované makrá na spracovanie textu.

Kontext v roku 2026: Pôvodné makro ukazuje konkrétny lokálny postup a nie je univerzálnym bezstratovým parserom CSV. Pracujte so zálohou reprezentatívnych súborov, otestujte hodnoty v úvodzovkách aj viacriadkové polia a nikdy neprepisujte jedinú produkčnú kópiu.

Bezpečnostná poznámka: Príkazy a príklady konfigurácie v pôvodnom článku neboli znovu spustené v aktuálnom produkčnom prostredí. Pred ich použitím overte podporované verzie, zálohy, prístupové oprávnenia a postup obnovy v oddelenom testovacom prostredí.

Hlavné oficiálne zdroje

Prehľad

Táto príručka ukazuje úpravu súborov CSV a obyčajných textových súborov pomocou makra VBA v Exceli. Zameriava sa na tieto úlohy:

  • vloženie riadka alebo textu do existujúceho súboru CSV či textového súboru;
  • odstránenie riadka z existujúceho súboru CSV či textového súboru.

Obsah

  1. Postup
  2. Vysvetlenie kódu
  3. Zhrnutie

1. Postup

FileSystemObject nemá priamu operáciu na vloženie textu uprostred riadka ani na odstránenie konkrétneho riadka. Takúto úpravu preto treba naprogramovať.

Nasledujúci príklad načíta celý súbor, zostaví nový obsah a pôvodný súbor prepíše.

Kód je zapísaný ako funkcia. Funkciu možno vložiť do modulu a volať ju z procedúry 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

Funkcia prijíma nasledujúce argumenty:

  • filePath: úplná cesta k súboru, napríklad C:\Users\user\Desktop\test\test.txt;
  • mode: hodnota True vloží riadok, hodnota False ho odstráni;
  • targetRow: číslo riadka, pred ktorý sa má nový obsah vložiť, alebo číslo riadka, ktorý sa má odstrániť;
  • targetInput: text vkladaného riadka; pri odstraňovaní sa nepoužíva a môže zostať prázdny;
  • lineBreakType: hodnota True použije vbCrLf, hodnota False použije vbLf. Pre bežný textový súbor vytvorený vo Windows sa používa True.

Príklad používa UTF-8. Pri inom kódovaní treba upraviť obe miesta s nastavením .Charset = "UTF-8".

Nasledujúca procedúra ukazuje volanie funkcie.

Sub test()
 
'Príklad pridania test123 do riadku 5 súboru test.txt.(Súbory vytvorené v systéme Windows.)
editFile "C:\Users\user\Desktop\test\test.txt", True, 5, "test123", True
 
'Príklad odstránenia riadku 5 z test.txt.(Súbory vytvorené v systéme Windows.)
editFile "C:\Users\user\Desktop\test\test.txt", False, 5, "", True
 
End Sub

Pri jednoduchom súbore CSV možno ako vkladaný riadok odovzdať reťazec oddelený čiarkami, napríklad "test1,test2,test3". Tento postup však správne nespracuje všeobecné polia CSV s čiarkami, úvodzovkami alebo zlomami riadkov.

2. Vysvetlenie kódu

Po ukážke použitia nasleduje stručné vysvetlenie algoritmu.

Podrobnosti sú priamo v kóde; základný priebeh je tento.

Pri vložení riadka:

  • 1. Načíta sa textový súbor z cesty odovzdanej v argumente.
  • 2. Podľa počtu koncov riadkov sa nájde pozícia cieľového riadka. Pred piatym riadkom sa napríklad hľadá štvrtý koniec riadka.
  • 3. Získa sa obsah pred cieľovým riadkom.
  • 4. Získa sa obsah od cieľového riadka po koniec súboru.
  • 5. Spojí sa obsah pred riadkom, nový text a zostávajúci obsah.
  • 6. Výsledný obsah sa zapíše späť do súboru.

Pri odstránení riadka:

  • 1. Načíta sa textový súbor z cesty odovzdanej v argumente.
  • 2. Podľa počtu koncov riadkov sa nájde pozícia cieľového riadka.
  • 3. Získa sa obsah pred riadkom, ktorý sa má odstrániť.
  • 4. Získa sa obsah od nasledujúceho riadka po koniec súboru.
  • 5. Obe časti sa spoja bez odstráneného riadka.
  • 6. Výsledný obsah sa zapíše späť do súboru.

V oboch prípadoch sa pôvodný súbor neupravuje priamo po častiach. Kód z neho zostaví nový reťazec a výsledkom prepíše súbor.

3. Zhrnutie

Ukážková funkcia vloží alebo odstráni riadok v kontrolovanom textovom súbore tak, že načíta celý obsah a súbor znova zapíše.

Pred použitím pracujte so zálohou, overte kódovanie a konce riadkov a na všeobecné súbory CSV použite parser, ktorý správne spracuje úvodzovky a viacriadkové polia.