Ú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
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.
Technické články
Profil
Kontakt