Edytowanie plików CSV i tekstowych w Excel VBA bez uszkadzania danych


Data publikacji:

Aktualizacja:


Artykuły > Edytowanie plików CSV i tekstowych w Excel VBA bez uszkadzania danych

Stan na rok 2026 i bezpieczne użytkowanie

Wniosek: Traktuj zwykły plik tekstowy jako linie tylko wtedy, gdy jego format rzeczywiście jest zorientowany liniowo. Pole CSV może zawierać przecinki, cudzysłowy i podziały wierszy, dlatego przed zastąpieniem oryginału użyj parsera obsługującego CSV i zapisz w pliku tymczasowym.

Czego się nauczysz

  • Czym różnią się tryby we/wy plików VBA w zakresie wprowadzania, dołączania i wyprowadzania.
  • Jak kodowanie, styl nowej linii, blokowanie plików i usuwanie błędów wpływają na przepisanie.
  • Dlaczego proste dzielenie ciągów jest niebezpieczne w przypadku dowolnych rekordów CSV w stylu RFC.

Dla kogo: Użytkownicy programu Excel obsługujący małe, kontrolowane makra do przetwarzania tekstu.

Pozycja na rok 2026: Oryginalne makro demonstruje konkretny lokalny przepływ pracy i nie zostało uogólnione na bezstratną bibliotekę CSV. Twórz kopie zapasowe reprezentatywnych plików, testuj wartości cytowane i wielowierszowe i nie wykonuj przepisywania jedynej kopii produkcyjnej.

Uwaga dotycząca bezpieczeństwa: polecenia i przykłady konfiguracji z pierwotnego artykułu nie zostały ponownie uruchomione we współczesnym środowisku produkcyjnym. Przed użyciem sprawdź wspierane wersje, kopie zapasowe, kontrolę dostępu i procedurę wycofania w oddzielnym środowisku testowym.

Oficjalne źródła pierwotne

Przegląd

W tej sekcji opisano jak edytować pliki csv i tekstowe za pomocą VBA (makra Excela). Artykuł przeznaczony jest dla osób, które chcą zaprogramować następujące zadania

  • Chcę dodać wiersze do już istniejącego pliku csv lub tekstowego. Chcę dodać tekst w środku linii.
  • Chcę usunąć linie w już istniejącym pliku csv lub tekstowym.

Spis treści

  1. Metoda programowania
  2. Kod Opis.
  3. streszczenie

1. Metoda programowania

Podsumowując, FileSystemObject nie ma możliwości dołączenia w środku linii lub usunięcia konkretnej linii, więc musisz zaprogramować to sam.

Poniżej podano referencyjne przykłady programowania.

Ponieważ jest on tworzony w Function, mam nadzieję, że możesz go wprowadzić tak, jak jest przez kopiowanie i wklejanie, i mieć to wywołanie metod z 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

Aby go użyć, przekaż argumenty w następujący sposób.

  • filePath: Będzie to pełna ścieżka dostępu do pliku. Przykład.) C:\Users\user\Desktop\test\test.txt
  • mode: Pass true, false. Jeśli True, dodaj. Jeśli false, to usuń wiersz.
  • targetRow: Określa liczbę wierszy docelowych. W przypadku dodawania jest to liczba wierszy do dodania, a w przypadku usuwania jest to liczba wierszy do usunięcia.
  • targetInput: Dla postscriptów określ wartość, która ma być dołączona. Nie jest używany do usuwania i może być dowolną wartością. Dopuszczalne są również puste litery.
  • lineBreakType: Ustawienie znaków nowej linii. If True, vbCrLf. vbLf if False. W skrócie True dla plików utworzonych w systemie Windows.

Kodowanie znaków to UTF-8, ale jeśli chcesz je zmienić, zmodyfikuj bezpośrednio kod Function. Istnieją dwa miejsca, w których ".Charset = "UTF-8"".

Przykładowa implementacja rzeczywistego wywołania funkcji jest przedstawiona poniżej.

Sub test()
 
'Przykład dołączenia test123 do linii 5 pliku test.txt.(Pliki utworzone w systemie Windows.)
editFile "C:\Users\user\Desktop\test\test.txt", True, 5, "test123", True
 
'Przykład usunięcia linii 5 z pliku test.txt.(Pliki utworzone w systemie Windows.)
editFile "C:\Users\user\Desktop\test\test.txt", False, 5, "", True
 
End Sub

Jeśli chcesz dołączyć jako csv, uczyń argument wartości do dołączenia wartością rozdzieloną przecinkami, a wartość rozdzielona przecinkami zostanie dołączona. Przykład.)"test1,test2,test3"

2. Kod Opis.

Na tym kończy się instrukcja obsługi systemu, po czym następuje wyjaśnienie kodu.

Szczegóły można znaleźć w kodzie, ale przybliżony przepływ procesu jest następujący.

Za postscriptum.

  • 1. Odczyt plików tekstowych w ścieżkach przekazanych jako argumenty.
  • 2. Z liczby znaków do liczby linii przekazanych w argumencie określana jest liczba nowych linii. Na przykład, dla linii 5, są cztery przerwy przed linią 5, więc znajdź pozycję, gdzie znajduje się czwarta przerwa w linii
  • 3. Pobierz informacje do linii 4.
  • ④(2) Pozyskać informacje od wiersza 5 w taki sam sposób jak (2).
  • ⑤Informacje z (3), informacje do dołączenia przekazane jako argument oraz informacje z (4) są łączone razem.
  • ⑥Utwórz plik na podstawie informacji z (5) i nadpisz plik.

W przypadku usunięcia

  • 1. Odczyt plików tekstowych w ścieżkach przekazanych jako argumenty.
  • 2. Z liczby znaków do liczby linii przekazanych w argumencie określana jest liczba nowych linii. Na przykład, dla linii 5, są cztery przerwy przed linią 5, więc znajdź pozycję, gdzie znajduje się czwarta przerwa w linii
  • 3. Pobierz informacje do linii 4.
  • ④(2) Pozyskać informacje od wiersza 6 w taki sam sposób jak (2).
  • ⑤Informacje w punktach (iii) i (iv) są połączone razem. (Utwórz ciąg znaków bez piątej linii.)
  • ⑥Utwórz plik na podstawie informacji z (5) i nadpisz plik.

W przypadku dołączania i usuwania, oba są takie same, ale zamiast edytować plik, robi się to tak, jakby z oryginalnego pliku wyciągnięto tylko niezbędne informacje, a nowy plik jest tworzony i zapisywany nad nim.

3. streszczenie

Jeśli masz problemy z edycją plików csv/tekstowych za pomocą VBA (makra Excela), zapoznaj się z tym działem.

■INFORMATION

Artykuły


■PROFILE

Profil


■Kontakt

Kontakt