Microsoft Office Excel ® Kod Kılavuzu

Microsoft Office Excel® Code Guide

20 Ocak 2013 Pazar

MS Office Excel® Kod Kılavuzu Temel Açıklamaları

Değerli Microsoft Office Excel® kullanıcıları; "Microsoft Office Excel® Kod Kılavuzu Temel Açıklamaları" bildirimi ile birlikte "Microsoft Office Excel® Kod Kılavuzu" Blogspot adresindeki yayınlar tamamlanmıştır. Yayınlarda yer alan bilgi ve belgelerin oluşturulmasında yararlandığım yazılım ustalarına içtenlikle teşekkür ederim. Excel®'in daha uzun yıllar kişi ve kurumların ihtiyacını karşılamaya devam edeceğine inananlardanım. Bu sebeple başta Microsoft Office 11 (Excel 2003®) uygulama geliştirme araçları olmak üzere; Excel® çalışma sayfasında ve VBA CodePage imleçlerinde yer alan sayısız işlem tiplerinden öne çıkanları okuyucularımla paylaşmak istedim. Bilginin geniş kitlelere ulaşması ve paylaşılması yönünde hizmet veren Google - Blogspot ekibine de ayrıca teşekkür ederim.

Saygılarımla,

Mustafa ULUSARAÇ

Ek: Microsoft Office Excel® Kod Kılavuzu Temel Açıklamaları




MS Office Excel® Kod Kılavuzu Temel Açıklamaları

1 Makroları Kullanım İşlevlerine (Procedur) Göre Sınıflama

Option Explicit zorunlu bildirim başlığı altında Dim / Private / Public sınıflaması altında beyan edilmiş bir değişkene değer atıyabilmek için Const bildirimi veya Macro Procedure seçenekleri kullanmak gerekmektedir. Module1 nokta iletisinde (Code Page) Dim Derece as Double olarak bildirimde bulunulduğunda; Derece = 5 diyebilmek için, bildirimi Private Const Derece as Double = 5 olarak değiştirmek gerekecektir. Veya amaca uygun bir makro prosedürü seçip bu başlık altında bildirim de bulunmak gerekecektir.

 Sub DereceBildir()
     Derece = 5
End Sub

VBA nokta iletilerinde tüm bildirimler üç tip makro prosedürü içinde toparlanmıştır. Bunlar Sub, Function ve Property olarak deklere edilir. Amaca uygun olarakta deklerasyon Private (Özel) ve Public (Genel) olarak kullanıma açılabilir. Bunların dışında Property (Nesne / Olay Özelliklerini Değiştirme) bildirim sınıfının Let ve Get alt bildirimleri mevcuttur. Sub ve Function deklarasyonlarını bu bildirimde yer alan konularda sıklıkla ele alacağımızdan bu bölümde Property ile ilgili örnek verelim

'UserForm1 

Private Sonuç
Private Müşteri As New Class1
Private Sub CommandButton1_Click()
     Call MüşteriKartı
End Sub
Sub MüşteriKartı()
     'A) Set the object's properties.
     Müşteri.MüşteriAdı = "William H. Gates (Bill Gates)"
     Müşteri.MüşteriAdresi(0) = "Microsoft Corporation One Microsoft Way Redmond, WA 98052-6399 USA"
     Müşteri.MüşteriAdresi(1) = "47°37'40n, 122°14'34w"
     'B) Get the object's properties.
     Sonuç = Sonuç & Müşteri.MüşteriAdı & vbCrLf
     Sonuç = Sonuç & Müşteri.MüşteriAdresi(0) & vbCrLf
     Sonuç = Sonuç & Müşteri.MüşteriAdresi(1) & vbCrLf
     MsgBox Sonuç, vbInformation, "Property Let ve Property Get Makro Bildirimleri"
End Sub  

'Class1  

Private AdSoyad
Private Adres(2)
Private Sub Class_Initialize()
     AdSoyad = ""
     Adres(0) = ""
     Adres(1) = ""
End Sub
'A) Müşteri Adı hazırlama (Property) ve alma (Get).
Public Property Get MüşteriAdı()
     MüşteriAdı =AdSoyad
End Property
Public Property Let MüşteriAdı(AdıSoyadı)
     AdSoyad = AdıSoyadı
End Property
'B) Müşteri Adresi hazırlama (Property) ve alma (Get).
Public Property Get MüşteriAdresi(No)
     MüşteriAdresi = Adres(No)
End Property
Public Property Let MüşteriAdresi(No, Adresi)
     Adres(No) = Adresi
End Property
Private Sub Class_Terminate()
     With ThisWorkbook.Sheets(1)
          .Cells(1, 1) = AdSoyad
          .Cells(2, 1) = Adres(0)
          .Cells(3, 1) = Adres(1)
     End With
End Sub  

Prosedür atama VBA menüsünde (Alt + F11) aşağıdaki gibidir.  

2 Form Denetimleri Örneği 

Örneğimiz de hücrelere girilmiş on sayının toplamını bulacağız. İlk önce çalışma sayfamıza bir tane Düğme getirip bırakalım ve çıkan pencereden Kaydet’ i sonraki pencerede ise Tamam’ ı tıklayalım. Daha sonra makro kaydını durdurmak için Araçlar / Makro / Kaydı Durdur’ seçelim ve kaydı durduralım. Tekrar aynı menüye girip bu kez Makrolar’ ı seçelim. Açılan pencereden kaydettiğimiz makroyu seçip Düzenle’ ye tıklayalım. Karşımıza VBA kodlarını yazacağımız kod penceresi geldi. Kod penceresinde yeşil ile yazılmış olan kısımlar açıklama satırlarıdır bunları silebilirsiniz.  

Sub Makro1()
For i = 1 To 10 ‘ 1 den 10 a kadar döngü açılıyor.
Top = Top + Cells(i, 1) ‘ Değişkene döngü her döndüğünde değer atanıyor
Next i ‘ Döngü kapatılıyor
MsgBox Top‘ Sonuç mesaj olarak kullanıcıya bildiriliyor.
End Sub  

3 ActiveX Denetimleri Örneği  

Bu örneğimizde on satırdan kaç tanesinin dolu kaç tanesinin boş olduğunu bulup [E1] hücresine dolu hücre sayısını [E2] hücresine ise boş hücre sayısını yazdırtalım. Bunun için Denetim Araç Çubuğu ndan CommandButton’u çalışma sayfamıza getirelim. Ve CommandButton’un üzerine çift tıklayarak kodları yazacağımız pencereye ulaşalım. Buraya aşağıdaki kodları yazalım. 

Private Sub CommandButton1_Click()
For i = 1 To 10
If Cells(i, 1) <> "" Then ‘Eğer hücreler dolu ise
Dolu = dolu + 1 ‘Dolu değişkeni bir arttırılıyor
End If ‘Döngü kapatılıyor
If Cells(i, 1) = "" Then ‘Eğer hücreler boş ise
bos = bos + 1 ‘ Boş değişkenin bir arttırılıyor
End If ‘Döngü kapatılıyor
Next i
Cells(1, 5) = dolu ‘ Dolu değeri E1 hücresine
Cells(2, 5) = bos ‘ Boş değeri E2 hücresine yazdırılıyor.
End Sub  

4 Activate Deactivate  

Programınız da birkaç form varsa bu formlardan aynı anda yalnız biri aktiftir. Activite nin programdaki formlardan diğerine geçmesi durumunda aktiviteyi kaybeden formun Deactivate olayı, aktif olan formun da Activate olayı meydanagelir. Bu olaylar yalnız sizin programınızdaki formlar arası geçişte meydana gelir. Windows altında çalışan başka bir programın Activite yi ele geçirmesi veya kaybetmesi bu olayı meydana getirmez.  

Private Sub UserForm_Activate()
     Me.BackColor = VBA.RGB(243, 240, 242)
End Sub
Private Sub UserForm_Deactivate()
     ThisWorkbook.Sheets(1).Cells(1, 1) = "UserForm1 Deactive"
End Sub  

5 AddControl –RemoveControl  

Form üzerine kodlarla yeni bir kontrol yani component eklendiğinde AddControl olayımeydana gelir. Mesela forma yeni bir TextBox eklendiğinde bu olay meydana gelecektir. Form üzerinden bir component yine kodlarla kaldırılmaya çalışıldığı zaman RemoveControl olayı meydana gelir.  

'UserForm1 

Option Explicit
Private Nesne As Control
Private No As Single
Private Sub CommandButton1_Click()
     Set Nesne = Me.Controls.Add("Forms.ListBox.1")
     With Nesne
          .Name = "ListBox1"
          .Top = 42
          .Left = 6
          .Height = 102
          .Width = 198
          .AddItem "Mustafa"
          .AddItem "Ulusaraç"
     End With
End Sub
Private Sub CommandButton2_Click()
     No = 0
     For No = 0 To Me.Controls.Count
          If Me.Controls(No).Name = Nesne.Name Then
         Me.Controls.Remove No
         Set Nesne = Nothing
     End If
     No = No + No
     Next No
     DoEvents
End Sub
Private Sub UserForm_AddControl(ByVal Control As MSForms.Control)
     Label1.Caption = "Control was Added."
End Sub
Private Sub UserForm_RemoveControl(ByVal Control As MSForms.Control)
     Label1.Caption = "Control was Removed."
End Sub 


Form üzerine tıklandığında meydana gelir.  

Private Sub UserForm_Click()
     Me.Width = Me.Width / 2
End Sub  

7 DblClick  

Form üzerine çift tıklandığında meydana gelir.  

Private Sub UserForm_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
     Me.Height = Me.InsideHeight / 0.748
End Sub  

8 Error  

Form ile ilgili herhangi bir hata çıktığında bu olay meydana gelir.  

Private Sub UserForm_Error(ByVal Number As Integer, ByVal Description As MSForms.ReturnString, ByVal SCode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, ByVal CancelDisplay As MSForms.ReturnBoolean)
     If Number = 1693 Then End
End Sub  

9 Exit  

Elemandan çıkıldığı zaman gerçekleşen olaydır. Yani eleman kontrolü kaybedince bu olay meydana gelir.  

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
     TextBox1.Text = VBA.Format(TextBox1.Text, "#,##0.00")
End Sub  

10 Initialize  

Formun açılışında meydana gelir. Mesela programın açılışında “Programa hoş geldiniz” gibi bir mesaj verdirtmek isterseniz bu olayıkullanmanız gerekecektir. 

Private Sub UserForm_Initialize()
     Me.Caption = "[PBİD®] Program Bütçeleme İzleme Değerlendirme"
End Sub 

11 KeyPress – KeyDown – KeyUp 

Eğer programda kullandığınız genel tuşlar varsa bunların kontrolüne bu olaylara yazacağınız kodla sağlayabilirsiniz. KeyPress, tuşa bastığınız zaman KeyDown, tuş basılı olduğu sürece KeyUp, tuş bırakıldığı zaman meydana gelir 

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
     TextBox1.Text = "KeyCode " & KeyCode & ": "
End Sub
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
     TextBox1.Text = "KeyAscii " & KeyAscii & ": "
End Sub
Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
     With TextBox1
          .SelStart = 0
          .SelLength = VBA.Len(.Text)
     End With
End Sub 

12 MouseDown– MouseUp – MouseMove  

Bu olaylarda mouseun kontrolünde kullanılır. MouseDown, mouseun tuşu basılı iken MouseUp, mouseun tuşu bırakıldığızaman MouseMove ise formun üzerinde mouse gezerken meydana gelir. 

Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
     With Me
          .Width = 255
          .Height = 255
          .BackColor = VBA.RGB(X, Y, 0)
     End With
     DoEvents
End Sub
Private Sub UserForm_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
      If Button = 1 Then
           With Label1
                .Left = X
                .Top = Y
          End With
     End If
End Sub
Private Sub UserForm_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
     If Button = 2 Then
          With Label1
               .Left = X
               .Top = Y
          End With
      End If
End Sub 

13 QueryClose  

Terminate olayıyla aynıişi yapar ancak formun kimin tarafından kapatılmaya çalışıldığını da öğrenebilirsiniz.. Ayrıca bu olay Terminate olayından önce meydana gelir ve burada Cancel=True ile kapatma iptal edilirse Terminate olayı meydana gelmez. Mesela formun kapatma kontrol düğmesinden kapatılmaya çalışıldığında mesaj vererek kullanıcının formu kapatmasını aşağıdaki kodlarla önleyebiliriz.  

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If vbFormControlMenu = 0 Then ‘Kapat düğmesine basıldığı kontrol ediliyor.
MsgBox "Programı Kapatmak İçin Lütfen Çıkış Düğmesini Kullanınız"
Cancel = True ‘Kapatma olayıiptal ediliyor
End If
End Sub 

14 ReSize  

Formun boyutunun değiştirilmesi halinde bu olay meydana gelir. VBA doğrudan formun boyutunun değiştirilmesine müsaade etmeyecektir. O yüzden boyutlandırmayı kodlarla yapmak gerekiyor.  

Private Sub UserForm_Resize()
     With Me
          .Left = (Application.Width - .Width) / 2
          .Top = (Application.Height - .Height) / 2
     End With
End Sub 

15 Scroll  

Formda bulunan ScrollBar lar kullanıldığında bu olay meydana gelir 

Private Sub UserForm_Activate()
     With Me
          .ScrollBars = fmScrollBarsBoth
          .ScrollHeight = 360
          .ScrollWidth = 360
          .ScrollLeft = 60
          .ScrollTop = 60
End With
End Sub
Private Sub UserForm_Scroll(ByVal ActionX As MSForms.fmScrollAction, ByVal ActionY As MSForms.fmScrollAction, ByVal RequestDx As Single, ByVal RequestDy As Single, ByVal ActualDx As MSForms.ReturnSingle, ByVal ActualDy As MSForms.ReturnSingle)
     Me.Caption = ActionX & "-" & ActionY & "-" & RequestDx& "-" & RequestDy & "-" & ActualDx & "-" & ActualDy
End Sub 

16 Terminate 

Formun kapatılacağı zaman meydan gelir.  

Private Sub UserForm_Terminate()
     If VBA.Err.Number<> 0 Then Application.Quit
End Sub 

17 UserForm Genel Bileşenleri (ActiveX) 

17.1 Label 

Daha çok kullanıcıya form üzerinde bilgi vermek için kullanılır. Bu nesneye kullanıcı tarafından giriş yapılamaz. AutoSize özelliği True verildiği zaman içerisine getirilen bilginin uzunluğuna göre otomatik olarak boyutlanır. 

Private Sub Label1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
     Label1.SpecialEffect = fmSpecialEffectSunken
End Sub 

17.2 ComboBox 

Aşağı doğru açılabilen liste kontrolüdür. Genellikle, değerleri daha önceden belli olan elemanların seçimi için kullanılır. 

Private Sub ComboBox1_DropButtonClick()
     With ComboBox1
          .Clear
          .AddItem "Erzurum"
          .AddItem "Malatya"
          .AddItem "İstanbul"
          .AddItem "Antalya"
     End With
End Sub 

17.2.1 ComboBoxMetodlar (Methods)

17.2.1.1 AddItem

Listeye eleman eklemek için kullanılan bir metoddur.

Private Sub Label1_Click()
     Dim i As Single
     Dim Adet As Double
     Dim Alan As Range
     Set Alan = ThisWorkbook.Sheets(1).Range("A2:C31")
     Adet = Application.WorksheetFunction.CountA(ThisWorkbook.Sheets(1).Range("A2:A31"))
     For i = 1 To Adet
          ComboBox1.AddItem Alan.Cells(i, 1).Value
          ComboBox1.List(i - 1, 1) = Alan.Cells(i, 2).Value
          ComboBox1.List(i - 1, 2) = Alan.Cells(i, 3).Value
     Next i
End Sub 

17.2.1.2 RemoveItem 

Listedeki index nolu elemanı listeden çıkarmaya yarayan bir metottur.İlk elemanın index numarası 0 olduğu için elemanların listedeki yerinin bir eksiği index olarak verilmelidir. 

Private Sub ComboBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
     Dim No As Double
     No = ComboBox1.ListIndex
     ComboBox1.RemoveItem No
End Sub 

17.2.1.3 Clear 

Listenin içeriğini temizler.

Private Sub ComboBox1_DropButtonClick()
     With ComboBox1
          .Clear
          .AddItem "Erzurum"
          .AddItem "Malatya"
          .AddItem "İstanbul"
          .AddItem "Antalya"
     End With
End Sub 

17.2.2 ComboBox Özellikleri (Properties) 

17.2.2.1 ListCount 

Liste içindeki dolu satır sayısınıverir. 

Private Sub Label1_Click()
     Dim i As Single
     For i = 1 To ComboBox1.ListCount
         ActiveSheet.Cells(i, 1) = ListBox1.List(i - 1, 0)
     Next i
End Sub 

17.2.2.2 ListIndex 

Listedeki aktif elemanın (seçili elemanın) liste içindeki numarasını verir veya
listedeki aktif olacak elemanı belirler. Bu eleman ilk eleman için 0’ dır. Son eleman için
ListCount-1’ dir.  

Private Sub ComboBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
     Dim No As Double
     No = ComboBox1.ListIndex
     ComboBox1.RemoveItem No
End Sub 

17.2.2.3 List(Index) 

Liste içindeki index numaralı elemanın dğerini öğrenmek veya değiştirmek için kullanılır 

Private Sub Label1_Click()
     Dim i As Single
     For i = 1 To ComboBox1.ListCount
          ActiveSheet.Cells(i, 1) = ComboBox1.List(i - 1, 0)
     Next i
End Sub 

17.2.2.4 Text 

Liste içinde seçili olan elemanın içeriğini verir. Sadece okunabilir bir özelliktir. 

Private Sub ComboBox1_Click()
     MsgBox ComboBox1.Text
End Sub 

17.2.2.5 ColumnCount 

Bu özellikle açılan liste kutusu birkaç kolon yapılabilir. Değeri 0 ise tek sütundur, 0 değil ise listenin genişliği verilen sayıda sütuna bölünür ve bir sütunun dolmasıyla ikinci sütuna geçilir. Burada her kolonun genişliği listenin genişliğinin verilen kolon sayısına oranıdır. Örneğin; ColumnCount = 5 ve Width = 3000 ise her kolonun genişliği ColumnWidths= 3000/5 = 600 olacaktır.  

Private Sub UserForm_Initialize()
     With ComboBox1
         .ColumnCount = 10
         .ColumnWidths = "36;36;36;36;36;36;36;36;36;36"
     End With
End Sub 

17.3 ListBox  

Bu form elemanı aynı ComboBox gibidir. Elemanları listelemek, sıralamak gibi özellikler sunan genel amaçlı bir kontroldür. 

17.3.1 ListBox Methods 

Metodların tümü ComboBox ile aynıdır. 

17.3.2 ListBox Properties 

17.3.2.1 MultiSelect (Çoklu Seçim) 

Bu özellik bir kutu içinde birden fazla elemanı seçme imkanı verir. Üç değişik modu vardır.
 
            0 : Birden fazla eleman seçimi yapılamaz.
            1 : Mouse ile tıklanan her eleman seçilir veya seçilmişse seçilmişliği kaldırılır.
            2 : Bu modda Shift veya Ctrl tuşu basılı tutularak birden fazla seçim yapılır.  

17.3.2.2 Selected 

MultiSelect özelliği 0 olmayan listelerde birden fazla eleman seçilebileceği için SelCount özelliği ile seçili eleman sayısını,  Selected (Index) özelliği ile de Index numaralı elemanın seçili olup, olmadığı öğrenilebilir. Seçili olan elemanları öğrenebilmek için listeyi baştan sona tarayacak bir döngü oluşturulur ve Selected özelliği ile her elemanın seçili olup olmadığı kontrol edilir.  

Dim i
For i=0 to ListBox1.ListCount – 1
     If ListBox1.Selected(i) Then
     MsgBox ListBox1.List(i) & “ elemanı seçili”
End If
Next i  

Örnek : Amacımız form üzerinde bulunan metin kutularından girilen bilgilerin listelere
eklemek ve her listede bilgi bulunduğu için listeden bir eleman seçildiğinde diğer
listelerdede ona ait bilgilerin seçilmesi gerekmektedir. Şimdi form üzerine üç tane
TextBox, üç tane ListBox ve bir tanede CommandButton yerleştirelim. 

Private Sub CommandButton1_Click()' Listelere bilgiler ekleniyor
     ListBox1.AddItem TextBox1.Text
     ListBox2.AddItem TextBox2.Text
     ListBox3.AddItem TextBox3.Text
     MsgBox "Bilgiler Eklendi"
End Sub

Listelere elemanları ekledik. Şimdi ListBox1 tıklandığında diğer listelerdeki seçilen
elemana ait olan bilgilerin seçilmesini sağlayalım. 

Private Sub ListBox1_Click()
     Dim a, b
     a = ListBox1.ListIndex ‘ a değişkenine ListBox1’in index numarası atanıyor.
     b = ListBox1.TopIndex ‘ b değişkenine ListBox1’in topindex numarası atanıyor.
     ListBox2.ListIndex = a ‘ Listbox2 nin index numarasılistbox1 ile eşitleniyor.
     ListBox2.TopIndex = b ‘ Listbox2 nin topindex numarasılistbox1 ile eşitleniyor.
     ListBox3.ListIndex = a
     ListBox3.TopIndex = b
End Sub 

17.4 CheckBox 

Onaylama işlemlerinde kullanabilen bir kontroldür. Örneğin, MultiLine özelliği True yapılmış bir metin kutusundaki yazıları Kalın, İtalik, ve Altı Çizili metin biçimine getiren küçük bir program yapalım. Formumuzun görüntüsü aşağıdaki gibi olsun. 

Private Sub CheckBox1_Click()
     If CheckBox1.Value = True Then 'CheckBox1 in seçili olup olmadığıkontrol ediliyor.
          TextBox1.Font.Bold = True 'Seçili ise içerik Kalın
     Else 'Sseçili dğeilse
          TextBox1.Font.Bold = False ' normal formatta kalıyor.
     End If
End Sub
Private Sub CheckBox2_Click()
     If CheckBox2.Value = True Then
          TextBox1.Font.Italic = True
     Else
          TextBox1.Font.Italic = False
     End If
End Sub
Private Sub CheckBox3_Click()
      If CheckBox3.Value = True Then
          TextBox1.Font.Underline = True
     Else
          TextBox1.Font.Underline = False
     End If
End Sub

17.5 OptionButton 

CheckBox dan farklı olarak birden fazla se mlerde sadece bir tanesini seçebilmemize olanak sunar. Örneğin yukarıdaki örneğe göre seçeneklerden sadece bir tanesini seçebiliriz.  

17.6 CommandButton 

Bir olayın kullanıcı tarafından başlatılması için programlarda çok kullanılan kontrollerden biridir. Default özelliği True ise o düğmenin bulunduğu form üzerinde Enter'a basılması durumunda o düğme tıklanmış gibi olur.  Cancel özelliği de Default gibidir ancak ESC tuşu ile aktif hale gelir. Cancel özelliği True olan bir komut düğmesinin bulunduğu formda ESC tuşuna basılmasıyla bu komut düğmesi aktif yapılmış olur.  

17.7 ToggleButton

Basıldığı zaman basılı olarak kalan, tekrar basıldığında eski haline dönen buton tipidir. Basıldığında değeri True geri bırakıldığında ise False değerlerini alır. 

17.8 Frame 

Bu kontrol tek başına değil, diğer kontrolleri gruplandırmak için kullanılır. Kontrolleri bu kontrolle gruplamanın bir çok avantajı vardır. Bu çerçeveler içine konan elemanlar, çerçeveye bağımlıdırlar ve konumları bu çerçeve dışına taşamaz. Özellikle birkaç kontrolü birden görünür veya görünmez yapmak için hepsinin Visible özelliğini tek tek değiştirmek yerine çerçevenin Visible özelliği değiştirilerek çerçeve içindeki tüm kontroller aynı anda görünmez yapılabilir. Aynı durum taşıma içinde geçerlidir her birini tek tek taşımak yerine çerçeve taşınır. Çerçevelerin buna benzer birçok faydaları vardır. Özellikle OptionButton ların kullanılmasında çerçeve kullanmak zorunlu hale gelebilir. 

17.9 MultiPage 

Tek formda çok fazla bilgi girileceği yerlerde kontoller form üzerine sığmayacaktır. Bunun için MultiPage kullanmak en iyi çözümdür. Tek kontol üzerinde birden fazla sayfa
ekleyerek yerden ve zamandan tasarruf sağlanabilir. Kontrol ilk eklendiğinde üzerinde iki
adet sayfa tabı bulunur. Bunlar tabların sağ tarafına sağ tıklanıp New Page seçilerek
çoğaltılabilir. Daha önce eklenmiş bir sayfayı kaldırmak için yine aynı açılan menüden Delete Page, adını değiştirmek için Rename ve yerini değiştirmek için ise Move seçilir. 

ToolBox üzerinde bulunan mevcut kontroller haricinde birçok kullanışlı kontrollerde
vardır. Standart olarak gelen ToolBox paletine yeni elemanlar eklemek için VB kod editöründe iken Tools menüsündeki Additional Controls seçeneği seçilerek Additional penceresine ulaşılır. 

Additional Controls (Ek veya İlave Kontrol) penceresine kısa yoldan da ulaşılabilir. Kod editöründeki ToolBox penceresinin herhangi bir bölümünde sağ Mouse tuşu ile açılan
pencereden de Additional Controls menüsüne ulaşılabilir.  

Açılan Additional Controls penceresinden istediğiniz elamanı işaretleyerek projenize
ekleyebilirsiniz. Fakat burada bulunan kontroller oldukça fazla olduğundan bir çoğunun
kullanımıiçin VB deki görevlerinin tam olarak bilinmesi gereklidir. Bu bölümde en çok kullanılan ek kontroller adının başında Microsoft yazan kontrollerdir. Bu kontroller System32 içerisinde bulunan ocx uzantılı ve VB ile de kullanılan komponentlerden oluşmaktadır. Bu komponentlerin daha çok kullanılmasının sebebi sistemin otomatik olarak bu elemanları tanıması ve projelerin başka yerde hata vermeden çalışmasını sağlamaktır. Ayrıca bilgisayarda VB programlama dili de kurulu ise yapmış olduğunuz Excel projesi sorunsuz olarak ek kontroller ile birlikte çalışacaktır.  

Additional Controls penceresindeki Show bölümünde Selected Items Only seçeneğini seçerseniz sadece ekli olan komponentler listelenir. komponentler listelenecektir. İşareti kaldırırsanız bütün komponentler listelenecektir. 

18 En Çok Kullanılan Ek Kontroller (Additional Controls)

En çok kullanılan kontroller başında Microsoft yazılı kontroller olduğunu daha önce belirtmiştik. Şimdi bunlardan bazılarını örnekler ile inceleyelim.  

18.1 Microsoft Animation Control 6.0 (SP4) 

Bu komponent bir işlemi yaparken kullanıcıya işlemin yapıldığına dair görsel bir görüntü oluşturmasıiçin kullanılır.Örneğin bir arama,kopyalama,silme veya bir kullanıcı girişi sırasında durumu animasyon    şeklinde göstermek için kullanılabilir. Windows da sık sık karşılaştığımız kontrollerden biridir. Mesela CDROM dan veya Hard Diskten bir yere bir dosya kopyalama veya taşınması sırasında ekrana gelen diyalog penceresindeki animasyon ile aynı görevi görmektedir.  

18.2 Microsoft Common Dialog Control , Versiyon 6.0  

Eğer projenizi Windows uygulamalarıile bütünleşik yapmayı planlıyorsanız bu kontrol ile Windows’un standart Dialog pencerelerine ulaşabilirsiniz. Form üzerine alınan Common Dialog kontrolünü kullanabilmek için kısa bir kod yazmanız gerekmektedir.  

18.3 Common Dialog            

Action özelliğine atanan sayısal değerler ile dialog pencerelerine ulaşılır. Bu numaralar aşağıda verilmiştir. 

            Aç Dialog Penceresi          :1
            Farklı Kaydet Penceresi    :2
            Renk Palet Kutusu            :3
            Font Dialog Kutusu            :4
            Yazdırma Dialog Kutusu   :5 

Örnek : Formunuzun üzerine 6 adet CommandButton ve bir adet Common Dialog
nesnesi yerleştirin. CommandButon1’in Click olayına aşağıdaki kodu yazınız. 

Private Sub CommandButton1_Click()
     CommonDialog1.Action = 1
End Sub 

Formda bulunan diğer butonların Click olaylarına Action özelliğine numaralar sırasıyla 2, 3, 4, 5, 6 verilerek diğer dialog pencerelerine ulaşılır.  

18.4 Microsoft Masked Edit Control , Versiyon 6.0 

Bu kontrol standart TextBox kontrolüne benzer. Ancak TextBox kutusu formatlı bilgilerin girişi durumlarda fazla kullanışlı değildir. Örneğin kullanıcının doğum tarihi girilmesi gereken bir bölümde TextBox kullanılırsa kullanıcı tarihin aralarına . veya / işareti koymakla uğraşacaktır. Fakat MaskEdit kontrolünde ise kullanıcı sadece sayıları yazacak ve MaskEdit kontrolü bunu tarih formatına çevirecektir. Bu kontrol hem kullanıcı hem de programcı açısından büyük kolaylıklar sağlamaktadır. 

18.5 Microsoft MonthView Control 6.0 (SP4)  

Bu kontrolü kullanarak projenize takvim ekleyebilirsiniz. Sadece bir ay eklenebileceği gibi birden fazla ayda görüntülenebilir. Kullanıcıdan tarih girmesini istediğiniz durumlarda bu kontrolü kullanabilirsiniz. MonthView kontrolünün Properties özelliklerinde MaxDate‘ e vereceğiniz tarih ile maksimum tarih ve MinDate’ e vereceğiniz tarih ile de minumum tarihi belirleyebilirsiniz. Ayrıca MonthColumns özelliğine vereceğiniz değer, takvime yatay olarak ay eklemenize, MonthRows özelliğine vereceğiniz değer ise takvimin altına ay eklemenizi sağlar.

18.6 Microsoft ProgressBar Control 6.0 (SP6) 

Bu eleman genellikle uzun bir işlem yapılırken , yapılan işlemin yüzdeliği hakkında bilgi vermek için kullanılır. Veya programınızda bir kopyalama veya kaydetme yaparken yapacağınız işlem uzun sürecekse programınız hareketsiz kalabilir. Bu gibi durumlarda ProgressBar kullanarak kullanıcıyı azda olsa oyalayabilir ve işlemin ilerlediğini gösterebilirsiniz. ProgressBar nesnesinin kullanıla lmesi için Value değerini Min ve Max değerleri arasında arttırmak gerekir. Properties bölümünde Min ve Max değerleri belirlenir ve programda bir döngü ile Value değeri artırılır. Eğer programınız bir işlem yaparken bunu yapacaksanız o işlemin değerlerini Progressbar’ da belirtmelisiniz. 

18.7 Microsoft StatusBar Control 6.0 (SP6) 

Çoğu programda formların en altında o anki durumu gösteren bazı bilgiler bulunur. Bu bilgiler formdaki elaman veya alanlar hakkında bilgiler olabileceği gibi kullanıcı ile ilgili bilgiler veya tarih, saat bilgileride olabilir. StatusBar kontrolüne panel eklemek için Properties bölümünde Custom özelliği ile açılan pencerenin Panels tabına geçilir. Burada Insert Panel ile yeni paneller eklenebilir, Remove Panel seçeneği ile de eklenen paneller silinebilir. Eklenen panellerin hizalama, stil ve büyüklüğünü bu pencereden ayarlayabilirsiniz. Style bölümünde seçili panelin içeriğini belirleyebilirsiniz. Burada ki 0 -tbrText seçili ise metin yazabilirsiniz ve diğer seçenekler seçilerek CapsLock, NumLock, ScrollLock, Insert gibi tuşların durumunu gösterebilir, Tarih ve Saat görüntüleyebilirsiniz.  

18.8 Microsoft Tabbed Dialog Control 6.0 (SP5)

Projenizde eğer birden fazla sayfaya sahip dialog kutusu oluşturmak için kullanılır. Bu kontrol sayesinde çok sayıda kontrolün form üzerinde kullanılması sağlanır. Windows altında bu kontrolü kullanan bir çok program görebilirsiniz. Örneğin, Word programının Araçlar menüsündeki Seçenekler bölümünde bu kontrol kullanılmıştır. Bu kontrolü formunuza aldıktan sonra kontrol seçili iken Properties kısmından Custom özelliği ile açılan pencerenin General bölümünde yeni tablar ekleyebilir ve bu tabların Tab Caption (Sekme Etiketi) gibi özelliklerini belirleyebilirsiniz. Yeni tab eklemek için General bölümündeki TabsPerRow ve TabCount seçeneği ile yan tarafa yeni tablar ekleyebilir, uzunluk ve Style’ ni değiştirebilirsiniz.

18.9 Microsoft ToolBar Control 6.0 (SP6)  

Bir çok programda formun üst tarafında araç çubukları bulunmaktadır. Bu araç Çubuklarını ToolBar kontrolü ile rahatlıkla kendi projenizde oluşturabilirsiniz. ToolBar kontrolü kullanıcının programda gireceği yerleri kısa yoldan girmesi için ve kullanılacak butonların belli bir düzen içinde olması için kullanılır. ToolBar kontrolünü formunuza aldıktan sonra Properties bölümünden Custom seçeneği ile açılan pencerenin Buttons bölümünde yeni butonlar ekleyebilir ve bu butonların çeşitli özelliklerinin değiştirebilirsiniz. ToolBar kontrolüne eklediğiniz butonlar arasında boşluk bırakmak istiyorsanız Buttons sekmesindeki seçili butonun Style özelliğini 3-tbrSeperator olarak ayarlarsanız o buton artık seperator olacak ve iki buton arasında bir boşluk meydana gelecektir. 

19 Programlamaya Geçiş 

19.1 Değişkenler ve Veri Tipleri 

19.1.1 Değişkenler  

Değişkenler genellikle bir bilgiyi hafızada tutmak ve gerektiğinde kullanmak için vardır. Örneğin birine ismini soruyorsanız ve bunu gerektiğinde kullanabilmek için bir değişkene almalısınız. Bütün programlama dillerin de değişkenler bulunur ve değişik şekillerde tanımlanabilir. VBA‘ da değişkenlerin kullanımı Visual Basic’ teki gibidir. 

Değişkenler için önemli bir durum, değişkenlerin karışıklığa meydan vermemesi için tanımlanmasımecburiyetinin olmadır. VBA’ da değişkenleri kullanmadan önce tanımlama mecburiyeti programcının seçimine bırakılmıştır. 

i = 5
j = 6
aratoplam = 1000
geneltoplam = i * j + aratoplam 

Örnekte görüldüğü gibi aratoplam değişkenine 1000 ataması yapılmış ve genel toplam’ ın hesaplanmasında kullanılmak istenmiştir. 

19.1.2 Tanımlama Kuralları 

Değişkene verilecek ismin anlaşılır bir isim olması programın okunurluğunu kolaylaştırır. Bir değişken tanımlanırken aşağıdaki kurallara uymak gerekir. 

• Değişken ismi bir harf ile başlamalıdır.
   ° Doğru         Ad1, Ad2                                                                                      
   ° Yanlış         1Ad, 2.Ad
• Değişken isminde boşluk bulunamaz. Bunun yerine alt çizgi karakteri kullanılabilir.
   ° Doğru         Adı_Soyadı,Doğum_Yeri
   ° Yanlış         Adıve Soyadı, Doğum Yeri
• Değişken isminde sadece harfler, rakamlar ve alt çizgi karakteri bulunabilir.
   ° Doğru         Alış_Yeri, Gör_Yeri
   ° Yanlış         Alış-Tarihi, Gör.Yeri
• Değişkene verilecek isim VB komutların oluşmamalıdır.
   ° Yanlış         Not, Dim, Val, Str, Int, For, While vs.
• Değişken ismi 255 karakterden fazla olmamalıdır.
   ° Doğru           Ogrencinin_Annesinin_Soyadi

19.1.3 Veri Tipleri

VB’ de ve VBA’ da değişken tipleri modern olarak Dim deyimiyle yapılır. Bu deyimin basit formatı şöyledir.
 
Dim deg_ismi [(diziboyutu)] As tipi 

Deg_İsmi tanımlanacak değişkenin ismidir. Diziboyutu eğer değişken bir dizi olarak tanımlanacaksa dizinin boyutu değişken isminden sonra parantezler içine yazılır. Dim a (15) tanımıyla 16 elemanlı bir dizi tanımlanmış olur ve dizinin ilk elemanı a(0), son elemanıa(15) tir. Bir dizinin ilk elemanı 0 olmak zorunda değildir. Dim a(5 to 15) tanımıyla ilk elemanı a(5) ve son elemanı a(15) olan dizi de tanımlanabilir. 

Ancak Dim kullanılacak bir fonksiyon/altprogram içerisinde dizi tanımı yapılamaz. Formun General-Declarations kısmında veya bir modül içinde tanımlanabilir. Bir fonksiyon veya altprogram içinde Redim veya Static deyimleriyle dizi tanımıyapılabilir. 

Tipi tanımlanacak değişken tipini belirler. VB ve VBA’ da tip tanımı verilmeyebilir. Sadece Dim x şeklinde tanımla bir x değişkeni tanımlanabilir. Bu tür değişkenlere Variant denir ve içinde her türden bilgi bulundururlar. Ancak hız açısından Variant değişkenler iyi bir seçim değildir. Başlıca Tipler; 

19.1.3.1 Byte

1 Baytlık işaretsiz tamsayı tipidir. 0 ile 255 arasında değer alabilir. 

19.1.3.2 Integer

2 Baytlık işaretli tamsayı tipidir.-32.768 ile 32.767 arasında değer alabilir. 

19.1.3.3 Long 

4 Baytlık işaretli tamsayı tipidir.-2.147.483.648 ile 2.147.483.647 arasında değer alabilir. Bu üç tipe ondalık sayı atanması durumunda sayı en yakın tamsayıya yuvarlatılacaktır.

Dim i As Integer
i = 4.3 ‘i = 4 olarak atanır
i = 4.5 ‘i = 5 olarak atanır
i = 4.6 ‘i = 5 olarak atanır 

19.1.3.4 Single 

4 Baytlık ondalık sayı tipidir.±3.402823x1038 ve ±1.401298x10-45 arasında değer alabilir. 

19.1.3.5 Double 

8 Baytlık ondalık sayı tipidir.±1.79769313486232x10308 ve ±4.94065645841247x10-324 arasında değer alabilir. 

19.1.3.6 Currency 

8 Baytlık bir ondalık sayı tipidir. Ancak sayının ondalık kısmı 4 basamaktan daha fazla olamaz ve sayının bütün dijitleri korunur. Bu tip, daha çok para hesapları ve virgülden sonraki hassasiyeti önemsiz olan işlemler için düşünülmüştür. -922337203685477.5808 ile 822337203685477.5807 arasında değerler alabilir. Ondalık kısmın 4 basamaktan fazla olmasıdurumunda sayı yuvarlatırlır. 

19.1.3.7 Decimal  

14 Baytlık bir veri tipidir. Bu tipin en önemli özelliği sayıdaki bütün basamakların tutulmasıdır. 29 basamaklı bir sayıyı bütün dijitleri koruyarak tutabilir. Tam sayılar için, ±79228162514264337593543950335 arasında, ondalık sayılar için, ±7.9228162514264337593543950335 arasında sayı alabilir. Bu tip diğerlerinde farklı olarak Dim deyimi ile tanımlanmaz. Bu tip bir Variant değişkene CDec fonksiyonu ile atanabilir. Kullanımı;

Dim x, y
x = 79228162514264337593543950335
MsgBox x
y = CDec(“79228162514264337593543950335”)
MsgBox y

Sayısal olarak tanımlanan tiplerde değişken tipinin sınırları dışında bir değer atanması durumunda VB ve VBA Owerflow hatası verecektir.

19.1.3.8 Boolean 

2 Baytlık bir veri tipi olmasına rağmen sadece  True ve False değerleri alabilir. Yani daha çok iki durumlu değişkenlerde kullanılır. Bu tipten tanımlanan değişkenlere direkt True, False   değerleri atanabileceği gibi sayısal değer de atanabilir. Atanan 0 ise False, değilse True kabul edilir. Bu tipte tanımlanan değişkenler programların daha anlaşılır olmasıaçısından avantajlıdır.

19.1.3.9 String

Karakter sınırı verilmezse 2 milyar karaktere kadar atama yapılabilen sayısal olmayan veri tipidir. Bu tip karakter sayısı +10 byte yer kaplar. Karakter sayısını sınırınıbelirlemek için Dim degisken As String * sayısal sınır şeklinde kullanılır. Bu durumda verilen sınır kadar yer kaplar ve en büyük sınır olarak 65400 verilebilir.

19.1.3.10 Variant 

VB ve VBA’ da değişken tanımlanırken tip ismi verilmemişse bu tip Variant olarak ele alınır ve değişken tipi atanacak değere göre değişir. Variant tipler yukarıdaki tiplerden herhangi biri gibi işleme girebilir ve programın çalışması esnasında tipi de değiştirilebilir.

19.1.3.11 Date 

8 Bayt kaplayan bu değişkene 1/1/100 ile 31/12/9999 arasında tarih ve 0:00:00 ile 23:59:59 arasında saat atamaları yapılabilir. Bu tipteki değişkenlere atama bir string gibi veya # # karakterleri arasında yapılabilir. Aslında bu değişken ondalık sayı tipinden tanımlandığı için bu tipte tanımlanmış tarihler arasında işlem yapılabilir. Örneğin iki tarih arasındaki gün sayısını bulmak için çıkarma işlemi yapılabilir.

Dim Tarihi As Date
Tarih = “17/11/1973”
MsgBox Tarih & “ tarihinden bu güne kadar “ & Date –i & “ gün geçti” 

19.1.3.12 Object 

4 Baytlık bir veri tipidir ve OLE işlemlerinde kullanılmak üzere tasarlanmıştır. bu tipteki değişkenlere atama yaparken Set operatöre kullanılır.

19.1.3.13 KullanıcıTarafından Yeni Tip Tanımlanması

Yukarıdaki verilen standart tiplerden kendi tiplerimizide tasarlayabiliriz. Kullanıcı tanımlı tiplerşöyle tanımlanır; 

Type Tip_Adı
            Deg_ismi As Tipi
            Deg_ismi As Tipi
            …….
            …….
End Type 

Tip tanımıbir form içerisinde ancak Private veya Public olarak tanımlanabilir. Yani tanımlanan tip sadece o formda kullanılır. Genel yani Public bir tip ise ancak bir modül içerisinde olabilir. Bir form da tip, 

Private Type Tip_Adı
…..
End Type 

19.1.3.14 Global ve Local Değişken Tanımı 

Değişkenler genelde iki sınıfa ayrılır. Global (Genel) değişkenler ve Local(Yerel) değişkenlerdir. Global değişkenler programın bütün fonksiyonları tarafından kullanılabilirken, Local değişkenler sadece tanımlandıkları fonksiyonda kullanılır. 

Global değişkenlerin bütün fonksiyonlarda kullanılması ilk bakışta avantaj gibi
görülmesine rağmen, programın geliştirilmesi ve takip edilmesini önemli ölçüde
zorlaştırdıklarından dolayı çok büyük dezavantajları vardır.  

Dim deyimiyle yapılan tanımlar tanımlandığı yere göre Global veya Local dır. Dim ile tanımlanan değişken, General-Declarations kısmında tanımlanmışsa tanımlandığı modül/form içerisinde Global dir buna VB ve VBA’ da Module Level denir. O modüldeki/formdaki bütün prosedürler bu değişkeni kullanabilir fakat diğer modüller/formlar bu değişkeni kullanamaz.

Bir fonksiyon yada alt programda tanımlanmışsa Local dir. Sadece o prosedür tarafından kullanılabilir.

Bir formun General Declarations kısmında Public deyimi ile tanımlanmışsa diğer modüller ve formlar da bu değişkeni kullanabilir. Ancak değişkenin isminden önce modülün / formun ismini vermesi gerekir. 

Yukarıdaki birinci resime ait kod penceresinde x Public, y ise  Private olarak tanımlanmıştır. x ve y değişkenlerini birinci resimdeki tüm prosedürler kullanabilir. İkinci resimdeki prosedürler ise sadece Public olarak tanımlanmış x değişkenini kullanabilirler ancak değişkenin isminden önce formun isminin de verilmesi gerekir.  

Bir değişkeni programın her tarafından kullanacak şekilde, tam olarak global tanımlamak için o değişkeni bir modülün (Insert menüsünden Module seçilerek eklenebilir) General-Declaration kısmında Public deyimi kullanılarak tanımlanmalıdır. Başka prosedürlerde kullanmak için modülün ismini yazmaya gerek yoktur.  

Local  değişkenlerin diğer önemli ise bellekte fazladan yer işgal etmemeleridir (Statik
olarak belirtilmemişse). Global değişkenler program çalıştığı sürece bellekte tutulmalarına rağmen Local değişkenler, değişkenin bulunduğu fonksiyona girince değişken belleğe alınır ve fonksiyonun çalışması bitince bellekten silinir. Böylece hangi fonksiyon çalışıyorsa sadece o fonksiyonun değişkenleri bellekte bulunacaktır.

19.1.3.15 Değişkenlerin ve Kontrollerin Tipini Belirlemek

Variant tipindeki bir değişkenin program içerisinde yaptığımız atamaya göre tipinin
değiştiğini belirtmiştik. Variant olarak tanımlanmış olan bir değişkenin hangi tipte
olduğunu öğrenmek için VarType fonksiyonu geliştirilmiştir. 

VarType (Degisken

Değişken: Tipi öğrenilecek Variant olarak tanımlanmış değişken. Bu değişken herhangi bir tipten bir değişkende olabilir. Ancak bu durumda geri dönen değer değişkenin tanımlandığıtiptir. Fonksiyondan geri dönün değer değişkenin tipini ifade eder ve aşağıdaki değerlerden biridir.

19.2 Program Kontrol Deyimleri 

19.2.1 If Yapısı  

If - şart yapısı bütün programlama dillerinde olan, bazı şartların gerçekleşmesi durumunda ve gerçekleşmemesi durumunda ayrı-ayrı kodların çalıştırılmasına imkan veren yapıdır. 

If Şart Then
     Komutlar
Else
     Komutlar
End If 
 
If Şart then Komutlar
 
If Şart then Komutlar: Komutlar: Komutlar

Şartın gerçekleşmesi halinde Then deyiminden sonraki satır işletilir. Gerçekleşmemesi durumunda Else deyiminden sonraki satırlar işletilir. Şartın gerçekleşmemesi durumunda çalışacak Else bloğu istenirse verilmeyebilir. Ayrıca tek satırda şart yapılıyorsa End If kullanılmaz.

19.2.2 Select Case Yapısı 

Bir değişken in aldığı bir çok d eğere göre ayrı komutların çalıştırılması gereken durumlar için If ya pısı yerine Select Case yapısını kullanmak daha avantajlıdır. 

Select Case Değişken
            Case Durum1:Komutlar
            Case Durum2,Durum3:Komutlar
            Case Durum4 to Durum7:Komutlar
            Case is < durum8:Komutlar
            Case is > durum9:Komutlar
            …………..
            Case Durum N:Komutlar
            Case Else Komutlar
End Select 

19.2.3 IIF Yapısı  

Bir değişkenin değeri iki durumdan birine göre değer alıyorsa Bir değişkenin değeri iki durumdan birine göre değer alıyorsa If yapısı yerine IIF kullanılabilir. Bu size daha az satırla aynı işi yapabilme imkanı verir. 

IFF (şart;doğru ise;yanlış ise)  

Bu fonksiyonda şart doğru ise birinci ifade, yanlışsa ikinci ifade işleme girer. 

19.2.3 Choose Yapısı  

Bir değişkenin aldığı değer bir sayıya bağlı ise Choose yapısını kullanmak daha uygundur. 

Sonuç=Choose(Sayı,değer1,değer2,değer3,………,değerN)

formatında kullanılır. Buradaki sonuç sayıya bağlı olarak değer listesinden bir değerdir. Örneğin sayı 3 ise sonuç değer3 olacaktır. 

19.2.3 Switch Yapısı 

Switch fonksiyonunda ise birden fazla şart aynı satırda kontrol etmek mümkündür.

Sonuç=Switch(Şart1,Değer1,Şart2,Değer2,………..,ŞartN,DeğerN)

Şeklinde kullanılır.

19.3 Döngü Deyimleri  

Belirli bir komut parçasının bellişartlar gerçekleşinceye kadar defalarca çalışması gerekebilir. Çalışma sayısının belli olduğu durumlarda For döngüsü diğer durumlarda yani döngü sayısının değişken olduğu durumlarda ise While - Wend, Do - Loop bloklarıkullanılır.

19.3.1 FOR Döngüsü 

For Sayaç = BaşlangıçDeğeri to BitirşDeğeri [Step Artım]
     Komutlar
Next

For döngüsü sayaçın başlangıç değerinden başlayarak bitiş değerine kadar sayacı birer artırarak Next’ e kadar olan komutları çalıştırır. Eğer birer artması değilde sizin belirleyeceğiniz aralıklarla artıp azalmasını istiyorsanız Step parametresinden sonra artım miktarınıyazmanız gerekir.

Sayacın artarak değilde azalarak çalışması için Step ten sonra negatif değer vermeniz gerekir. Örneğin, [A1] sütununun 5. satırından itibaren 10 tane satıra satır numarası verdirelim. 

Private Sub SayfaDizini()
     Dim s As Worksheet, i As Integer, r As Range
     Set s = Worksheets.Add(Worksheets(1))
     Set r = s.Range("A2")
     For i = 2 To Worksheets.Count
          r.Value = i - 1
          r.Offset(0, 1).Value = Worksheets(i).Name
          ActiveSheet.Hyperlinks.Add r.Offset(0, 2), _
          Address:="", SubAddress:="'" + Worksheets(i).Name + "'!" + "A1", ScreenTip:="",
          TextToDisplay:="Link"
          Set r = r.Offset(1, 0)
     Next i
End Sub 

19.3.2 While - Wend ve Do While - Loop Döngüsü

Bir döngünün kaç defa çalışacağı daha önceden bilinmiyorsa While döngüleri kullanılır. Bir şart gerçekleştiği sürece çalışması gereken program bloklarında kullanılır.

While Şart
     Komutlar
Wend

Private Sub KarakterDizini()
     Dim i As Double 'Aksi belirtilmedikçe i başlangıç değeri=0 dır
     While i < 256
          ActiveSheet.Cells(i + 1, 1) = (Chr(i))
          i = i + 1
     Wend
End Sub

Do While Şart
     Komutlar
Loop

Private Sub GeriSayım()
     Dim Sayaç As Integer: Sayaç = 5
     Dim Eleman As Long: Eleman = 1
     Do While Sayaç> 0
          Eleman = Eleman * Sayaç 'Çarpım işlemi
          Sayaç = Sayaç- 1 'Azaltma işlemi
     Loop
     MsgBox Eleman, vbInformation, "While Loop Örneği Sonucu"
End Sub

Yukarıdaki her iki döngünün mantığı aynıdır. Şart gerçekleştiği sürece döngüde kalınır. 

19.3.3 Do – Loop, Do Until – Loop Döngüsü 

Bu döngü yapısıda şart gerçekleşene kadar çalışması gereken program bloklarında kullanılır. Dikkat ederseniz yukarıdaki döngüler şart gerçekleştiği sürece çalışıyordu bu ise şart gerçekleşene kadar çalışır. Yani şart gerçeklemediği sürece çalışır. 

Do
    Komutlar
    Şart
Loop 

Private Sub KoşulluSayım()
     Dim VeriX, VeriY
     VeriX = 0
     Do
          VeriX = VeriX + 1
          VeriY = VeriY + VeriX
          If VeriY > 1200 Then Exit Do
     Loop
     MsgBox "VeriX: " & VeriX & ", VeriY: " & VeriY
End Sub 

Do Until Şart
     Komutlar
Loop 

Private Sub SaniyeSayım()
     Dim Toplam As Single: Toplam = 0
     Dim Sayaç As Single: Sayaç = 0
     Range("F2").Value = 24’Sıfırdan büyük olmalı
     Do Until Toplam> = 100
          Toplam = Toplam + VBA.CInt(Range("F2").Value)
          Sayaç = Sayaç + 1
     Loop
     MsgBox ("Döngü zamanı: " & VBA.CStr(Sayaç / 1000) & " saniye!")
End Sub 

19.3.4 Do – Loop While ve Do – Loop Until Döngüsü 

Do
     Komutlar
Loop Until Şart
Private Sub SarmalSayım()
     Dim VeriX, VeriY
     VeriX = 0
     Do
          VeriX = VeriX + 1
          VeriY = VeriY + VeriX
     Loop Until VeriX = 7
     MsgBox "VeriX: " & VeriX & ", VeriY: " & VeriY
End Sub

Do
     Komutlar
Loop While Şart 

Sub SonrakiKontrol()
     Dim Sayaç As Long
     Dim Veri As Long
     Sayaç = 0
     Veri = 9
     Do
          Veri = Veri -1
          Sayaç = Sayaç + 1
     Loop While Veri> 10
     MsgBox "Döngü sayısı: " & Sayaç & " dır."
End Sub 

Bu döngülerin yukarıdakilerden tek farkı döngüye girerken değil çıkarken şart kontrol
edilir. Yani döngü içerisinde kod en az bir kez çalışır. Örneğin kullanıcıya sınav notunu sorduğumuzu düşünelim. Gireceği not 0-100 aralığı dışında ise; notu bu aralıkta girilinceye kadar tekrar tekrar sorulması gerekir. Bu işe Do - Loop Until yapısı uygundur. Çünkü döngü içerisinde not sorulduktan sonra not 0-100 aralığı dışında ise tekrar sorulması gerekir.

Dim Nott ‘not değil çünkü not özel bir deyim
Do
     Nott = InputBox (“Not Girişi”, “ Sınav Notunuz”, “50”)
Loop Until (nott > 0) And (nott < 100)

19.4 Döngü Kontrol İfadeleri 

19.4.1 Exit Do 

Exit Do komutu Do - Loop, Whlie Wend döngülerinden birinde bazı şartların gerçkeleşmesi durumunda döngüden çıkmak için kullanılır

19.4.2 Exit For 

Bu komutta For Next döngüsü tamamlanmadan, bazı şartlar gerçekleştiğinde döngüden çıkmaya yarar.

19.4.3 Exit Sub, Exit Function

Exit Sub ve Exit Function deyimleri alt program sonuna ulaşmadan alt programdan çıkmaya yarar.

Dim i, j
j = Val(TextBox1)
If j <= 0 Then Exit Sub
For i = 1 to j
     ListBox1.AddItem“Log (“ & i & “) = “ & VBA.Log(i) / VBA.Log(10)
Next

Burada 1’den TextBox1 kutusuna girilen sayıya kadar olan sayıların logaritmasını listeye ekliyoruz. Ancak kullanıcı kutuya 0 veya daha küçük bir sayı girmişse alt programdan çıkıyoruz.

19.4.4 End

Programı sona erdirir. Bütün açık olan formları kapatır.

19.4.5 With– End With Yapısı 

Bir kontrole ait bir özellik değiştirilmek istendiği veya bir metod çağrıldığı durumlarda kontrol adının da verilmesi gerekir. Herhangi bir kontrol elemanının birden fazla özelliğini değiştirmek yada metodlarına ulaşmak için With – End Wtih deyimi kolaylık sağlar. Kullanım biçimi şöyledir, 

With KontrolAdı
     .Özellik = Değer
     .Özellik = Değer
     . ……
End Wtih 

Sol tarafta verdiğimiz program kodunu With - End With deyimi kullanarak sağ taraftaki gibi daha kısa bir şekilde yazabiliriz.

19.5 Operatörler

Bütün programlama dillerinde aritmetik ve lojik işlemler için gerekli operatörler bulunur. VB ve VBA’da aritmetik işlemlerin bazıları operatörlerle yapılırken bazıları da fonksiyonlarla yapılır. VB ve VBA’ da kullanılan aritmetik ve lojik operatörler şunlardır: 

19.5.1 Modİşlemi

Mod işlemi bir sayının bir başka sayıya bölümünden kalanı verir. Bu ilk bakışta programcılık açısından fazla önemli değil gibi gözüksede aslında bir sayının katlarını bulmak içinde kullanılabilineceğinden oldukça kullanışlı bir operatördür. Bir sayı başka bir sayının tam katı ise o sayıya bölümde kalan 0 olacaktır. Örneğin 1’ den 100’ e kadar olan sayılar toplanacak bir programda her 10 adım sonucunu mesaj ile ekranda görmek istersek,

Sub ModOperatörü()
     Dim i, Eleman
     For i = 1 To 100
          Eleman = Eleman + i
          Cells(i + 1, 1) = i
          Cells(i + 1, 2) = Eleman
          If i Mod 10 = 0 Then
               Cells(i + 1, 3) = i Mod 10
          End If
     Next
End Sub 

19.5.2 Karşılaştırmalı İşlemler 

Sub KarşılaştırmaOperatörü()
     Dim Eleman, Sonuç
     If Eleman <> 0 Then Sonuç = "Eşit Değil"
     If Eleman > 0 Then Sonuç = "Büyük"
     If Eleman < 0 Then Sonuç = "Küçük"
     If Eleman = 0 Then Sonuç = "Eşit"
     If Eleman >= 0 Then Sonuç = "Büyük veya Eşit"
     If Eleman <= 0 Then Sonuç = "Küçük veya Eşit"
End Sub

Bunların haricinde VB ve VBA’ deki Like operatörü ile stringler üzerinde daha detaylı karşılaştırma işlemleri yapılabilmektedir. Like operatöründe tıpkı dosya isimlerinde olduğu gibi joker karakterler vererek karşılaştırma yapmak mümkündür. Like operatöründe kullanılabilecek joker karakterlerşunlardır, 

?                      Herhangi bir karakter
#                      Herhangi bir rakam
*                      Bir veya daha fazla karakter
[aralık]            Verilen aralıkta bir karakter
[!aralık]           Verilen aralık dışında bir karakter 

If adres Like “*İstanbul” Then ; ifadesi ile adres değişkeninin sonundaİstanbul bulunup bulunmadığı

If adres Like “*İstanbul*” Then ;ifadesi ile adres değişkeninin herhangi bir yerinde İstanbul bulunup bulunmadığı 

If adres Like “İstanbul*” Then ; ifadesi ile adres değişkeninin başındaİstanbul bulunup bulunmadığı kontrol edilebilir. 

If x Like “?abc” then ; ifadesi ile x değişkeninin ilk harfinin herhangi bir karakter ancak diğer üç karakterin abc olup olmadığı

If x Like “#abc” Then ; ifadesi ile x değişkeninin ilk harfinin herhangi bir rakam ancak diğer üç karakterin abc olup olmadığı 

If x Like “[a-f]abc” Then; ifadesi ile x değişkeninin ilk harfinin a ile f arasında herhangi bir karakter ve diğer üç karakterin abc olup olmadığı

If x Like “[!a-f]abc” Then; ifadesi ile de x değişkeninin ilk harfinin a ile f arasında olmayan herhangi bir karekter ve diğer üç karakterin abc olup olmadığı kontrol edilir 

19.5.3 İşlem Önceliği 

Aritmetik işlemler söz konusu olduğunda işlem önceliği sonucu etkileyen önceli bir etkendir. Örneğin, 5+7*2-3/9^3*5 işleminin sonucun kaç olduğu işlemdeki operatörlerin  önceliği ile ilgilidir. Bu tip işlemlerde parantezler kullanmak her zaman önceliği belirleyici faktördür. Ancak parantezlerin bulunmadığı durumlarda aşağıdaki işlem önceliklerine göre işlemler yapılır.

Sub OperatörKullanımları()
     Dim A, B, C, D
     Dim Kontrol As Variant
     A = 10: B = 8: C = 6: D = Null        ' Kurgulanan değişkenler.
     Kontrol = A > B Eqv B > C ' Doğru (True)
     Kontrol = B > A Eqv B > C ' Yanlış (False)
     Kontrol = A > B Eqv B > D ' Boş(Null)
     Kontrol = A Eqv B      ' -3 denkliğinde
     Kontrol = A Imp B      ' -3 denkliğinde
     Kontrol = A > 0 Or B > 0     ' Doğru (True)
     Kontrol = A > 0 Xor B > 0    ' Yanlış(False)
     Kontrol = A > 0 And B > 0   ' Doğru (True)
     Kontrol = Not A> 0    ' Yanlış (False)
     Select Case Kontrol
     Case Is = True: MsgBox Kontrol
     Case Is = False: MsgBox Kontrol
     End Select
End Sub

19.6 Fonksiyonlar ve Alt Programlar

Bir fonksiyon yada bir alt program belirli bir işi yapmak için oluşturulan küçük program parçalarıdır. (Fonksiyon ve altprogram, bu ikisini birden belitmek için prosedür kelimesini kullanacağız). Fonksiyon ve alt program tanımlamanın bir çok avantajı vardır. Bir çok yerde aynı kodları kullanamanız gerektiğinde bunları her sefer yeniden yazmak yerine bu kodları bir prosedürde tanımlayıp, kullanacağınız yerden bunu çağırmanız yeterlidir.

19.6.1 Prosedür (Procedure) Tanımı 

Sub, Function ve Property olmak üzere üç grup prosedür tanımlanır. 

Sub AltProgramAdi ([GirisParametreleri] As Tipi)
     Komutlar
     [Exit Sub]
End Sub

Function FonksiyonAdi ([GirisParametreleri] As Tipi) [As Tipi]
     Komutlar
     [Exit Function]
     [FonksiyonAdı=GeriDonusDegeri]
End Function

Property Set PropertyAdı(ByVal/BySet [GirişParametreleri] As Tipi)
     Komutlar
End Property

Fonksiyon alt programdan farklıolarak geriye bir değer gönderebilir. Bu değer gönderme işlemi fonksiyon ismine geri dönecek değerin atanmasıyla olur. Bir fonksiyon veya alt program normalde End Sub veya End Function satırıyla biter. Ancak bazı şartlar gerçekleştiğinde, fonksiyonun çalışmasını bitirmeden çıkmak   Exit Function (alt program ise Exit Sub) ile yapılabilir. 

Programda yeni bir fonksiyon veya alt program tanımlamak için kod penceresinde boş bir yere gelerek aşağıdaki kodları yazmak yeterlidir. Geri kalan tamamlama kodlarını VBA kendisi yazacaktır zaten. Bu şekilde yazıldığı takdirde VBA giriş parametlerinin ve tip
tanımlamalarınıyazmayacaktır. Bunları belirtmek istersek yukarıdaki anlattığımız şekilde yazmak gerekecektir.

Yerel tanımlar; Sub, Function, Property veya Private Sub, Private Function, Private Property

Genel fonksiyon; Public Sub, Public Function, Public Property

19.6.2 Prosedür Çağrısı

Programın herhangi bir yerinden alt programı çağırmak

AltProgramAdi [GirisDegerleri] 

Fonksiyonu çağırmak ise

Donendeger=FonksiyonAdı([GirisDegerleri])

Şeklinde yapılır.

Örnek: Programların hemen hemen tümünde ihtiyaç duyulan günün tarihini kendi formatımızla bir genel fonksiyonda tanımlayıp daha sonrada bir TextBox’ a çift tıklanıp içine fonksiyonun geri dönen değerini yazdıralım. İlk önce fonksiyonun tanımınıyapalım.

Public Function tarih ()
     tarih = Format (Date, “dd.mm.yyyy”)
End Function

Burada ilk önce genel bir fonksiyon açılıyor. Daha sonra geri dönen değer fonksiyon değişkenine atanıyor. Sonrada fonksiyon kapatılıyor. Artık fonksiyonumuzu programımızın her yerinde rahatlıkla çağırıp kullanabiliriz. 

TextBox' ın DoubleClick olayına aşağıdaki kodu yazalım. 

TextBox1 = tarih

Çok basit bir fonksiyon olmasına rağmen, günün tarihinin çok fazla kullanılacağı yerlerde (Örneğin, sekreter programlarında) programcıyı karmaşık kodlardan kurtaracaktır.

20 Bilgi Giriş ve Mesaj Pencereleri

20.1 MsgBox

Windows’ ta en aşina olduğumuz şey programın akışı sırasında bilgi vermek ve onaylatmak için karşımıza çıkan mesaj kutularıdır. Örneğin bir programdan çıkarken “Kaydedilsin mi?” gibi bir soru ve duruma göre Evet, Hayır, İptal vb. seçenekleri olan bir kutu çıkar. Bu kutu Windows tarafından sağlanan standart bir kutudur ve Windows altında çalışan bütün programlarda aynıdır. Mesaj kutusu sadece kullanıcıya mesaj vermek amacıyla kullanılacaksa aşağıdaki gibi kullanılır.

MsgBox “Programa hoş geldiniz” 

Bu durumda mesajla birlikte Tamam düğmesi olan aşağıdaki pencere çıkar.
Mesaj kutuları bir çok durumda sadece bir mesaj vermek için değil aynı zaman da
kullanıcıdan onay almak içinde kullanılır. Kullanıcının mesaj kutularında verebileceği
cevaplar için uygun düğmeleri belirlemek ve verilen cevabı da öğrenebilmek için MsgBox fonksiyonu aşağıdaki formatta kullanılır.

cevap = MsgBox ( mesaj, [tip], [pencerebasligi], [, helpfile, [context]) 

Komut formatının parametleri şunlardır.

Mesaj; Kutu içerisine yazılmasını istediğiniz mesaj. 

Pencerebasligi; Pencerenin başlığına yazılacak metin.

Helpfile, Context; Bu iki özellikle bir yardım dosyasıismi ve bir konu numarası belirlenebilir. Böylece kullanıcının mesaj kutusunda yardım istediğinde ilgili help dosyası açılır ve ilgili konu gösterilir.

Tip; Pencerenin içine konacak seçenekler, iconlar, pencerenin önceliğini ve varsayılan
seçenekleri belirten bir sayıdır. Tip parametresini şu şekilde formülize edersek, 

tip = secenek + icon + varsayilan + oncelik 

Bu formüldeki değerlerin alabileceği liste aşağıdaki gibidir. Aşağıdaki tabloda en önemli parametre mesaj kutusunun tipini belirleyen seçenek parametresidir. Bu parametre mesaj kutusunda hangi düğmelerin bulunacağını belirler. Icon parametresi ise kullanıcının dikkatini çekebilmek için mesaja uygun bir resmin gösterilmesinde kullanılır. Varsayılan düğme parametresi ise kullanıcının yanlış seçim yapmasını önlemek için açılan pencerede hangi düğmenin aktif olacağını belirler. Örneğin önemli bir dosyayı silmek için kullanıcıdan onay alırken açtığınız pencerede varsayılan düğmeyi Hayır düğmesi yaparak kullanıcının dosyayı yanlışlıkla silmesi önlenebilir.

Öncelik parametresi 4096 olmasıdurumunda mesaj kutusunda herhangi bir seçim yapılmadan diğer uygulamalara geçiş yapılamaz. Bu ayrı dört seçenek birbiriyle toplanarak MsgBox fonksiyonunun ikinci parametresi olarak kullanılır.

MsgBox fonksiyonundan kullanıcının hangi düğmeyi seçtiğini belirtir bir tamsayı geri döner. Bu değerler aşağıdaki tabloda verilmiştir.

Örnek: Program kapatılırken çıkmak isteyip istemediğini soracak bir mesaj kutusu oluşturalım ve gerekli kodu yazalım. Form kapatılırken Terminate olayı meydana geleceğinden gerekli kodu bu olaya yazacağız.

Sub MsgBoxDurumu()
     Dim Cevap As Variant
     Cevap = MsgBox("Çıkmak istiyormusunuz?", vbOKCancel, "Lütfen Dikkat")
     If Cevap = vbOK Then
          MsgBox "Hoşçakalın", vbInformation
          Application.Quit
     End If
End Sub 

20.2 InputBox 

Kullanıcının gereken değeri girmesi için Visual Basic’te InputBox fonksiyonu geliştirilmiştir. Bu fonksiyon standart olarak Ok ve Cancel düğmeleri bulunan bir pencere açar ve değer girişi bu pencereden yapılır.

InputBox (mesaj [,baslik][,varsayilan deger][,x][,y][,helpfile, context]) 

Mesaj; Girilmesi gereken değer için açıklama veya soru.

Başlık; Açılacak pencerenin başlığı. 

Varsayılandeğer; Değer giriş kutusunda bulunmasıistenen değer.

x, y; Pencerenin, sol üst köşesinin x ve y koordinatlarını belirler. 

Fonksiyondan dönen değer kullanıcının yazdığı metindir. Kullanıcı Cancel düğmesini seçmişse boş değer döner. InputBox fonksiyonundaki son iki parametre ile yardım dosyasının ismi ve konu numarası verilirse pencereye ayrıca yardım düğmesi de eklenecektir. 

Sub InputBoxDurumu()
     Dim Giriş
     Giriş =InputBox("İsminizi Girermisiniz?", "Bilgi Girişi", "İsminiz", 0, 0)
     ListBox1.AddItem Giriş
End Sub

21 Komutlar 

21.1 Disk ve Dosya Yönetim Komutları 

21.1.1 ChDrive

ChDrive Sürücü Harfi; Aktif sürücüyü değiştirir.

Sürücü Harfi: Geçilmek istenen sürücünün baş harfini içeren string değerdir. Stringin

içeriği bir karakterden fazla ise ilk harf dikkate alınır. 

Sub ChDriveKomutu()
     On Local Error GoTo Hata
     VBA.ChDrive "A" 'A sürücüsüne geç
     Exit Sub
Hata:
     MsgBox "Disket sürücüye erişilemedi:" & Error
     Exit Sub
End Sub 

21.1.2 ChDir 

ChDir Dizin; Aktif dizini değiştirmeye yarar. VB ve VBA’ daki komutların dosya isimlerinde yol kullanılmazsa, aktif sürücü ve dizinde aranır.

Sub ChDirKomutu()
     On Local Error GoTo Hata
     VBA.ChDir "C:\Windows" 'Aktif dizini Windows dizini yap
     Exit Sub
Hata:
     MsgBox "Dizine erişilemedi:" & Error
     Exit Sub
End Sub

21.1.3 MkDir

MkDir DizinAdı; Dizin oluşturmak için bu komut kullanılır. DizinAdı isimli dizini oluşturur. 

Sub MkDirKomutu()
     On Local Error GoTo Hata
     VBA.MkDir "C:\Windows\yedek" ' Windows dizini altına yedek dizini aç
     Exit Sub
Hata:
     MsgBox "Dizin oluşturulamadı:" & Error
     Exit Sub
End Sub 

21.1.4 RmDir

RmDir DizinAdı; İsmi verilen dizini siler. İsmi verilen dizinin alt dizinlerinin bulunmaması ve boş olması gerekir.

Sub RmDirKomutu()
     On Local Error GoTo Hata
     VBA.RmDir "C:\Windows\yedek" 'Windows dizini altına yedek dizinini sil
     Exit Sub
Hata:
     MsgBox "Dizin silinemedi:" & Error
     Exit Sub
End Sub 

21.1.5 Kil 

Kill DosyaAdı; İsmi verilen dosyayı siler.  

Sub KillKomutu()
     On Local Error GoTo Hata
     VBA.Kill "C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files\*.*" 'Windows dizini altındaki tmp dosyaları sil
     Exit Sub
Hata:
     MsgBox "Dosyalar silinemedi:" & Error
     Exit Sub
End Sub 

21.1.6 Name 

Name Ad As YeniAd; Verilen dosyanın adını değiştirir.  

Sub NameKomutu()
     Dim Klasör As String, Eski As String, Yeni As String
     Klasör = "C:\Documents and Settings\Administrator\Belgelerim\Mustafa ULUSARAÇ\ExcelVBA\"
     Eski = "Deneme.doc"
     Yeni = "Deneme1.doc"
     VBA.Name Klasör & Eski As Klasör & Yeni ‘Dosya adı değiştirilmiştir.
End Sub 

21.1.7 CurDir 

CurDir[Sürücüharfi];Aktif dizini öğrenmenize yarar. Sürücüharfi kullanılmazsa aktif sürücüdeki aktif dizini bildirir. Sürücü harfi verilirse verilen sürücüdeki aktif dizini bildirir. 

Sub CurDirKomutu()
     Dim Klasör As String
     Klasör = ThisWorkbook.Path
     VBA.CurDir Klasör
End Sub 

21.1.8 FileCopy

FileCopy kaynakdosya, hedefdosya; Bu komut DOS’ un Copy komutu kadar gelişmiş olmasada bir dosyayı bir yerden, başka bir yere kopyalamanızı sağlar. 

kaynakdosya: Kopyalanacak dosyanın yeri ve dosyanın adı.
hedefdosya: Kopyalanacak dosyanın yeni yeri ve adı.

Dosya adı,sürücü ismi ve yol içerebilir ancak joker karakter dediğimiz *,? Gibi karakterleri içeremez. Bu da, bu komutu kullanarak bir seferde sadece bir dosya kopyalayabilirsiniz demektir. 

Sub FileCopyKomutu()
     Dim KaynakDosya As String, HedefDosya As String
     KaynakDosya = "C:\Documents and Settings\Administrator\Belgelerim\Mustafa LUSARAÇ\ExcelVBA\ExcelVBA.xls"
     HedefDosya = "c:\ExcelVBA.txt"
     VBA.FileCopy KaynakDosya, HedefDosya
End Sub

21.1.9 FileLen

FileLen (Dosyaadi); İsmi verilen dosyanın boyutunu byte olarak bildirir. Bu dosya adına sürücü ve yol ismi de verilebilir.

Sub FileLenKomutu()
     Dim Dosya As String
     Dosya = "C:\Documents and Settings\Administrator\Belgelerim\Mustafa ULUSARAÇ\ExcelVBA\ExcelVBA.xls"
     MsgBox "Dosya büyüklüğü: " & VBA.FileLen(Dosya) & " byt dır", vbInformation, "FileLen Komutu"
End Sub

21.1.10 FileDateTime

Dosyanın tarih ve saatini verir. Geri dönen değer “Tarih Saat” formatındadır.

Sub FileDateTimeKomutu()
     Dim Dosya As String
     Dosya = "C:\Documents and Settings\Administrator\Belgelerim\Mustafa ULUSARAÇ\ExcelVBA\ExcelVBA.xls"
     MsgBox "Dosya tarih ve saati: " & VBA.FileDateTime(Dosya) & " dır.", vbInformation, "FileLen   Komutu"
End Sub 

21.1.11 Dir

Dir [(Klasöradi[,AttrMaskesi])]; Dosya, dizin listelemeye ve bulmaya yarayan kullanışlı bir komuttur.
Dosyaadi : Dosyanın veya dizinin ismi. Bu isim içerisinde * ve ? karakterleri de bulunabilir.
AttrMaskesi : Bu parametre verilmezse sadece attributesi normal olan dosyalar dikkate alınır. 

Aşağıdaki örnekteki seçeneklere göre arama yapılabilir.

'UserForm1
Option Explicit
Dim i As Single
Private Dosya As String
Private Const Normal = 0     'Normal file. No attributes are set.
Private Const ReadOnly = 1 'Read-only file. Attribute is read/write.
Private Const Hidden = 2      'Hidden file. Attribute is read/write.
Private Const System = 4       'System file. Attribute is read/write.
Private Const Volume = 8     'Disk drive volume label. Attribute is read-only.
Private Const Directory = 16            'Folder or directory. Attribute is read-only.
Private Const Archive = 32   'File has changed since last backup. Attribute is read/write.
Private Const Alias = 64        'Link or shortcut. Attribute is read-only.
Private Const Compressed = 128      'Compressed file. Attribute is read-only.
Sub CommandButton1_Click()
     DirKomutu "C:\", Hidden
End Sub
Sub DirKomutu(Klasör, Seçenek)
     On Error Resume Next
     ListBox1.Clear
     Dosya = VBA.Dir(Klasör, Seçenek)
     Do While Dosya<> ""
          If Dosya<> "." And Dosya <> ".." Then
               ListBox1.AddItem Dosya: ListBox1.List(i, 1) = VBA.FileLen(Klasör & Dosya): i = i + 1
          End If
          Dosya = VBA.Dir
     Loop
End Sub 

21.2 Tarih ve Zaman Fonksiyonları 

21.2.1 Date 

Günün tarihini öğrenmeye ve değiştirmeye yarar. 

MsgBox “Bugün :” & VBA.Date

Bilgisayarın tarihini değiştirmek için direkt atama yapılabilir.

VBA.Date = “19/06/2004”

İki tarih arasındaki farkı bulmak için de CVDate (veya CDate) fonksiyonundan faydalanılabilir.  

Dim x
x = Date – VBA.CVDate(“15/06/2004”)
MsgBox “15/06/2004 den bugüne kadar olan gün sayısı : “& x 

21.2.2 Time 

Saati öğrenmeye ve değiştirmeye yarar. 

MsgBox “Saat : “ & VBA.Time

Bilgisayarın saatini değiştirmek için direkt atama yapılabilir. 

VBA.Time = “22:41:00” 

Now; Bu günün tarihini ve saatini birlikte verir.

MsgBox VBA.Now
MsgBox Date & VBA.Time 

Bu iki satırda aynı işi yaparlar. Date ve Time komutlarıyla zaman ayarı yapılırken Now komutu ile bu ayar yapılamaz. 

21.3 Uygulamalarlaİlgili Komutlar 

21.3.1 Shell

Shell (Komutsatiri, [penceresekli])
Programdan başka bir programı çalıştırmak için Shell komutu kullanılır. 
Komutsatiri ; Çalıştırılacak programın adı.
Penceresekli;  Bu parametreye aşağıdaki sayılardan biri verilerek programın çalıştığı
pencereşekli belirlenebilir. Bu parametre kullanılmazsa 2 kabul edilir.

Sub ShellKomutu()
   VBA.Shell "C:\Program Files\Microsoft Office\OFFICE11\POWERPNT.exe", 1
End Sub

21.3.2 AppActivate

Programdan, o anda çalışan başak bir programı aktif hale getirmek için AppActivate komutu kullanılır.

AppActivate pencerebasligi 

pencerebasligi : aktif hale getirilecek programın pencere başlığı. 

Aktif hale getirilecek programın o anda çalışıyor olması ve pencere başlığının tam olarak verilmesi gerekir. Bu parametrede büyük ve küçük harf kullanımı aynı değildir. Yani “Program Yöneticisi” ve “program yöneticisi” farklı iki başlıktır. Pencere başlığı yerine o penceresini task ID değeride verilebilir. Bu değer API ler vasıtasıyla öğrenilebilineceği gibi aktif hale getirilecek program Shell komutu ile çağrılmışsa Shell komutundan geri dönen değer de kullanılabilir. 

Sub AppActivateKomutu()
     VBA.AppActivate "Windows Media Player", "0"
End Sub

21.3.3 Environ

İşletim sisteminin çevre değişkenleri bu komut ile öğrenilebilir. Çevre değişkeni işletim sisteminde SET deyimi ile tanımlanabililen, bir kısmıözel değişkenlerdir. Örneğin, PATH, PROMPT gibi çevre değişkenleri işletim sistemi tarafından direkt olarak tanınan çevre değişkenleridir, BLASTER, CLIPPER gibi çevre değişkenleri ise özeldir ve bazı programlar tarafından tanınır. 

Environ (no) 

No;İstenen çevre değişkeninin numarasıdır. Bu numara standart bir değişkeni temsil
etmez. Tanımlanış sırasına göre ilk değişken 1 kabul edilir. İlk kullanım formatında geri dönen değer o çevre değişkeninin tam metnidir.

Sub EnvironKomutu()
     Dim i As Single
     i = 1
     Dim Tanım As String, Konu As String, Açıklama As String
     Tanım = VBA.Environ(i)
     Do While Tanım<> ""
          Konu = VBA.Mid(Tanım, 1, VBA.InStrRev(Tanım, "=", -1) - 1)
          Açıklama = "'" & VBA.Right(Tanım, VBA.Len(Tanım) - VBA.InStrRev(Tanım, "=", -1) + 1)
          ThisWorkbook.Sheets(1).Cells(i, 1) = Konu
          ThisWorkbook.Sheets(1).Cells(i, 2) = Açıklama
          i = i + 1
          Tanım = VBA.Environ(i)
     Loop
End Sub 

21.3.4 DoEvents

Sıradaki olayların yapılmasına imkan verir. Programınızda çalışması uzun süren kod bloklarıvarsa (döngüler gibi) kod bloğunun çalışması bitene kadar formunuzun üzerinde hiçbir işlem yapamazsınız. Bu tip uzun süren bloklarda belirli aralıklarla kontrolü Windows’ a vererek sıradaki işlemlerin yapılmasını sağlamanız gerekir. Windows’a kontrolü vermek için DoEvents fonksiyonu kullanılır. Ancak işlem süresinin de uzamasına yol açar. 

Sub DoEventsKomutu()
     On Error Resume Next
     Dim ss As SearchScope
     Dim sf As ScopeFolder
     Dim Sayaç As Long
     With Application.FileSearch
          .NewSearch
          .FileType = msoFileTypeWebPages
          .FileTypes.Add msoFileTypeExcelWorkbooks
          For Sayaç = 1 To .SearchFolders.Count
               .SearchFolders.Remove Sayaç
          Next Sayaç
          For Each ss In .SearchScopes
               Select Case ss.Type
               Case msoSearchInMyComputer
                    For Each sf In ss.ScopeFolder.ScopeFolders
                         Call BulunanYol(sf.ScopeFolders, "1033")
                    Next sf
               Case Else
               End Select
          Next ss
          If .SearchFolders.Count > 0 Then
               .LookIn = .SearchFolders.Item(1).Path
               If .Execute <> 0 Then
                    For Sayaç = 1 To .FoundFiles.Count
                         ThisWorkbook.Sheets(2).Cells(Sayaç, 1) = .FoundFiles.Item(Sayaç)
                    Next Sayaç
               End If
          End If
     End With
End Sub
Sub BulunanYol(ByVal sfs As ScopeFolders, ByRef strFolder As String)
     Dim sf As ScopeFolder
     For Each sf In sfs
          If LCase(sf.Name) = LCase(strFolder) Then sf.AddToSearchFolders
          VBA.DoEvents ’Windows kontrolü sağlanır
          If sf.ScopeFolders.Count > 0 Then Call BulunanYol(sf.ScopeFolders, strFolder)
     Next sf
End Sub 

21.4 String İşlemleri 

21.4.1 StrComp

Daha önceki kuşak Basic’ lerde bu işlem direkt olarak = operatörü ile yapılıyordu. VB ve VBA’ da da bu karşılaştırma işlemi = operatörü ile yapılabilirken dah gelişmiş olarak StrConp fonksiyonu ile de yapılabilir. 

StrComp (String1, String2, [Şart])
String1, String2; Karşılaştırılacak iki string.
Şart; Bu parametreye 0 verilirse büyük-küçük harf ayrımı yapılır, 1 verilirse bu ayrım yapılmaz. 

Burada Windows’ tan kaynaklanan bir avantaj da vardır. Büyük-küçük harf karşılaştırması sadece İngilizce alfabesinde bu nan karakterler için geçerli değildir, Windows Türkçe ise Türkçe büyük-küçük harf ayrımı da yapabilir. Yalnız (i) harfinde problem vardır. Küçük (i) harfi büyük (I) harfine çevrilir.

Karşılaştırma                                  Sonuçları
string1 < string2                                -1
string1 = string2                                 0
string1 > string2                                 1
string1 veya string2 Boş                     Null 

Sub StrCompKomutu()
     Dim Sonuç
     Sonuç = VBA.StrComp("Windows", "windows", vbTextCompare)’=0
End Sub

21.4.2 Trim 

Kullanıcıdan bir metin girmesini istediğinizde, kullanıcı metnin başına veya sonuna fazladan boşluklar bırakmış olabilir. Özellikle karşılaştırma işlemlerinde bu boşluklar problem çıkarır. Aynı durum rastgele erişimli dosyalarda da olur. Okunan bilginin sonunda fazladan boşlukla bulunabilir. Bu boşlukları atmak için üç tane komut vardır. 

LTrim (Metin); Verilen metnin başındaki boşluklarıkaldırır.

RTrim (Metin); Verilen metnin sonundaki boşluklarıkaldırır. 

Trim (Metin); Verilen metnin her iki tarafındaki boşlukları kaldırır.

Sub TrimKomutu()
     Dim Sonuç
     Sonuç = VBA.Trim(" Windows ")’=Windows
End Sub

21.4.3 UCase, LCase 

Metin içeren ifadeleri büyük veya küçük harfe çevirmek için iki tane komut bulunur. 

UCase (Metin); Girilen metindeki karakterleri büyük harfe çevirir. 

LCase (Metin); Girilen metindeki karakterleri küçük harfe çevirir.

Sub UCaseLCaseKomutu()
     Dim Sonuç
     Sonuç = VBA.UCase("Windows")'=WINDOWS
     Sonuç = VBA.LCase("Windows") '=windows
End Sub

21.4.4 StrConv, StrReverse

StrConv (Metin, Mod); Metni verilen mod'a göre dönüştürür. Mod parametresinin alabileceği değerler ve yapılacak dönüşümler ise şöyledir. 

StrReverse (Metin); Verilen stringi ters çevirir.

'Module1
Option Explicit
Dim Karakter As String, Sonuç As String
Private Const vbUpperCase = 1'Converts the string to uppercase characters.
Private Const vbLowerCase = 2 'Converts the string to lowercase characters.
Private Const vbProperCase = 3 'Converts the first letter of every word in string to uppercase.
Private Const vbWide = 4 '(*)Converts narrow (single-byte) characters in string to wide (double-byte) characters.
Private Const vbNarrow = 8 '(*)Converts wide (double-byte) characters in string to narrow (single-byte) characters.
Private Const vbKatakana = 16'(**)Converts Hiragana characters in string to Katakana characters.
Private Const vbHiragana = 32'(**)Converts Katakana characters in string to Hiragana characters.
Private Const vbUnicode = 64 'Converts the string to Unicode using the default code page of the system. (Not available on the Macintosh.)
Private Const vbFromUnicode = 128 'Converts the string from Unicode to the default code page of the system. (Not available on the Macintosh.)
'(*)= Applies to Far East locales.
'(**)= Applies to Japan only.
Sub StrConv_StrReverseKomutu()
     Karakter = "Excel"
     Sonuç = VBA.StrReverse(Karakter) ' lecxE
     Sonuç = VBA.StrConv(Karakter, vbUpperCase) 'EXCEL
End Sub 

21.4.5 Len

Len (Metin); Metin içindeki karakter sayısını verir. Bu sayıya boşluklarda dahildir. 

MsgBox VBA.Len(TextBox1)

21.4.6 Right, Left, Mid

Right (Metin, n); Metin içinde sağdan n karakteri verir. Aşağıdaki örnekte sağdan üç harf alınması istenmiştir.  

MsgBox VBA.Right("Excel", 3) Sonuç= cel  

Left (Metin, n); Metin içinde soldan n karakteri verir. 

MsgBox VBA.Left("Excel", 3) Sonuç= Exc 

Mid (Metin, Baslangic [,uzunluk]); Metin içinde Başlangıç’ tan Uzun’ luk kadar karakter verir. Aşağıdaki örnekte üçüncü harften itibaren altı harf alınması istenmiştir.

MsgBox VBA.Mid("Excel, Word, PowerPoint", 3, 8) ‘Sonuç cel, Wor

21.4.7 InStr, InStrRev

InStr ([KacinciHarften,] NeyinIcinde, Neyi, Nasil); InStr fonksiyonu bir stringin içinde bir başka stringi istediğiniz konumdan itibaren büyük-küçük harf ayrımı yaparak veya yapmadan arayabilir ve bulursa bulduğu yerin konumunu geri gönderir. Burada, KacinciHarften parametresi ile aramaya kaçıncı karakterden başlanacağını belirtir. Bu parametre kullanılmazsa baştan itibaren aranır.  

vbBinaryCompare                  0                     Büyük-küçük harf ayrımı yapacak. vbTextCompare                     1                     Büyük-küçük harf ayrımıyapmayacak.
vbDatabaseCompare              2                     Microsoft Access için kullanılır 

InStrRev (NeyinIcinde, Neyi, [KacinciHarften],[Nasil]); InStr fonksiyonu gibidir ama arama işlemini baştan değil sondan başlayarak yapar. .

Sub InStr_InStrRevKomutu()
     Dim Kelime As String, Sonuç As String
     Kelime = "Microsoft Office Excel 2003®"
     Sonuç = VBA.InStr(1, Kelime, "®", vbTextCompare) '=28
     Sonuç = VBA.InStrRev(Kelime, "®", -1, vbTextCompare) '=28
End Sub 

21.4.8 Space

Space (sayi); Verilen sayıda boşluk oluşturur. 

MsgBox “Excel’ e” & VBA.Space(10) & “hoş geldiniz” 

21.4.9 Asc, Chr 

Bilindiği gibi bilgisayarda harfler, rakamlar, işaretler ve diğer karakterler birer sayı ile temsil edilir. Her karakterin 0-255 arası bir kodu vardır. Bu koda Ascii kodu denir. VB ve VBA’ da hem bir karakterin ascii kodunu verecek, hemde Ascii kodu bilinen karakteri üretecek fonksiyonlar mevcuttur. 

Asc (Harf); Verilen harfin Ascii kodunu verir. 

Chr (AsciiKodu); Ascii kodu verilen sayının karakter karşılığını üretir.

Sub Asc_Komutu()
      With Range("N20")
           .Value = VBA.Asc("®")’®Alt & 169
           .Font.Bold = True
           .Font.Name = "Arial"
      End With
End Sub
Sub Chr_Komutu()
     With Range("N20")
          .Value = VBA.Chr(174)’® Alt & 169
          .Font.Bold = True
          .Font.Name = "Arial"
     End With
End Sub 

21.4.10 Str, Val 

Programlama dillerinde hem sayıhemde metin için değişkenler tanımlanabilmektedir. Ancak bazıdurumlarda metin olarak tanımlanmış bir değişken içinde sayı olabilir. Örneğin metin kutusu metin türünde olmasına rağmen içine sayı girilmesini isteyebilirsiniz. Metin türündeki bir değişken içindeki sayı üzerinde işlem yapabilmek içinde onu Val fonksiyonu ile sayıya çevirmek gerekir. 

Str (sayi); Verilen sayısı stringe çevirir. 

MsgBox VBA.Str(123) ‘= “123” 

Val (String); Verilen stringi sayıya çevirir. Bu işlemi yaparken çevirme işlemi geçersiz bir karaktere rastlanıncaya kadar devam eder.  

MsgBox VBA.Val(“123”) ‘= 123

21.5 Rastgele Sayı Üretim Fonksiyonları

21.5.1 Rnd, Randomize

Fonksiyon 0 ile 1 arasında sayıüretir.

MsgBox VBA.Rnd ‘0 ile 1 arasında bir sayı üretir
MsgBox VBA.Rnd * 100 ‘0 ile 100 arasında bir sayı üretir
MsgBox VBA.Int(VBA.Rnd * 100) ‘0 ile 100 arasında bir tamsayı üretir.   Fonksiyonun 0 ile bir sayı arasında değil de iki sayı arasında değer üretmesini sağlamak için üzerinde değişik işlemler yapılabilir.

MsgBox VBA.Rnd * 30 + 20 ’20 ile 50 arasında bir sayı 

Rnd * (b-a) + a; a ile b arasında bir sayı üretmek için kullanılacak yöntemdir.
Randomize; rasgele sayı üretecisini başlatmak için, yeni bir tohum değeri verir.

Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
     Dim R1, R2, R3
     With Me
          .Height = 255
          .Width = 255
      End With
      VBA.Randomize
      R1 = VBA.Round(VBA.Rnd * X, 0)
      R2 = VBA.Round(VBA.Rnd * Y, 0)
      R3 = VBA.Round((R1 + R2) * Pi/4, 0)
      Me.BackColor = VBA.RGB(R1, R2, R3)
End Sub

21.6 Yuvarlatma Fonksiyonları

Eğer iki tam sayıyı bölüp sonucu yine tam sayı olarak göstermek isterseniz, yani virgülden sonraki kısmın atılmasını isterseniz \ operatörünü kullanabilirsiniz.

21.6.1 Int

VBA.Int (Sayı); fonksiyonu ise virgülden sonraki sayıyı atarak kendinden düşük en yakın tamsayıya yuvarlatır. Eğer sayı pozitifse sayının tam kısmı alınmış olur, negatifse kendinden bir önceki sayıya yuvarlatılmış olur.

21.6.2 Fix

VBA.Fix (Sayı); Int fonksiyonu negatif sayılarda sayının tam kısmınıvermek yerine kendinden önceki sayıyı veriyordu. Fix fonksiyonu ise negatif ve pozitif sayılarda aynı         şekilde davranır ve sayının virgülden sonraki kısmını atar. 

21.6.3 Round 

VBA.Round (sayi,basamaksayisi); Int ve Fix fonksiyonları virgülden sonraki bütün basamakları atıyor ve yuvarlatma işlemeni (yani 5’ den büyükleri bir üste, küçükleri bir alta) yapmıyordu. Bu fonksiyonla sayının istediğiniz kadar basamağını yuvarlatabilirsiniz.       Basamaksayisi parametresine 0 verirseniz, virgülden sonraki bütün rakamlar yuvarlatılır. Örneğin, bu parametreye 2 verdiğinizde virgülden sonraki iki basamak listelenecektir. 

Msgbox VBA.Round (60.215, 0) ‘Sonuç: 60
MsgBox VBA.Round (60.215, 1)Sonuç: 60.2
MsgBox VBA.Round (60.215, 2) ‘Sonuç: 60.22
MsgBox VBA.Round (60.715, 0) ‘Sonuç: 61

22 Dosyalama İşlemleri

Programdaki bazı bilgilerin kalıcıolarak saklanması ihtiyacı her zaman vardır. Bir dosyadan kayıt okuyabilmek veya kayıt yapabilmek için önce dosya açılır üzerinde işlem yapıldıktan sonra da kapatılır. Eğer açık olan bir dosya tekrar açılmaya çalışılırsa VBA hata verecektir.

Dosyalar yapılan işe göre temelde iki türde açılır: Rastgele erişimli ve Sıralı erişimli olarak. Rastgele erişimli modda istenen kayda numarası verilerek ulaşılabilmesine rağmen sıralı erişimli modda bütün kayıtlar işlendikten sonra istenen kayda ulaşılabilir.

22.1 Dosya Açmak 

İster sıralı erişimli olsun, ister rastgele erişimli olsun bir dosyayı açmak veya oluşturmak için Open komutu kullanılır. 

Open “Dosya Adı” ForAçmaModu [Access ErişimModu] [Lock] As [#]DosyaNo[Len=KayıtUzunluğu] 

Dosya Adı; Açılacak veya oluşturulacak dosyanın adı. 

AçmaModu; Dosyanın amaca uygun olarak Append, Binary, Input, Output, veya Random modlarından birinde açılmasıdır. 

Erişim Modu; Açma moduna uygun olmak kaydıyla dosyanın Read, Write, or Read Write amaçlı kullanılmasıdır. Belirtme olmadığında Read Write modu geçerlidir. 

Lock; Açma ve Erişim moduna uygun olacak şekilde dosyanın Shared, Lock Read,Lock Write, ve Lock Read Write paylaşım ve kilit özelliğidir. Aksi belirtilmediğinde Shared modu geçerlidir. 

DosyaNo; Birden fazla ile aynı anda çalışılacaksa (en fazla 511 adet) her birine bir numara verilir ve kapatma da ilgili numaralara göre ve ihtiyaca göre yapılır. Numaralama #1 den başlar. 

KayıtUzunluğu; Açılan dosya dan okunacak ve dosyaya yazılacak herbir kayıt birimi için tahsis edilen kayıt uzunluğunu (en fazla 32767 bytes) verir. 

Private Type Kayıt
     Bilgi1 As String * 6
     Bilgi2 As Double
     Bilgi3 As Date
     .....
End Type
Global Veri As Kayıt

Dosya uzunluğunu (LOF Length of File) bu sayıya bölersek kayıt adeti bulunur [LOF(1) / Len(Veri)]. Veri yapısı aşağıdaki gibi olabilir.

22.1.1 Random

Random, dosyadaki her kayituzunlugu ile belirlenen uzunluktaki alanlara yazılır. Dosyaya yazılan kayitlar kayituzunlugu ile belirlenen sayıdan küçük de olsa kayituzunlugu kadar yer kaplar. Böylece dosyadaki her kaydın uzunluğu aynı olacağından dosyada istenen kayda numarasıverilerek erişilebilir. 

22.1.2 Binary

Binary, dosya binary modda açılırsa dosya içerisindeki her karaktere, karakterin numarasıverilerek ulaşılabilir. Dikkaet edilise Random modda dosya içerisindeki kayıtlara bir bütün olarak ulaşabiliyorduk, bu modda ise kayıt içindeki istenen karakterede ulaşılabilmektedir. 

22.1.3 Input
 
Input, dosya okunmak için açılır. Input,Output ve Append modda açılan dosyalara sıralıerişimli dosyalar denir. Ve bu tip dosyalarda her kayıt eşit uzunlukta olmak zorunda değildir. Kayıtlardan biri çok büyükken diğeri çok küçük olabilir. Dolayısı ile dosyadaki hangi kaydın nerede olduğu o kaydın numarası verilerek bulunamaz. Bu tip dosyalarda bir kayda ulaşabilmek için o kayıttan önceki bütün kayıtları okumak gerekir.

22.1.4 Output

Output, dosya yazmak için sıralı erişimli olarak açılır.  

22.1.5 Append 

Append, Output modu gibidir ancak dosya göstericisi dosyanın sonunda duracaktır ve yazılan kayıtlar dosya sonuna eklenecektir.

Açmak istenen dosya mevcut değilse Append, Binary, Output veya Random modlarında oluşturulur. Yani bir dosyayı Input modunda açabilmek için o dosyanın var olması gerekir. Aksi takdirde hata    oluşacaktır. Dosyayı Input modunda açmadan önce Dir(dosyaadi)komutuyla dosyanın varlığını kontrol etmek gerekir. Yoksa dosyayı oluşturmak gerekebilir. 

ErisimModu;: Dosya açılırken dosyanın ne için açıldığıbelirtilebilir. Bu parametre şu üç kelimeden biriyle kullanılır. 

-Read: Dosya sadece okumak için açılır. Dosyadaki kayıtların değiştirilmesine ve yeni kayıtlar eklenmesine izin verilmez. 
 
-Write: Dosya sadece yazmak için açılır.
 
-Read Write: Dosya hem okumak hemde yazmak için açılır. Bu durumda Put veya Write komutlarda VBA Path/File Access Error” hatası verir. 

Lock : Dosya açılırken istenirse diğer programların bu dosyaya erişimi engellenebilir.

Şu dört kelime ile birlikte kullanılır.  

-Shared, açılan dosyaya diğer uygulamalar tarafından okuma ve yazma yapılabilir. 

-Read, okumaya karşı kilitler. Dosya açık olduğu sürece diğer programlar bu dosyadan okuma yapamazlar. Ancak dosyaya yazabilirler. 

-Write, dosyayı yazmaya karşı kilitler. Close komutu verilinceye kadar diğer programlar bu dosyaya yazamazlar.  

-Read Write, dosyayı hem yazmaya he de okumaya karşı kilitler.

DosyaNo: Dosya açılırken o dosyaya 1 ile 255 arasında bir numara verilir ve dosyada

yapılan işlemlerde bu numara kullanılır. (Get #1 gibi). Aynı anda birkaç dosya açılıyorsa numaralarıda farklı olmalıdır. Dosya Binary,Input ve Random modlarından biri ile açılmışsa aynıdosya kapatılmaya gerek kalmadan farklı bir dosya numarası verilerek tekrar açılabilir. Ancak  Append ve Output modlarında aynı dosyayı kapatmadan tekrar açmak mümkün değildir.  

KayitUzunlugu : Dosyanın açım moduna göre bu parametrenin iki farklı anlamı vardır

ve 32767 den büyük olamaz. Ayrıca Binary modda açılan dosyalarda bu parametrenin anlamıyoktur. Dosya Random modu ile açılmışsa bu sayı her kaydın uzunluğunu belirler. Dosyaya yazılan kayıt bu değerden büyükse hata oluşur. Bu değer verilmezse her kaydın uzunluğu 128 karakter olarak kabul edilir. Dosya Random modundan farklı bir modla açılmışsa bu sayı karakter buffer’ inin boyutunu belirler. Verilmezse 512 karakter olarak kabul edilir.

Buffer bir seferde okunacak ve yazılacak karakter sayısını belirler. Yani dosyadan bir kayıt okunacağızaman buffer boyutu kadar okuma yapılır ve bir sonraki okuma isteğinde okunmak istenen kayıt bufferde ise tekrar dosyadan okunmaz. Yazarken de buffer doluncaya kadar dosyaya yazılmaz. Bufferın büyük değerleri okuma ve yazma işlemlerinin hızlanmasına sebep olur fakat bellekte fazla yer kaplar. Ancak SMARTDRV gibi bir Cache programı kullanıyorsanız veya kullandığınız işletim sistemi Cache desteği veriyorsa bu bufferı büyük vermenizin hiçbir avantajı olmaz çünkü Cache programı zaten yapacaktır.

22.2 Rastgele Erişimli Dosyaya Yazma ve Okumak 

Random veya Binary modu ile açılan dosyalara kayıtlar Put komutu ile yazılır ve Get komutu ile okunur.

Put [#] DosyaNo, [KayitNo], Degisken
Get [#] DosyaNo, [KayitNo], Degisken

Degisken : İçeriği yazılacak değişkeni kaydın alınacağı değişken.

DosyaNo : Yazılacak veya okunacak dosyanın numarası. Bu numara Open komutu ile belirlenen dosya numarasıdır.

KayitNo : Yazılacak veya okunacak değişkenin dosya içindeki kayıt numarası. Bu
numara dosyadaki ilk kayıt için 1 ve olabilecek en büyük değer 2,147,483,647 dir.

22.3 Sıralı Erişimli Dosyaya Yazma ve Okumak

Output ve Append modu ile açılan dosyalara Write veya Print komutu ile yazma yapılır. 

Write # DosyaNo [,Degiskenler] 

DosyaNo : Yazılacak dosyanın numarası. Bu numara Open komutu ile belirlenen dosya numarasıdır. 

Degiskenler : Dosyaya yazılacak olan değişken listesi araya virgüller konarak yazılır. 

Write   ile dosyaya yazılan değişkenler tırnak içerisinde ve araya virgül konarak yazılırlar
ve son değişkenden sonra satır sonu karakteri konur.

Bu tip dosyalara Print komutu ile yazılabilmektedir. 

Print # DosyaNo [,DegiskenFormati]

DegiskenFormati : Print komutunun dosyaya yazan bu formatıVb’ de ekrana çıkış
yapan print gibidir. Değişken formatını ekrana çıktı yapıyormuş gibi dosyaya yazar. 

Input   modu ile açılan sıralı erişimli dosyalardan okuma işlemi ise Input ve Line Input komutlarıile yapılır.

Input # dosyano, DegiskenListesi

DegiskenListesi : Dosyadan okunan kayıtlar bu değişkenlere aktarılır. Dosyada her çift tırnak içindeki karakterler bir kayıt kabul edilir ve sırasıyla bu değişkenlere aktarılır. Eğer  tırnak işaretleri içinde bir karakter kümesi yoksa satır sonuna kadar olan karakterler bir kayıt kabul edilir. 

Input (KarakterSayisi, Dosyano)

Bu fonksiyonla numarası verilen dosyadan karaktersayisi kadar karakter okunur ve sonuç geri gönderir. Bu fonksiyon Sıralı erişimli olarak vey Binary modda açılmış dosyalarda kullanılabilir. 

22.4 Dosyaları Kapatmak

Close, Hangi modda açılırsa açılsın dosya Close komutu ile numarası verilerek kapatılır.  

Close #DosyaNo [;DosyaNo]

DosyaNo: Kapatılacak dosyanın numarası. Bu numara          Open komutu ile belirlenen dosya numarasıdır. 

Reset, açık olan bütün dosyaları kapatmak için Reset komutu kullanılabilir. 

22.5 Dosya Kontrol Fonksiyonları 

22.5.1 Dosya Sonu Kontrolü 

EOF (DosyaNo), numarasıverilen dosyanın sonuna gelinmişse True değer gönderir. Sıralı erişimli dosyalarda dosya sonu tespiti için kullanılır.

22.5.2 Dosya Boyu Kontrolü 

LOF (DosyaNo), numarası verilen dosyanın byte olarak uzunluğunu verir. FileLen fonksiyonu gibidir ancak farklı olarak uzunluğu öğrenilecek dosyanın Open ile açılmış olması gerekir. 

22.5.3 Kayıt Sayısı Kontrolü

LOF (DosyaNo) / Len(Veri) , hesabı ile bulunur. Veri 8.1 maddesinde ele alınmıştı...

22.6 Aktif Kaydı Değiştirmek

Dosya içerisinde aktif kaydı veya karakteri gösteren bir gösterici vardır. Kayıt numarası verilmeden yapılan okuma ve yazma işlemleri bu göstericinin gösterdiği yerden yapılır. Yapılan yazma ve okuma işlemleri de göstericiyi okunan veya yazılan kaydın sonuna taşır. Dosya Random modla açılmışsa bu gösterici kayıt numarasıdır diğer modlarda açılmış ise bu gösterici dosya içerisindeki karakterin konumudur.  

Seek #dosyano, yenikonum 

Bu komut numarası verilen dosyadaki göstericiyi yeni konuma taşır. Bu komutun Randomdosyalarda kullanılması gerekmeyebilir. Çünkü bu modda açılan dosyalarda Get ve Put komutlarıyla istenen kayda ulaşılabilmektedir. Ancak sıralı erişimli dosyalarda dosya içerisinde istenen bir karaktere bu komutla ulaşılabilir. Aktif gösterici konumunu öğrenmek içinse bu komutun fonksiyon formatı kullanılır 

Seek (#dosyano); Bu şekilde kullanımda dosya numarası verilen dosyadaki göstericinin konumu
öğrenilebilir. 

22.7 Free File

Dosya açarken bu dosyalara birer numara veriyorduk ve bu numarayı kullanarak o dosyadan okuma ve yazma yapabiliyorduk. Açık olan her dosyanın numarası da farklı olmasıgerektiği için aynı anda açtığınız bütün dosyalara farklı bir numara vermeniz gerekir.

Genel amaçlı olarak yazdığınız fonksiyonlarda açtığınız dosyalarda bu numaranın, programın diğer bölümlerinde kullanılmayan bir numara olduğundan emin olabilmek dosya numarası olarak herhangi bir sayı vermek yerine bu sayıyı FreeFile fonksiyonu kullanarak buldurabilirsiniz.  

FreeFile fonksiyonu o anda kullanılmayan boş bir dosya numarası gönderecektir. Böylece bu numaranın programın diğer kısımlarında kullanılmadığından emin olabilirsiniz.  

22.8 Text Dosya Yönetimi Örnekleri

22.8.1 Rastgele Erişimli Dosya Yönetim Örneği 

'UserForm1 

Option Explicit
Dim Adet, KayıtNo As Double
Private Sub UserForm_Initialize()
On Error Resume Next
Me.Caption = "[PBİD®] Text veri tabanıyönetimi..."
Application.Visible = False
Close #1
Open "C:\Personel.txt" For Random As #1 Len = Len(PersonelAlanı)
Adet = VBA.LOF(1) / Len(PersonelAlanı)
KayıtNo = Adet
If Adet = 0 Then
KayıtNo = 1
Label5 = KayıtNo
TextBox1 = ""
TextBox2 = ""
TextBox3 = ""

TextBox1.SetFocus
Else
Label5 = KayıtNo
Call KayıtÇağır
TextBox1.SetFocus
End If
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
On Error Resume Next
If CloseMode <> 1 Then Cancel = 1
End Sub
Private Sub SpinButton1_SpinDown()
On Error Resume Next
Call KayıtGönder
If KayıtNo = 0 Then
KayıtNo = 1
Label5 = 1
Else
KayıtNo = KayıtNo - 1
Label5 = KayıtNo
End If
Call KayıtÇağır
TextBox1.SetFocus
End Sub
Private Sub SpinButton1_SpinUp()
On Error Resume Next
Call KayıtGönder
If KayıtNo = 0 Then
KayıtNo = 1
Label5 = 1
Else
KayıtNo = KayıtNo + 1
Label5 = KayıtNo
End If
Call KayıtÇağır
TextBox1.SetFocus
End Sub
Private Sub KayıtÇağır()
On Error Resume Next
Get #1, KayıtNo, PersonelAlanı
TextBox1 = VBA.Trim(PersonelAlanı.AdSoyad)
TextBox2 = VBA.Trim(PersonelAlanı.Görev)
TextBox3 = VBA.Trim(PersonelAlanı.Adres)
End Sub
Private Sub KayıtGönder()
On Error Resume Next
If KayıtNo > 0 Then
PersonelAlanı.AdSoyad = VBA.Trim(TextBox1)
PersonelAlanı.Görev = VBA.Trim(TextBox2)
PersonelAlanı.Adres = VBA.Trim(TextBox3)
Put #1, VBA.Val(VBA.Trim(KayıtNo)), PersonelAlanı
TextBox1 = ""
TextBox2 = ""
TextBox3 = ""
Else
Label5 = ""
TextBox1 = ""
TextBox2 = ""
TextBox3 = ""
End If
End Sub
Private Sub CommandButton1_Click() 'Çık
On Error Resume Next
Call KayıtGönder
Close #1
Unload Me
Application.Visible = True
End Sub 

'Module1 

Type PersonelKayıtları
AdSoyad As String * 20
Görev As String * 25
Adres As String * 30
End Type
Global PersonelAlanı As PersonelKayıtları 

22.8.2 Sıralı Erişimli Dosya Yönetim Örneği 

'Module1 

Option Explicit
Private Type Bilgi
     VAd As String * 24
     VSoyad As String * 24
     VVize As String * 12
     VFinal As String * 12
     VNot As String * 12
End Type
Global Veri As Bilgi
Dim i As Single
Dim Kayıt$
Dim Adet As Double
Private Const DosyaAdı As String = "c:\bilgi.txt"
Sub RandomKomutu()
     Close #1
     Open DosyaAdı For Random As #1 Len = Len(Veri)
     Adet = Application.WorksheetFunction.CountA(Range("A2:A65536"))
     For i = 1 To Adet
          With ThisWorkbook.Sheets(1)
                Veri.VAd = .Cells(i + 1, 1)
                Veri.VSoyad = .Cells(i + 1, 2)
                Veri.VVize = .Cells(i + 1, 3)
                Veri.VFinal = .Cells(i + 1, 4)
                Veri.VNot = .Cells(i + 1, 5)
          End With
          Put #1, i, Veri
     Next i
     Adet = LOF(1) / Len(Veri)
     Close #1
End Sub
Sub InputKomutu()
     With ThisWorkbook.Sheets(1)
          With .Range("A1:E1")
               .Cells(1, 1) = "Adı"
               .Cells(1, 2) = "Soyadı"
               .Cells(1, 3) = "Vize"
               .Cells(1, 4) = "Final"
               .Cells(1, 5) = "Ortalama"
          End With
          .Range("A2.E65536").ClearContents
     End With
     Close #1
     Open DosyaAdı For Input As #1
     Input #1, Kayıt$
     Adet = LOF(1) / Len(Veri)
     For i = 1 To Adet ' 1 numaralı dosyanın sonuna kadar "Kayı$"ayrıştırılır..
          Cells(i + 1, 1) = VBA.Trim(VBA.Mid$(Kayıt$, (i - 1) * Len(Veri) + 1, 24))
          Cells(i + 1, 2) = VBA.Trim(VBA.Mid$(Kayıt$, (i - 1) * Len(Veri) + 1 + 24, 24))
          Cells(i + 1, 3) = VBA.Val(VBA.Trim(VBA.Mid$(Kayıt$, (i - 1) * Len(Veri) + 1 + 24 + 24, 12)))
          Cells(i + 1, 4) = VBA.Val(VBA.Trim(VBA.Mid$(Kayıt$, (i - 1) * Len(Veri) + 1 + 24 + 24 + 12, 12)))
          Cells(i + 1, 5) = VBA.Val(VBA.Trim(VBA.Mid$(Kayıt$, (i - 1) * Len(Veri) + 1 + 24 + 24 + 12 + 12, 12)))
     Next i
     Close #1
End Sub

Blog Arşivi

Bu gadget'ta bir hata oluştu

Bu Blogda Ara

Contributor

Contributor
Mustafa ULUSARAÇ İstanbul, TÜRKİYE
free counters
T. C. Central Bank Indicative Exchange Rates
Currency Exchange Rate Widget,Currency Converter Widget
Borsa İstanbul