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
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.