Özellik ikonu

Open

İndirme izni yok

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.

Söz dizimi​

Deyimin genel biçimi şöyledir:
VBA
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.
Kilit seçenekleri yalnız dosyanın başka bir işlem tarafından da kullanılabileceği ortamlarda anlamlıdır. Sıradan metin dosyası işlemlerinde genellikle belirtmeniz gerekmez.

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

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.
ABC
1ÜrünŞehirTutar
2KlavyeAnkara1.250,50
3Monitörİzmir6.800,00
4YazıcıBursa3.420,75
5FareAdana315,00
Satış ListesiExcelDepo v1.0.0
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.

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.
ABC
1ÜrünŞehirTutar
2
3
Metin AktarımıExcelDepo v1.0.0
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.

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.
ABCDE
1ModOkumaYazmaDosya YoksaBoş Kanal No
2InputEvetHayırHata verir1
3OutputHayırEvetOluşturur1
4AppendHayırEvetOluşturur1
5BinaryEvetEvetOluşturur1
6RandomEvetEvetOluşturur1
Dosya ModlarıExcelDepo v1.0.0
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.

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.
Örneklerdeki makroların tamamı indirilebilir Excel dosyasındadır (.xlsm). Dosyayı açtıktan sonra makroları etkinleştirin, ardından Alt + F11 ile Visual Basic Düzenleyicisi'nde kodları inceleyebilir ve Alt + F8 ile çalıştırabilirsiniz.
Yazar
ExcelDepo
İndirme sayısı
0
Gösterim
11
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst