Редактирайте CSV и текстови файлове в Excel VBA без да повредите данните
Публикувано:
Актуализирано:
Статии › Редактирайте CSV и текстови файлове в Excel VBA без да повредите данните
Състояние през 2026 г. и безопасна употреба
Заключение: Третирайте обикновен текстов файл като линии само когато форматът му наистина е ориентиран към линия. Поле CSV може да съдържа запетайки, кавички и прекъсвания на линиите, така че използвайте CSV-ауер парсер за общи данни CSV и напишете на временен файл преди да замените оригинала.
Какво ще научите
- Как режимите I/O на VBA се различават за вход, приложение и изход.
- Как кодирането, новият стил, заключването на файлове и възстановяването на грешки влияят на пренаписване.
- Защо просто низ разделяне е опасно за произволни RFC стил CSV записи.
За кого е статията: Excel потребителите поддържат малки, контролирани макроси за обработка на текстове.
Актуално към 2026 г.: Оригиналният макро показва конкретен местен работен процес и не е обобщен в без загуба CSV библиотека. Подкрепете представителните файлове, изпитайте цитираните и мултилинейните стойности и не пренаписвайте срещу единственото копие на продукцията.
Бележка за безопасност: Командите и конфигурационните примери в първоначалната статия не са изпълнявани повторно в съвременна производствена среда. Преди прилагане проверете поддържаните версии, направете резервно копие и подгответе план за връщане в отделна тестова среда.
Официални източници
Преглед
Тук е описано как да редактирам csv и текстови файлове с VBA (макроси на Excel). Статията е предназначена за хора, които искат да програмират следните задачи
- Искам да добавя редове към вече съществуващ csv или текстов файл. Искам да добавя текст в средата на един ред.
- Искам да изтрия редове във вече съществуващ csv или текстов файл.
Съдържание
1. Метод на програмиране
В заключение, FileSystemObject няма възможност за добавяне в средата на реда или за изтриване на определен ред, така че трябва да го програмирате сами.
По-долу са дадени референтни примери за програмиране.
Тъй като тя е създадена във Function, бих искал да я въведа така, както е, чрез копиране и поставяне, а извикванията на методите да се извършват от 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
За да го използвате, подайте следните аргументи.
- filePath···Това ще бъде пълният път до файла. Пример).C:\Users\user\Desktop\test\test.txt
- mode···Предайте true, false. Ако е True, добавете. Ако е false, изтрийте реда.
- targetRow···Посочва броя на целевите редове. В случай на добавяне това е броят на редовете, които трябва да бъдат добавени, а в случай на изтриване - броят на редовете, които трябва да бъдат изтрити.
- targetInput···За постскриптовете посочете стойността, която да бъде добавена. Тя не се използва за изтриване и може да бъде произволна стойност. Празните букви също са приемливи.
- lineBreakType···Задаване на знаци за нов ред. Ако е вярно, vbCrLf. vbLf if False. Накратко, Вярно за файлове, създадени в Windows.
Кодирането на символите е UTF-8, но ако искате да го промените, променете директно кода на функцията. Има две места, където ".Charset = "UTF-8"".
По-долу е показан пример за изпълнение на действителното извикване на функция.
Sub test()
'Пример за добавяне на test123 към ред 5 на test.txt.(Файлове, създадени в Windows.)
editFile "C:\Users\user\Desktop\test\test.txt", True, 5, "test123", True
'Пример за изтриване на ред 5 от test.txt.(Файлове, създадени в Windows.)
editFile "C:\Users\user\Desktop\test\test.txt", False, 5, "", True
End Sub
Ако искате да приложите като csv, направете аргумента на стойността, която трябва да бъде приложена, стойност, разделена на запетаи, и ще бъде приложена стойност, разделена на запетаи. Пример)."test1,test2,test3"
2. Код Описание.
Това е краят на инструкциите за използване на системата, последвани от обяснение на кода.
Подробностите могат да бъдат намерени в кода, но приблизителният ход на процеса е следният.
За постскриптум.
- 1.Четене на текстови файлове по пътища, подадени като аргументи.
- 2.Броят на символите до броя на редовете, подадени в аргумента, се определя от броя на новите редове. Например за ред 5 има четири прекъсвания на реда преди ред 5, така че намерете позицията, в която се намира четвъртото прекъсване на реда.
- 3.Извличане на информация до ред 4.
- 4. (2) Съберете информация от ред 5 нататък по същия начин, както в точка 2.
- 5.Информацията в (3), информацията, която трябва да се добави, предадена като аргумент, и информацията в (4) се комбинират заедно.
- 6.Създайте файл въз основа на информацията в (5) и презапишете файла.
В случай на изтриване
- 1.Четене на текстови файлове по пътища, подадени като аргументи.
- 2.Броят на символите до броя на редовете, подадени в аргумента, се определя от броя на новите редове. Например за ред 5 има четири прекъсвания на реда преди ред 5, така че намерете позицията, в която се намира четвъртото прекъсване на реда.
- 3.Извличане на информация до ред 4.
- 4. (2) Съберете информация от ред 6 нататък по същия начин, както в точка 2.
- 5.Информацията в точки iii) и iv) се комбинира заедно. (Създаване на низ без пети ред).
- 6.Създайте файл въз основа на информацията в (5) и презапишете файла.
При добавянето и изтриването става въпрос за едно и също действие, но вместо да се редактира файлът, от оригиналния файл се извлича само необходимата информация и се създава нов файл, който се записва наново.
3. резюме
Ако имате проблеми с редактирането на csv/текстови файлове с VBA (макроси на Excel), вижте този раздел.
Това са основните стъпки и ограничения, които трябва да имате предвид.