CSV ve metin dosyalarını Excel VBA ile güvenli düzenleme


Yayın tarihi:

Güncelleme:


Teknik makaleler > CSV ve metin dosyalarını Excel VBA ile güvenli düzenleme

2026 bağlamı ve güvenli kullanım

Sonuç: Düz metin dosyasını yalnızca biçimi gerçekten satır odaklı olduğunda satır olarak değerlendirin. Bir CSV alanı virgül, tırnak işareti ve satır sonları içerebilir; bu nedenle, genel CSV verileri için CSV uyumlu bir ayrıştırıcı kullanın ve orijinali değiştirmeden önce geçici bir dosyaya yazın.

Ne öğreneceksiniz

  • VBA'nın dosya G/Ç modları giriş, ekleme ve çıkış açısından nasıl farklılık gösterir?
  • Kodlama, yeni satır stili, dosya kilitleme ve hata kurtarmanın yeniden yazmayı nasıl etkilediği.
  • Rastgele RFC tarzı CSV kayıtları için basit dize bölmenin neden güvenli olmadığı.

Bu kimin için: Küçük, kontrollü metin işleme makrolarına sahip olan Excel kullanıcıları.

2026 bağlamı: Orijinal makro belirli bir yerel iş akışını gösterir ve kayıpsız bir CSV kitaplığına genelleştirilmemiştir. Temsili dosyaları yedekleyin, alıntılanan ve çok satırlı değerleri test edin ve tek üretim kopyasında yeniden yazma işlemi gerçekleştirmeyin.

Güvenlik notu: Orijinal makaledeki komutlar ve yapılandırma örnekleri mevcut üretim ortamında yeniden çalıştırılmamıştır. Desteklenen sürümleri, yedeklemeleri, erişim kontrollerini ve geri alma adımlarını uygulamadan önce ayrı bir test ortamında doğrulayın.

Başlıca resmî kaynaklar

Genel bakış

VBA (Excel makroları) ile csv ve metin dosyalarının nasıl düzenleneceğini anlatmak istiyorum. Bu makale aşağıdaki görevleri programlamak isteyen kişilere yöneliktir

  • Zaten var olan bir csv veya metin dosyasına satır eklemek istiyorum. Bir satırın ortasına metin eklemek istiyorum.
  • Zaten var olan bir csv veya metin dosyasındaki satırları silmek istiyorum.

İçindekiler

  1. Programlama yöntemi
  2. Kod Açıklaması.
  3. özet

1. Programlama yöntemi

Sonuç olarak, FileSystemObject bir satırın ortasına ekleme veya belirli bir satırı silme yeteneğine sahip değildir, bu nedenle bunu kendiniz programlamanız gerekir.

Referans programlama örnekleri aşağıda verilmiştir.

Function'da oluşturulduğu için kopyala yapıştır ile olduğu gibi getirilmesini ve metot çağrılarının Sub'dan yapılmasını istiyorum.

'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

Kullanmak için argümanları aşağıdaki gibi iletin.

  • filePath: Bu, dosyanın tam yolu olacaktır. Örnek.)C:\Users\user\Desktop\test\test.txt
  • mode: Doğru, yanlış geç. Doğruysa, ekleyin. Yanlışsa, satırı silin.
  • targetRow: Hedef satır sayısını belirtir. Ekleme durumunda eklenecek satır sayısı, silme durumunda ise silinecek satır sayısıdır.
  • targetInput: Postscriptler için eklenecek değeri belirtin. Silme işlemi için kullanılmaz ve rastgele bir değer olabilir. Boş harfler de kabul edilebilir.
  • lineBreakType: Satırsonu karakterlerinin ayarlanması. True ise, vbCrLf. vbLf eğer False. Kısaca, Windows'ta oluşturulan dosyalar için True.

Karakter kodlaması UTF-8'dir, ancak bunu değiştirmek isterseniz İşlev kodunu doğrudan değiştirin. ".Charset = "UTF-8"" ifadesinin bulunduğu iki yer vardır.

Gerçek bir Fonksiyon çağrısının örnek bir uygulaması aşağıda gösterilmiştir.

Sub test()
 
'test123'ü test.txt dosyasının 5. satırına ekleme örneği.(Windows'da oluşturulan dosyalar.)
editFile "C:\Users\user\Desktop\test\test.txt", True, 5, "test123", True
 
'test.txt dosyasının 5. satırını silme örneği.(Windows'da oluşturulan dosyalar.)
editFile "C:\Users\user\Desktop\test\test.txt", False, 5, "", True
 
End Sub

Bir csv olarak eklemek istiyorsanız, eklenecek değerin bağımsız değişkenini virgülle ayrılmış bir değer yapın ve virgülle ayrılmış bir değer eklenecektir. Örnek.)"test1,test2,test3"

2. Kod Açıklaması.

Bu, sistemin nasıl kullanılacağına ilişkin talimatların sonudur ve ardından kodun bir açıklaması gelir.

Ayrıntılar kodda bulunabilir, ancak kaba bir süreç akışı aşağıdaki gibidir.

Dipnot için.

  • 1: Argüman olarak aktarılan yollardaki metin dosyalarını okuma.
  • 2: Argümanda aktarılan satır sayısına kadar olan karakter sayısı, yeni satır sayısından belirtilir. Örneğin, 5. satır için, 5. satırdan önce dört satır sonu vardır, bu nedenle dördüncü satır sonunun bulunduğu konumu bulun
  • 3: Satır 4'e kadar olan bilgileri alın.
  • ④(ii) 5. satırdan itibaren (ii) ile aynı şekilde bilgi edinin.
  • ⑤(3)'teki bilgiler, argüman olarak aktarılan eklenecek bilgiler ve (4)'teki bilgiler bir araya getirilir.
  • ⑥(5)'teki bilgilere göre bir dosya oluşturun ve dosyanın üzerine yazın.

Silinme durumunda

  • 1: Argüman olarak aktarılan yollardaki metin dosyalarını okuma.
  • 2: Argümanda aktarılan satır sayısına kadar olan karakter sayısı, yeni satır sayısından belirtilir. Örneğin, 5. satır için, 5. satırdan önce dört satır sonu vardır, bu nedenle dördüncü satır sonunun bulunduğu konumu bulun
  • 3: Satır 4'e kadar olan bilgileri alın.
  • ④(ii) 6. satırdan itibaren (ii) ile aynı şekilde bilgi edinin.
  • ⑤(iii) ve (iv)'deki bilgiler bir araya getirilir. (Beşinci satırı olmayan bir dize oluşturun.)
  • ⑥(5)'teki bilgilere göre bir dosya oluşturun ve dosyanın üzerine yazın.

Ekleme ve silme durumunda, her ikisi de aynıdır, ancak dosyayı düzenlemek yerine, orijinal dosyadan yalnızca gerekli bilgiler çıkarılmış gibi yapılır ve yeni bir dosya oluşturulur ve üzerine kaydedilir.

3. özet

Csv/metin dosyalarını VBA (Excel makroları) ile düzenlemede sorun yaşıyorsanız, lütfen bu bölüme bakın.

Umarız bu açıklama yararlı olmuştur.