Genel Bakış
Open (Open statement), VBA'da bir dosyayı doğrudan okumak, yazmak ya da sonuna eklemek için açan deyimdir. Dosyaya bir kanal numarası bağlar; sonraki Print #, Write #, Line Input #, Get ve Put komutları bu numara üzerinden çalışır. Excel çalışma kitabı açmak için kullanılan Workbooks.Open yönteminden farklıdır; Open deyimi metin (txt, csv, log) gibi dosyalarla çalışır.
Açtığınız her dosyayı Close deyimiyle kapatmalısınız. Kapatılmayan dosya kilitli kalabilir, yazdığınız veriler diske tam aktarılmayabilir ve aynı dosyayı yeniden açmaya çalıştığınızda 55 numaralı hata (Dosya zaten açık) alırsınız. Dosya açıkken makro hata verip durursa kanal açık kalır; bu durumda Hemen penceresinde Close yazarak tüm kanalları kapatabilirsiniz.
Makro, 2. satırdan son dolu satıra kadar her satırı tek bir metin satırı olarak dosyaya yazar. Dosyanın her satırı Ürün;Şehir;Tutar biçiminde olur. Bu örnek dosya oluşturduğu için burada çalıştırılmaz; kendi bilgisayarınızda çalıştırdığınızda çalışma kitabının klasöründe satis_raporu.txt dosyasını görürsünüz. Dosya zaten varsa Output modu içeriği siler; eski satırları korumak için Append kullanın.
Makro dosyayı Input modunda açar, EOF işleviyle dosya sonunu denetleyerek her satırı Line Input # ile okur ve Split ile noktalı virgülden parçalar. Böylece ürün, şehir ve tutar sütunları sayfaya dolar. Dosya işlemi yaptığı için bu örnek burada çalıştırılmaz. Tutar CDbl ile sayıya çevrilir; ondalık ayırıcı dosyayı yazdığınız bilgisayarın bölgesel ayarına bağlıdır.
Makro her mod için okuma ve yazma izinlerini ve dosya yoksa ne olacağını yazar. Örneğin Input satırında okuma sütununa Evet, yazma sütununa Hayır, dosya yoksa sütununa Hata verir yazıldı; Output için yazma durumu Evet, dosya yoksa davranışı Oluşturur olur. Son sütundaki 1 değeri, FreeFile işlevinin o anda verdiği boş kanal numarasıdır; dosya açıkken bu numara değişir.
Söz dizimi
Deyimin genel biçimi şöyledir:Open yolAdı [For mod] [Access erişim] [kilit] As [#]dosyaNo [Len = kayıtUzunluğu]
- yolAdı: Açılacak dosyanın yolu ve adı; zorunludur. Tam yol vermeniz önerilir.
- For mod: Dosyanın açılış biçimi (Append, Binary, Input, Output, Random); isteğe bağlıdır, belirtilmezse Random kabul edilir.
- Access erişim: İzin verilen işlem; Read, Write ya da Read Write; isteğe bağlıdır.
- kilit: Başka işlemlerin dosyaya erişimini sınırlar; Shared, Lock Read, Lock Write ya da Lock Read Write; isteğe bağlıdır.
- dosyaNo: 1 ile 511 arasında kanal numarası; zorunludur. Boş numarayı FreeFile işleviyle almak en güvenli yoldur.
- Len = kayıtUzunluğu: Random dosyalarda kayıt uzunluğu (en çok 32767 bayt), sıralı dosyalarda arabellek boyutu; isteğe bağlıdır.
Dosya modları
Mod, dosyaya hangi yönde ve nasıl erişileceğini belirler:- Input: Dosyayı yalnız okumak için açar. Dosya yoksa 53 numaralı hata (Dosya bulunamadı) oluşur.
- Output: Dosyayı yazmak için açar. Dosya yoksa oluşturulur; varsa içeriği silinir.
- Append: Dosyayı yazmak için açar ve yazılanları mevcut içeriğin sonuna ekler. Dosya yoksa oluşturulur.
- Binary: Dosyayı bayt düzeyinde okuma ve yazma için açar; Get ve Put ile kullanılır.
- Random: Sabit uzunluklu kayıtlara erişim için açar; Len ile kayıt uzunluğu verilir.
Kanal numarası ve kapatma
Her açık dosya bir kanal numarası taşır. Numarayı elle (örneğin 1) vermek yerine şu kalıbı kullanın:
VBA
4 satır
kanal = FreeFile
Open yol For Input As #kanal
' ... işlemler ...
Close #kanal
1. Sayfa verisini metin dosyasına yazma
Sayfadaki ürün satışlarını noktalı virgülle ayrılmış bir metin dosyasına aktarmak istiyorsunuz. Aşağıdaki kodu standart modüle yapıştırın. Çalışma kitabınızın kayıtlı olması gerekir; dosya, çalışma kitabıyla aynı klasörde oluşturulur.
VBA
20 satır
Option Explicit
Sub RaporuMetneYaz()
Dim ws As Worksheet
Dim kanal As Integer
Dim yol As String
Dim i As Long, son As Long
Set ws = ActiveSheet
' Dosya, çalışma kitabıyla aynı klasöre yazılır
yol = ThisWorkbook.Path & "\satis_raporu.txt"
son = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
kanal = FreeFile ' Boş kanal numarasını al
Open yol For Output As #kanal ' Dosya varsa üzerine yazılır
For i = 2 To son
Print #kanal, ws.Cells(i, 1).Value & ";" & ws.Cells(i, 2).Value & ";" & ws.Cells(i, 3).Value
Next i
Close #kanal ' Dosyayı kapat
End Sub
Open
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Ürün | Şehir | Tutar |
| 2 | Klavye | Ankara | 1.250,50 |
| 3 | Monitör | İzmir | 6.800,00 |
| 4 | Yazıcı | Bursa | 3.420,75 |
| 5 | Fare | Adana | 315,00 |
Satış ListesiExcelDepo v1.0.0
2. Metin dosyasını sayfaya okuma
Önceki örnekte oluşturulan satis_raporu.txt dosyasını satır satır okuyup sayfaya yerleştirmek istiyorsunuz. Kodu standart modüle yapıştırın; sayfada yalnız başlıklar bulunur.
VBA
33 satır
Option Explicit
Sub MetniSayfayaOku()
Dim ws As Worksheet
Dim kanal As Integer
Dim yol As String, satir As String
Dim parcalar() As String
Dim r As Long
Set ws = ActiveSheet
yol = ThisWorkbook.Path & "\satis_raporu.txt"
' Dosya yoksa Input modu hata verir; önce denetleyin
If Dir(yol) = "" Then
MsgBox "Dosya bulunamadı.", vbExclamation
Exit Sub
End If
kanal = FreeFile
Open yol For Input As #kanal
r = 2
Do While Not EOF(kanal) ' Dosya sonuna kadar oku
Line Input #kanal, satir
parcalar = Split(satir, ";")
If UBound(parcalar) >= 2 Then
ws.Cells(r, 1).Value = parcalar(0)
ws.Cells(r, 2).Value = parcalar(1)
ws.Cells(r, 3).Value = CDbl(parcalar(2))
r = r + 1
End If
Loop
Close #kanal
End Sub
Open
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Ürün | Şehir | Tutar |
| 2 | |||
| 3 |
Metin AktarımıExcelDepo v1.0.0
3. Açılış modlarını tabloya yazma
Open deyiminin modlarının davranışını bir özet tablo olarak sayfaya yazdırmak ve FreeFile'ın verdiği kanal numarasını görmek istiyorsunuz. Bu örnek dosya açmaz, bu yüzden güvenle çalıştırılabilir. Kodu standart modüle yapıştırın.
VBA
22 satır
Option Explicit
Sub ModTablosunuYaz()
Dim ws As Worksheet
Dim okuma As Variant, yazma As Variant, yoksa As Variant
Dim i As Long
Set ws = ActiveSheet
' Sırayla: Input, Output, Append, Binary, Random
okuma = Array("Evet", "Hayır", "Hayır", "Evet", "Evet")
yazma = Array("Hayır", "Evet", "Evet", "Evet", "Evet")
yoksa = Array("Hata verir", "Oluşturur", "Oluşturur", "Oluşturur", "Oluşturur")
For i = 0 To 4
ws.Cells(i + 2, 2).Value = okuma(i)
ws.Cells(i + 2, 3).Value = yazma(i)
ws.Cells(i + 2, 4).Value = yoksa(i)
' Hiçbir dosya açık olmadığından boş kanal numarası döner
ws.Cells(i + 2, 5).Value = FreeFile
Next i
End Sub
Open
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Mod | Okuma | Yazma | Dosya Yoksa | Boş Kanal No |
| 2 | Input | Evet | Hayır | Hata verir | 1 |
| 3 | Output | Hayır | Evet | Oluşturur | 1 |
| 4 | Append | Hayır | Evet | Oluşturur | 1 |
| 5 | Binary | Evet | Evet | Oluşturur | 1 |
| 6 | Random | Evet | Evet | Oluşturur | 1 |
Dosya ModlarıExcelDepo v1.0.0
Kullanırken dikkat edin
- Her Open için bir Close: Açtığınız dosyayı Close #kanal ile kapatmayı unutmayın. Kapatılmamış dosya başka programlarca kullanılamaz ve sonraki çalıştırmada 55 numaralı hata verir. Hata olasılığı olan kodlarda On Error bloğunun çıkışında da dosyayı kapatın.
- Kanal numarasını FreeFile ile alın: Kanal numarasını elle 1 yazarsanız, aynı numarayı kullanan başka bir makro ya da yordamla çakışabilirsiniz. FreeFile kullanmak bu sorunu ortadan kaldırır.
- Sık görülen hatalar:
- 53 (Dosya bulunamadı): Input modunda yol ya da ad yanlışsa oluşur. Önce Dir ile denetleyin.
- 55 (Dosya zaten açık): Aynı dosya kapatılmadan yeniden açılmaya çalışılırsa oluşur.
- 75 ve 76 (Yol/Dosya erişim hatası, Yol bulunamadı): Klasör yoksa ya da yazma izniniz yoksa oluşur; Open klasör oluşturmaz.
- ThisWorkbook.Path boş: Çalışma kitabı henüz kaydedilmemişse yol boş döner ve dosya beklenmeyen bir konuma yazılmaya çalışılır.
- Output modu içeriği siler: Output modu mevcut dosyayı sıfırlar. Önceki kayıtları korumak istiyorsanız Append modunu seçin.
- Karakter kodlaması: Open deyimiyle yazılan metin, sistemin ANSI kod sayfasını kullanır; UTF-8 gerektiren dosyalarda Türkçe karakterler (ş, ğ, İ) bozuk görünebilir. UTF-8 çıktısı gerekiyorsa ADODB.Stream gibi farklı bir yöntem kullanmanız gerekir.
- Workbooks.Open ile karıştırmayın: Excel çalışma kitabı açmak için Workbooks.Open yöntemini kullanın; Open deyimi bir xlsx dosyasını kitap olarak açmaz, onu ham bayt dosyası gibi işler. Çalışma kitabı açıldığında kod çalıştırmak için ise Workbook_Open olayı kullanılır.
- İlgili konular:
- Close: Açık dosya kanalını kapatır.
- FreeFile: Kullanılabilir boş kanal numarasını verir.
- Print # ve Write #: Sıralı dosyaya veri yazar.
- Line Input # ve Input #: Sıralı dosyadan veri okur.
- EOF ve LOF: Dosya sonunu ve dosya uzunluğunu verir.
- Get ve Put: Binary ve Random dosyalarda okuma ve yazma yapar.
- Dir: Dosyanın var olup olmadığını denetler.
- Workbooks.Open: Excel çalışma kitabı açar.
- Workbook_Open: Çalışma kitabı açıldığında çalışan olaydır.