Mengedit file CSV dan teks dengan aman di Excel VBA


Tanggal publikasi:

Diperbarui:


Artikel teknis > Mengedit file CSV dan teks dengan aman di Excel VBA

Konteks 2026 dan penggunaan yang aman

Kesimpulan: Perlakukan berkas teks biasa sebagai baris hanya ketika format benar-benar line- berorientasi. Bidang CSV dapat memuat koma, kutipan, dan jeda baris, jadi gunakan parser CSV-aware untuk data umum CSV dan tulis ke file sementara sebelum mengganti yang asli.

Yang akan Anda pelajari

  • Bagaimana mode I / O file VBA berbeda untuk masukan, penambahan, dan keluaran.
  • Cara pengkodean, gaya newline, penguncian berkas, dan galat pemulihan mempengaruhi penulisan ulang.
  • Mengapa pemisahan tali sederhana tidak aman untuk catatan RFC gaya sewenang-wenang.

Untuk siapa ini: Pengguna excel mempertahankan makro yang dikendalikan dengan kecil.

Konteks 2026: makro asli menunjukkan aliran kerja lokal tertentu dan belum diregeneralisasi menjadi perpustakaan CSV lossless. Back up perwakilan berkas, tes dikutip dan nilai multiline, dan tidak menjalankan menulis ulang terhadap satu-satunya salinan produksi.

Catatan keamanan: Contoh perintah dan konfigurasi dalam artikel asli belum dijalankan ulang dalam lingkungan produksi saat ini. Verifikasi versi yang didukung, cadangan, kendali akses, dan langkah rollback dalam lingkungan tes yang terpisah sebelum menerapkannya.

Sumber resmi utama

Ikhtisar

Artikel ini menjelaskan cara mengedit file csv dan teks dengan VBA (makro Excel). Artikel ini ditujukan bagi orang yang ingin memprogram tugas-tugas berikut ini

  • Saya ingin menambahkan baris ke file csv atau teks yang sudah ada. Saya ingin menambahkan teks di tengah-tengah baris.
  • Saya ingin menghapus baris dalam file csv atau teks yang sudah ada.

Daftar isi

  1. Metode pemrograman
  2. Deskripsi Kode.
  3. ringkasan

1. Metode pemrograman

Kesimpulannya, FileSystemObject tidak memiliki kemampuan untuk menambahkan di tengah-tengah baris atau menghapus baris tertentu, jadi Anda harus memprogramnya sendiri.

Contoh referensi pemrograman diberikan di bawah ini.

Karena dibuat dalam Fungsi, saya ingin membuatnya dibawa masuk seperti halnya dengan salin dan tempel dan memiliki panggilan metode yang dibuat dari 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

Untuk menggunakannya, berikan argumen sebagai berikut.

  • filePath: Ini akan menjadi jalur lengkap file. Contoh.)C:\Users\user\Desktop\test\test.txt
  • mode: Lulus benar, salah. Jika Benar, tambahkan. Jika salah, hapus baris.
  • targetRow: Menentukan jumlah baris target. Dalam kasus penambahan, ini adalah jumlah baris yang akan ditambahkan, dan dalam kasus penghapusan, ini adalah jumlah baris yang akan dihapus.
  • targetInput: Untuk postscripts, tentukan nilai yang akan ditambahkan. Ini tidak digunakan untuk penghapusan dan bisa berupa nilai sembarang. Huruf kosong juga dapat diterima.
  • lineBreakType: Pengaturan karakter baris baru. Jika Benar, vbCrLf. vbLf jika False. Singkatnya, Benar untuk file yang dibuat di Windows.

Pengkodean karakter adalah UTF-8, tetapi jika Anda ingin mengubahnya, modifikasi kode Fungsi secara langsung. Ada dua tempat di mana ".Charset = "UTF-8"".

Contoh implementasi dari pemanggilan Fungsi aktual ditunjukkan di bawah ini.

Sub test()
 
'Contoh menambahkan test123 ke baris 5 dari test.txt.(File yang dibuat di Windows.)
editFile "C:\Users\user\Desktop\test\test.txt", True, 5, "test123", True
 
'Contoh menghapus baris 5 dari test.txt.(File yang dibuat di Windows.)
editFile "C:\Users\user\Desktop\test\test.txt", False, 5, "", True
 
End Sub

Jika Anda ingin menambahkan sebagai csv, buat argumen nilai yang akan ditambahkan sebagai nilai yang dipisahkan koma, dan nilai yang dipisahkan koma akan ditambahkan. Contoh.)"test1,test2,test3"

2. Deskripsi Kode.

Ini adalah akhir dari instruksi tentang cara menggunakan sistem, diikuti oleh penjelasan kode.

Detailnya bisa ditemukan dalam kode, tetapi alur proses kasarnya adalah sebagai berikut.

Untuk naskah tambahan.

  • 1: Membaca file teks di jalur yang dilewatkan sebagai argumen.
  • 2: Jumlah karakter hingga jumlah baris yang dilewatkan dalam argumen ditentukan dari jumlah baris baru. Contohnya, untuk baris 5, ada empat jeda baris sebelum baris 5, jadi temukan posisi di mana jeda baris keempat ditemukan
  • 3: Mengambil informasi hingga baris 4.
  • ④(2) Dapatkan informasi dari baris 5 dan seterusnya dengan cara yang sama seperti (2).
  • ⑤Informasi dalam (3), informasi yang akan ditambahkan yang dilewatkan sebagai argumen dan informasi dalam (4) digabungkan bersama-sama.
  • ⑥Buat file berdasarkan informasi dalam (5) dan timpa file tersebut.

Jika terjadi penghapusan

  • 1: Membaca file teks di jalur yang dilewatkan sebagai argumen.
  • 2: Jumlah karakter hingga jumlah baris yang dilewatkan dalam argumen ditentukan dari jumlah baris baru. Contohnya, untuk baris 5, ada empat jeda baris sebelum baris 5, jadi temukan posisi di mana jeda baris keempat ditemukan
  • 3: Mengambil informasi hingga baris 4.
  • ④(2) Dapatkan informasi dari baris 6 dan seterusnya dengan cara yang sama seperti (2).
  • ⑤Informasi dalam (iii) dan (iv) digabungkan bersama-sama. (Membuat string tanpa baris kelima.)
  • ⑥Buat file berdasarkan informasi dalam (5) dan timpa file tersebut.

Dalam hal menambahkan dan menghapus, keduanya sama, tetapi alih-alih mengedit file, dibuat seolah-olah hanya informasi yang diperlukan yang diekstrak dari file asli dan file baru dibuat dan disimpan.

3. ringkasan

Jika Anda mengalami masalah dalam mengedit file csv/teks dengan VBA (makro Excel), silakan merujuk ke bagian ini.

Semoga penjelasan ini membantu.