Excel Makro
Visual Basic For Application
MAKROLAR HAKKINDA GENEL BILGI
Makro, rutin iĢlemleri otomatik hale getirmektir. Makrolar hazırlanırken, excelin arka planında çalıĢan
Visual Basic programlama dili hazır halde beklemektedir. Herhangi bir kayıt yapıldığında bu programlama dili aktif
hale gelir. Sizin yapmıĢ olduğunuz herhangi bir hareketi Visual Basic programlama diline çevirir. Excel de
kullandığımız makro, dil olarak aynı olsa da, yapısal farklılıklar içerdiğinden Word Access ya da PowerPointte
kullanılmaz.
DıĢarıdan makro kullanabilirisiniz ama virüs içeriyor olabilir.
Makro ÇeĢitleri
1-Makro kaydetmek
2-Visual Basic‟te komut yazmak.
3-Fonksiyon (iĢlev) Hazırlamak
Bu üç yöntem de birbirinden farklı tarzda hazırlanmaktadır. Her birinin diğerlerine göre avantajları ve
dezavantajları vardır. Üç yöntemi de tek tek inceleyelim.
Makro Kaydetmek
Makro kaydetmek, kasetçalara ses kaydetmek kadar kolay bir iĢtir. Bunun yapılması gerekenler Ģöyle
özetlenebilir.
1. Office menüsünden Excel Options komutunu, buradan Popular sekmesinden Show Developer
tab in the Ribbon iĢaretlenir. Böylece Developer Ribbon‟unu eklenir.
2. Developer ribonu‟nun Record New Macro komutunu tıkladığınızda ekrana makro kaydet
penceresi gelecektir. Bu pencerede Macro Name alanına makronun adını yazmalısınız. Ġstenirse Shortcut key bölümüne bir kısa
yol tuĢu verilebilir. Daha sonra ise bu makronun nerede kayıt olduğu seçilmelidir. Store Macro in bölümü açıldığı
zaman üç seçenek bulunmaktadır. This Workbook seçeneği makroyu sadece aktif olan dosyaya kaydeder. BaĢka bir
Excel dosyasında çalıĢmaz. New Workbook seçeneği makroyu yeni bir excel dosyası açar ve o dosyanın için
kaydeder. Personel Macro Workbook seçeneği excel içerisinde tüm dosyalarda geçerli olması için Personel.xls
dosyasını açar ve o dosyaya kaydeder. Personel.xls dosyası içerisine kaydedilen her makro, excel içerisinde açılan
her dosyada çalıĢmasını sağlar.
Store Macro in bölümünden herhangi bir seçenek seçildikten sonra ok düğmesine tıklanır.
Description: açıklama yazabileceğiniz alandır.
3. Record Macro penceresinde okey‟i tıklayın.
Makronuzu kaydetmeden önce gerekli olan her Ģeyi önceden düĢünmeniz gerekiyor.
4- ĠĢleminizi yapıp stop record düğmesine tıklayınız.
5-Excel 2007 uzantılı dosyalar xlsx olarak kaydedilir. Fakat dosyanızın içerisinde makro varsa uzantının
xlsm olması gerekir. Bunun için dosyanızı kaydederken, Office menüsünün altında Save As komutunu
buradan da Excel Makro- Enable Workbook seçeneği ile kaydedin. Aksi halde makrolarınız
çalıĢmayacaktır.
Kayıt Makrosu Örneği Bu örnekte kayıt makrosu kullanarak sayfanın sol tarafında görünen ay-gün tablosunu otomatik olarak
oluĢturan makroyu kayıt ettik. ĠĢleme B1 hücresinden baĢladık önce sırayla günleri ardından sırayla ayları yazdık.
Yazma iĢleminin ardından biçimlendirmeleri yaparak kaydı durdurduk. Alt + F11 tuĢu ile VBA„nin oluĢturduğu
kodu inceledik
Sub Tablo()
Range("B1").Select
ActiveCell.FormulaR1C1 = "Pazartesi"
Range("C1").Select
ActiveCell.FormulaR1C1 = "Salı"
Range("D1").Select
ActiveCell.FormulaR1C1 = "ÇarĢamba"
Range("E1").Select
ActiveCell.FormulaR1C1 = "PerĢembe"
Range("F1").Select
ActiveCell.FormulaR1C1 = "Cuma"
Range("G1").Select
ActiveCell.FormulaR1C1 = "Cumartesi"
Range("H1").Select
ActiveCell.FormulaR1C1 = "Pazar"
Range("A2").Select
ActiveCell.FormulaR1C1 = "Ocak"
Range("A3").Select
ActiveCell.FormulaR1C1 = "ġubat"
Range("A4").Select
ActiveCell.FormulaR1C1 = "Mart"
Range("A5").Select
ActiveCell.FormulaR1C1 = "Nisan"
Range("A6").Select
ActiveCell.FormulaR1C1 = "Mayıs"
Range("A7").Select
ActiveCell.FormulaR1C1 = "Haziran"
Range("A8").Select
ActiveCell.FormulaR1C1 = "Temmuz"
Range("A9").Select
ActiveCell.FormulaR1C1 = "Ağustos"
Range("A10").Select
ActiveCell.FormulaR1C1 = "Eylül"
Range("A11").Select
ActiveCell.FormulaR1C1 = "Ekim"
Range("A12").Select
ActiveCell.FormulaR1C1 = "Kasım"
Range("A13").Select
ActiveCell.FormulaR1C1 = "Aralık"
Range("A2:A13").Select
With Selection.Interior
.ColorIndex = 1
.Pattern = xlSolid
End With
Selection.Font.ColorIndex = 2
Selection.Font.Bold = True
Range("B1:H1").Select
With Selection.Interior
.ColorIndex = 1
.Pattern = xlSolid
End With
Selection.Font.ColorIndex = 2
Selection.Font.Bold = True
Columns("B:H").Select
Selection.ColumnWidth = 10.86
Range("B2:H13").Select
With Selection.Interior
.ColorIndex = 15
.Pattern = xlSolid
End With
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
Range("B2").Select End Sub
Makroları ÇalıĢtırmak Bir makroyu çalıĢtırmak için;
1-Developer >>macros seçenekleri ile kayıtlı makroların isimlerinin bulunduğu pencere açılır.
ÇalıĢtırılmak istenen makronun adı seçilir ve run düğmesine tıklanır.
2-Office menüsü >>Excel options seçeneğinden customize sekmesi tıklanır. Choose comands
from bölümünden ve buran macros bölümüne gelerek makro nesneleri Quick Access araç çubuğuna
taĢınır ve bu nesnelere makro atanır.
3- Developer >>Insert bölümünden açılır ve buradan button veya baĢka bir nesne seçilip excel
ekranına çizilir. Bu nesneye makro atanır.
4-Visual Basic For Application penceresinden run seçeneğine tıklanabilir.
Eğer oluĢturulan makro Örnek 1 deki Tablo makrosu gibi basit bir makro değilse ve içinde bağımsız
değiĢkenler barındırıyorsa saydığımız yöntemler bu makrıyu çalıĢtırmaz.
Makroyu Düzenlemek
OluĢturduğumuz Örnek 1 deki Tablo makrosunda bir ayın adını yanlıĢ yazmıĢsak ve düzeltmek istiyorsak
veya koda müdahale etmek istiyorsak kısaca makroda bazı değiĢiklikler yapmak istiyorsanız düzenle düğmesini
kullanabilirsiniz.
Bunun için Developer >>macros komutu tıklanır. Buradan edit seçeneği seçilir.
Makrolarda Güvenlik Ve Makro Açarken Gelen Uyarı
Örnek 1 de yaptığımız Tablo makrosu ile beraber excel dosyasını kaydedip kapatırsak(xlsm olmasına
dikkat), dosyayı yeniden açtığımızda karĢımıza bir uyarı gelir ve oluĢturduğumuz makronun çalıĢmadığını görürüz.
Çünkü oluĢturulan makro aslında bir programdır. Excel bizi bu konuda uyarır. Makronun devre dıĢı bırakılmasının
sebebi Developer >>security kısmında güvenlik seviyesini high olarak ayarlanmıĢ olasıdır. Buradaki seviyeyi
medium yaptıktan sonra dosyayı kapatır ve yeniden açarsak, excel makroyu etkinleĢtirmek isteyip istemediğimizi
bize soracaktır.
Sayısal Ġmzalar Hakkında
Sayısal imzanın amacı: Makro da ki sayısal imza zarftaki mühür gibidir. Makronun imzalayan geliĢtiriciden
geldiğini ve değiĢikliğe uğramadığını onaylar.
Sertifikanın amacı: ÇalıĢma kitabını açtığınızda veya sayısal imzalı makro içeren bir eklenti programını
yüklediğinizde, sayısal imza bilgisayarınızda bir sertifika gibi görünür. Sayısal imza bir makronun güvenlik garantisi
değildir. Kaynağından emin olmanızı sağlar ve kaynağına güveniyorsanız makroyu çalıĢtırırken güvendiğiniz
kaynaktan geldiğini doğrular.
VISUAL BASIC FOR APPLICATION’DA OPERATÖRLER
1.aritmetiksel operatörler(arithmetic)
2.karĢılaĢtırma operatörleri(comparison)
3.mantıksal operatörler(logical)
1.aritmekiksel operatörler
^ üs (exponentiation)
* çarpma (multiplication)
/ bölme (division)
\ tamsayı bölme(integer division)
Mod mod (modulus arithmetic)
+ toplam (addition)
- çıkarma (subtrction)
& birleĢtirme(string concatenation)
2.karĢılaĢtırma operatörleri
= eĢit (equality)
<> eĢit değil (ınequality)
< küçük (less then)
> büyük (greater than)
<= küçük eĢit (less then or equal to)
>= büyük eĢit (greater then or equal to)
Like benzer (like)
Is var (is)
3.mantıksal operatörler
Not değil
And ve
Or veya
Xor
Eqv
Imp
Bu örneklerde VBA deki operatörlerin kullanımını sırasıyla gösterdik. VBA ekranında tek tırnak
kullanılarak baĢlanan cümleler açıklamalardır ve VBA tarafından dikkate alınmaz. Biz de Kullandığımız
operatörlerin isimlerini tek tırnak kullanarak belirttik.
Aritmetiksel Operatörler Sub UsOperatoru1()
Range("a1").Value = 2 ^ 3 'A1 hücresine 8 yazar
Range("a2").Value = 4 ^ 2 'A2 hücresine 16 yazar
End Sub
Sub UsOperatoru2()
Range("b1").Value = Range("a1") ^ Range("a2")
End Sub
Sub CarpimOperatoru()
Range("b1").Value = Range("a1") * Range("a2")
End Sub
Sub BolumOperatoru()
Range("b1").Value = Range("a1") / Range("a2")
End Sub
Sub TamsayiBolumOperatoru()
Range("b1").Value = Range("a1") \ Range("a2")
'sonucu tabana yuvarlar virgülden sonrasını atar
End Sub
Sub ModOperatoru()
Range("b1").Value = Range("a1") Mod Range("a2")
End Sub
Sub ToplamOperatoru()
Range("b1").Value = Range("a1") + Range("a2")
End Sub
Sub CikartmaOperatoru()
Range("b1").Value = Range("a1") - Range("a2")
End Sub
Sub AndOperatoru()
Range("b1").Value = Range("a1") & Range("a2")
End Sub
KarĢılaĢtırma Operatörleri Sub EsitOperatoru1()
Range("b1").Value = (150 = 100)
Range("b2").Value = (100 = 100)
End Sub
Sub EsitOperatoru2()
MsgBox 150 = 100
MsgBox 100 = 100
End Sub
Sub EsitOperatoru3()
If Range("a1") = Range("a2") Then
Range("b1") = "eĢit"
Else
Range("b1") = "eĢit değil"
End If
End Sub
Sub FarkliOperatoru()
Range("b1").Value = (150 <> 100) 'farklı olduğu için doğru
Range("b2").Value = (100 <> 100) 'farklı olmadığı için yanlıĢ
End Sub
Sub KucukOperatoru()
Range("b1").Value = (150 < 100) 'true
Range("b2").Value = (100 < 100) 'true
Range("b3").Value = (90 < 100) 'false
End Sub
Sub BuyukOperatoru()
Range("b1").Value = (150 > 100) 'true
Range("b2").Value = (100 > 100) 'false
Range("b3").Value = (90 > 100) 'false
End Sub
Sub KucukesitOperatoru()
Range("b1").Value = (150 <= 100) 'false
Range("b2").Value = (100 <= 100) 'true
Range("b3").Value = (90 <= 100) 'true
End Sub
Sub BuyukesiOperatoru()
Range("b1").Value = (150 >= 100) 'true
Range("b2").Value = (100 >= 100) 'true
Range("b3").Value = (90 >= 100) 'false
End Sub
Sub LikeOperatoru1()
'iki string değeri karĢılaĢtırmak için kullanılır
MsgBox Range("b1") Like Range("b2")
End Sub
Sub LikeOperatoru2()
MsgBox Range("c1") Like "c*"
End Sub
Mantıksal Operatorler
Sub NotOperatoru1()
MsgBox Not False 'True
End Sub
Sub NotOperatoru2()
MsgBox Not True 'False
End Sub
Sub AndOperatoru1()
MsgBox True And True 'true
End Sub
Sub AndOperatoru2()
If Range("a1") > 10 And Range("a2") < 5 Then
MsgBox Range("a1") + Range("a2")
End If
End Sub
Sub EqvOperatoru()
'mantıksal iki ifadenin karĢılaĢtırması için kullanılır. sonuçlar aynıysa true sonucu verir
MsgBox False Eqv False
End Sub
VBA PROGRAMLAMA YAPILARI
DeğiĢkenler
Veri tipi
Integer: VB‟de tamsayı değiĢkenleri tanımlamakta kullanılır. Hafızada 2 byte yer kaplar(-32768 ile
+32767 arasındadır) bir değiĢkenin sonunda % iĢareti varsa integer tipindedir.
Boolean:Mantıksal veri tipleri için kullanılır. Iki seçnekten birisini alır (True ya da false) bellekte 2 byte
yer kaplar.
Long:daha büyük bir aralıkta integer yani tamsayı tanımlamak için kullanılır. Hafızada 4 byte yer kaplar
(2147438647 ile -2147483648) değiĢken sonunda & iĢareti olabilir.
Double: VB de kullanılabilecek en büyük sayısal değerlerin veri tipidir. Hafızada 8 byte yer kaplar. 16
haneye kadar hassastırlar. Sonunda # iĢareti vardır.
Currency: sayısal tipteki veriler için tanımlanmıĢ özel bir veri tipidir. Hafızada 8 byte yer kaplar. 4 hane
ondalık kısmı olmak üzere toplam 19 haneden oluĢur. (nokta hariç) . sonunda @ iĢareti vardır.
Date:tarih türündeki bilgileri kullanmak için oluĢturulmuĢ bir veri tipidir. Hafızada 8 byte yer kaplar
String: metin türü bilgileri saklamak için kullanılabilecek veri türüdür. Sonunda $ sembolu sonunda
vardır.
Object:herhangi bir nesne türü olabilir. Hafızada 4 byte yer kaplar.
Variant:bu tüpte tanımlanmıĢ bir değiĢkene herhangi bir tip‟te veri yüklenebilir. Yani ne tür bir veri
gireceğimizi bilmediğimiz değiĢkenleri variant tipinde tanımlamalıyız.
Help ten data type summary yazarsak değiĢken tiplerini görürüz.
Kaç Türlü DeğiĢken Vardır Ve Nerede Tanımlanır.
Iki türlü değiĢken vardır. Global değiĢken ve local değiĢken. DeğiĢkenler hazırladığımız program
modülünün içinde iki yerde tanımlanırlar. Prosedürün içinde ya da prosedürün dıĢında.
Global değiĢkenler, programın bütün prosedürleri tarafından kullanılabilirler. Bunlar prosedürün dıĢında
tanımlanırlar, tanımlandıkları yere genel olarak “tanımlama bölümü denir”. Genel değiĢkenler tanımlanırken
Public anahtar sözcüğü kullanılır.
Yerel değiĢkenler sadece tanımlandıkları prosedürlerde ve prosedürün içinde kullanılır. Dim ve static
anahtar sözcüklerinden herhangi biri ile kullanılırlar. Genelde dim sözcüğü yaygındır. Görevleri bitince hafızadan
silinirler. Satatic olarak tanımlanan değiĢkenlerde ise durum farklıdır. Prosedür durdurulsa ve tekrar çalıĢtırılsada ilk
değerini korur ve tekrar çağrıldığında değiĢken en son değerlerini kullanır.
Local Ve Global DeğiĢken
Bu örneklerde değiĢken tiplerinin farklı kullanımlarına baktık. Local ve Global
değiĢken mantığını inceledik
Sub degiskenler1()
„sadece değiĢken tanımlamayı gösterdik
Dim adi As String
Dim soyadı As String
Dim yası As Integer
Dim dogum_tarihi As Date
Dim dogum_yeri As Date
End Sub
Sub degiskenler2()
„değiĢkenlerin yan yana tanımlanmasını gösterdik
Dim adı As String, soyadı As String, yası As Integer
End Sub
Public z
‘tanımladığımız z değiĢkeni modülün en üstüne yazılır ve bu Ģekilde global tanımlanmıĢ
‘olur
Sub ilk1()
‘değiĢkenleri anlatırken ilk defa inputbox kullandık.
‘inputbox’taki açıklama,baĢlık,kendinden tanımlı değer ile x ve y eksenlerinden uzaklığın
‘girilmesini gösterdik
x = InputBox("ilk sayıyı yazın", "baĢlık", 5, 1000, 1000)
y = InputBox("ilk sayıyı yazın", "baĢlık", , 1000, 1000)
z = x + y
MsgBox z
‘msgboxtaki değer input boxtan girilen değerlerin yan yana yazılmıĢ halidir. ‘Örneğin 1.
giriĢ 5 ve ikinci giriĢ de 5 ise sonuc 55 dir. Çünkü girilen değerler string kabul ‘edilmiĢtir
End Sub
Sub ilk2()
‘inputboxtan girilen değerleri integer’a çevirdik
x = Int(InputBox("ilk sayıyı yazın", "baĢlık", 5, 1000, 1000))
y = Int(InputBox("ilk sayıyı yazın", "baĢlık", , 1000, 1000))
z = x + y
MsgBox z
End Sub
Sub ilk3()
‘inputboxtan girilen değerleri decimal’a dönüĢtürdük
x = CDec(InputBox("ilk sayıyı yazın", "baĢlık", 5, 1000, 1000))
y = CDec(InputBox("ilk sayıyı yazın", "baĢlık", , 1000, 1000))
z = x + y
MsgBox z
End Sub
Sub ilk4()
x = CDec(InputBox("ilk sayıyı yazın", "baĢlık", 5, 1000, 1000))
y = CDec(InputBox("ilk sayıyı yazın", "baĢlık", , 1000, 1000))
z = x + y
End Sub
Sub ilk4_1()
MsgBox z
‘z değeri baĢka bir sub içerisinde yazdırılabildi çünkü baĢtan global tanımlandı
End Sub
Sub ilk5()
x = CDec(InputBox("ilk sayıyı yazın", "baĢlık", 5, 1000, 1000))
y = CDec(InputBox("ilk sayıyı yazın", "baĢlık", , 1000, 1000))
z = x + y
ilk4_1
‘bir sub içerisinde baĢka bir sub ismi yazılarak diğer altyordam çağırılabilir ilk5 isimli
‘altyordam içinde ilk4_1 isimli yordam çağırılarak z değeri msgbox olarak yazdırıldı
End Sub
Costants(Sabitler) DeğiĢken Tanımlama
Hazırlanan programlarda bazen hiç değiĢmemesini istediğimiz değiĢkenler kullanmak isteyebiliriz. Bu
durumda en üst kısma sabit olarak tanımlanırlar ve tekrar atama yapılmadan kullanılırlar
Uygulaması
Const pi = 3.14
Const buyuk = "aradığınızdan büyük değer buldunuz"
Const kucuk = "aradığınıdan küçük değer buldunuz"
Const tamam = "aradığınız değeri buldunuz"
Sub daire_alanı()
Dim r As Integer
r = InputBox("dairenin yarıçapını (r) giriniz")
alan = pi * r ^ 2
If alan > 78.5 Then
MsgBox buyuk & ":=" & alan
ElseIf alan = 78.5 Then
MsgBox tamam & ":=" & alan
ElseIf alan < 78.5 Then
MsgBox kucuk & ":=" & alan
End If
End Sub
KoĢul ġart Yapıları
If…End If
IĢlemleri gerçekleĢtirirken aradığımız bazı kriterler sonucunda akıĢı değiĢtirmek istersek bu yapıyı
kullanırız.
If… Then… Else
Bu komutun çeĢitli kullanıĢ tarzları vardır.
If Ģart Then ifade
Uygulaması
Sub kosul1()
If range(“a1”).value=10 then range (“b1”).value=500
End if
If Ģart then
Ifadeler
End If
Uygulaması
Eğer a1 hücresinin değeri 10 ise b1 hücresine 500 değerini ata.
Sub kosul2()
If Range("a1") = 10 Then
Range("b1") = 500
Range("c2") = 400
Range("d3") = 300
Range("e4") = 200
Range("f5") = 100
End If
End Sub
If Ģart Then
ifadeler
Else
Ifadeler
End If
Uygulaması
Sub kosul3()
If Range("a1").Value = 10 Then
Range("b1").Value = 500
Else
Range("b1").Value = "a1 hücresinde 10 yok"
End If
End Sub
If Ģart Then
ifadeler
ElseIf Ģart Then
Ifadeler
ElseIf Ģart Then
Ifadeler
Else
End If
Uygulaması
Sub kosul4()
If Range("a1").Value = 10 Then
Range("b1").Value = 500
ElseIf Range("a1").Value = 15 Then
Range("b1").Value = 500
ElseIf Range("a1").Value = 20 Then
Range("b1").Value = 500
Else
Range("b1").Value = "istediğimiz değerlerden herhangi birini bulamadınız"
End If
End Sub
Select Case
If then elseif yapısı ile aynı mantıkla çalıĢır. Yapı bir değiĢkenin aldığı bir çok değere göre ayrı komutları
çalıĢtıran Ģart yapısıdır.
Select case değiĢken
Case durum1
Komutlar
Case durum2
Komutlar
End select
Uygulaması
Sub kosul5()
Select Case Range("a1").Value
Case 1
Range("b1").Value = "bir"
Case 2
Range("b1").Value = "iki"
Case 3
Range("b1").Value = "üç"
Case 4
Range("b1").Value = "dört"
Case 5
Range("b1").Value = "beĢ"
End Select
End Sub
Döngüler Yazmak istediğimiz kodda, bazı ifadeleri tekrar tekrar yazmak isteyebiliriz ki aslında bu programlamanın
olmazsa olmaz koĢullarındandır. Bu tür durumlara aynı iĢlemi defalarca yapmak yerine döngüler kullanırız.
Döngü çeĢitleri :
For… next
For each…next
Do while…loop
Do…loop while
Do until…loop
Do…loop until
Go to
For … Next
For sayaç=baĢlangıç to bitiĢ step artıĢ
Komutlar
Next sayaç
Eğer A1 hücresinden A10 hücresine kadar sırayla 1 den 10‟a kadar sayıları yazmak
istersek bu iĢlemi döngü kullanmadan Ģu Ģekilde yapmamız gerekir.
Sub dongusuz()
Range("a1").Value = 1
Range("a2").Value = 2
Range("a3").Value = 3
Range("a4").Value = 4
Range("a5").Value = 5
Range("a6").Value = 6
Range("a7").Value = 7
Range("a8").Value = 8
Range("a9").Value = 9
Range("a10").Value = 10
End Sub
Bu durum 10 hücre için yapılabilir gibi görünse de yine de zaman almaktadır. Eğer aynı iĢlemi çok daha
fazla hücre için yapmak istersek durumun ne kadar zorlaĢacağı gayet açıktır. ĠĢte bu durumu çok daha az satırla
yapmak için döngüleri kullanırız.
Aynı iĢlemi For.. Next döngüsü ile yapalım.
Sub dongu1()
Dim i As Integer
For i = 1 To 10
Cells(i, 1).Value = i
'cells(satır numarası, sütun numarası) Ģeklinde yazılan bir hücre tanımıdır
Next i
End Sub
Sub dongu2()
Dim i As Integer
For i = 1 To 10 Step 2
Cells(i, 1).Value = i
Next i
End Sub
Eğer birden fazla iĢlemi birden çok kez yapmak istersek döngü içinde döngü kullanabiliriz. Bu durum
genelde dizi iĢlemlerinde kullanılmasına karĢın biz çok daha basit örnekleyeceğiz.
Tek bir döngü kullanarak yaptığımız kodu yazalım ve sağ taraftaki sonucu bulalım.
Sub dongu3()
Dim i As Integer
For i = 1 To 10
Cells(i, i).Value = "X"
Cells(i + 1, i).Value = "X"
Cells(i + 2, i).Value = "X"
Cells(i + 3, i).Value = "X"
Next i
End Sub
Aynı sonucu iç içe döngü kullanarak çok daha az kodla yapmamız mümkündür.
Sub donguicindedongu1()
Dim i As Integer
Dim y As Integer
For i = 1 To 10
For y = 1 To 3
Cells(i + y, i).Value = "X"
Next y
Next I
End Sub
Ġç içe döngü ile çarpım tablosu oluĢturalım
Sub donguicindedongu2()
Dim i As Integer
Dim y As Integer
For i = 1 To 10
For y = 1 To 100
Cells(y, i) = i & "*" & y & "=" & i * y
Next y
Next i
End Sub
For Each… Next
For each eleman in grup
Komutlar
Next
Eğer iĢleme sokulacak elemanların hücre aralıkları biliniyorsa bu tip bir döngü kullanılabilir. Burada;
eleman:döngüde kullanılacak her bir birim, grup ise bu elemanların ait olduğu kümedir.
Eleman adını verdiğimiz “i”, a1 ile d10 aralığındaki 40 adet hücrenin elemanıdır. Daha açıkcası, , a1
hücresi, b5 hücresi, d10 hücresi olabilir. Sırasıyla iĢleme girer ve bu 40 hücre “i” demek olur.
A1 hücresinden D10 hücresine kadar tüm hücrelere X yazalım
Sub dongu4()
Dim i As Range „dikkat edilirse i range olarak tanımlandı
For Each i In Range("a1:d10")
i.Value = "X"
Next i
End Sub
A1 ile D10 arasındaki tüm hücrelere 0-100 arasında rastgele sayı atayıp bu sayıya
göre hücre içini ve yazıyı renklendirelim
Sub dongu5()
Dim k As Range
Range("a1:d10").Formula = "=rand()*100"
‘burada kullandığımız rand() komutu olduğu gibi hücreye yazılır ve excelden aĢina
‘olduğumuz rand komutunu çalıĢtırır
For Each k In Range("a1:d10")
If k > 0 And k < 10 Then
k.Interior.ColorIndex = 45
k.Font.ColorIndex = 1
ElseIf k > 10 And k < 50 Then
k.Interior.ColorIndex = 6
k.Font.ColorIndex = 3
ElseIf k > 50 And k < 100 Then
k.Interior.ColorIndex = 37
k.Font.ColorIndex = 9
End If
Next k
End Sub
Do While… Loop
Do while koĢul
Komutlar
Loop
Uygulaması
Sub doloop1()
Dim i As Integer
i = 1
Do While i <= 10 'koĢul doğruysa aradaki komutları çalıĢtır
Cells(i, 1).Value = i
i = i + 1
Loop
End Sub
Do… Loop While
Do
Komutlar
Loop while koĢul
Uygulaması
Sub doloop2()
Dim i As Integer
i = 1
Do
Cells(i, 1).Value = i
i = i + 1
Loop While i <= 10 'aradaki komutları yap, ta ki koĢul sağlanıncaya kadar
End Sub
Do Until… Loop
Do until koĢul
Komutlar
Loop
Uygulaması
Sub doloop3()
Dim i As Integer
i = 1
Do Until i > 10
Cells(i, 1).Value = i
i = i + 1
Loop
End Sub
Do… Loop Until
Do
Komutlar
Loop until koĢul
Uygulaması
Sub doloop4()
Dim i As Integer
i = 1
Do
Cells(i, 1).Value = i
i = i + 1
Loop Until i > 10
End Sub
while koĢul doğru olduğu sürece döner
until koĢul doğru olana kadar döner
Do…Loop While ile 6 faktoriyeli bulalım
Sub doloop5()
Dim i As Integer
i = 1
fakt = 1
Do
fakt = fakt * i
Cells(i, 1).Value = fakt
i = i + 1
Loop While i <= 6
End Sub
Do…Loop While kullanarak 10‟a kadar olan sayıların toplamını bulalım
Sub doloop6()
Dim i As Integer
i = 1
toplam = 0
Do
toplam = toplam + i
Cells(i, 1).Value = toplam
i = i + 1
Loop While i <= 10
End Sub
C1 hücresinin yanıp sönmesini sağlayalım
Sub yanson()
Dim durum As Boolean
Dim i As Integer
Do While (True)
If durum = True Then
Range("c1").Select
With Selection.Interior
.ColorIndex = 3
.Pattern = xlSolid
End With
For i = 0 To 25000
DoEvents
Next
durum = False
Else
Range("c1").Select
Selection.Interior.ColorIndex = xlNone
For i = 0 To 25000
DoEvents
Next
durum = True
End If
Loop
End Sub
Goto Döngüsü
Bu tip bir döngüye koĢulsuz döngü adını verebiliriz. ġartlar ne olursa olsun, çalıĢan komut satırı bu
döngünün bulunduğu satıra gelince go to deyiminin gidilmesini istediği satıra gider.
Goto tanımlama
Ifadeler „aradaki ifadeler yapılmaz
Tanımlama:
Yazdığımız komut satırlarından biri A1 hücresine caner yazdırırken biz bu satırın
goto döngüsü kullanarak atlnmasını sağlıyoruz
Sub go_to()
Dim i As Integer
i = InputBox("bir sayı giriniz")
GoTo topla
Range("a1").Value = "deneme"
topla:
i = i + 20
MsgBox "girdiğiniz sayının 20 fazlası:" & i
End Sub
Function Prosedürler
Option Compare Text
Büyük küçük harf ayrımı yapmadan text olarak karĢılaĢtırmasını sağlar alternatifi binary dir bu da sayısal
karĢılaĢtırır
Tanımladığımız function‟lar Ġnsert>>Function pencersesinden User Defined kısmından çalıĢtırılır
Stopaj hesaplayan bir fonksiyon hazırlayalım
Function stopaj(tutar)
stopaj = tutar * 0.15
End Function
Tutar ve oran değerlerini dıĢarıdan aldığımız ve bunun sonucunda kdv
hesapladığımız bir fonksiyon yazalım. Dikkat edildiği üzere fonksiyonlarda sonuç
fonksiyonun ismine atanır.
Function kdv1(tutar, oran)
kdv = tutar * oran / 100
End Function
Sağ tarafta görüldüğü gibi tutar, tür ve kdv sonuçlarını tuttuğumuz bir tablo olsun.
Bu tabloda kdv yi türe göre hesaplayan bir fonksiyon yazalım
Function kdv2(tutar, tur)
If tur = "temel" Then
oran = 2
ElseIf tur = "yiyecek" Then
oran = 8
ElseIf tur = "temizlik" Then
oran = 10
Else
oran = 25
End If
kdv2 = tutar * oran / 100
End Function
Yazdığımız türlerin dıĢındaki bir tür geldiğinde hücreye “lütfen türü kontrol ediniz”
yazan kodu ekleyelim
Function kdv3(tutar, tur)
If tur = "temel" Then
oran = 1
ElseIf tur = "yiyecek" Then
oran = 8
ElseIf tur = "temizlik" Then
oran = 10
ElseIf tur = "lüks" Then
oran = 25
Else
kdv3 = "Lütfen türü kontrol ediniz"
GoTo son „ya da end function kullanılabilir
End If
kdv3 = tutar * oran / 100
son:
End Function
Aynı fonksiyonu select case ile yazalım
Function kdv4(tutar, tur)
Select Case tur
Case "temel"
oran = 1
Case "yiyecek"
oran = 1
Case "temizlik"
oran = 1
Case "lüks"
oran = 1
Case Else
kdv5 = "lütfen türü kontrol ediniz"
End Select
kdv5 = tutar * oran / 100
End Function
Puan Hesaplama Fonksiyonu
Function Puan(Notu As Integer)
Select Case Notu
Case Is > 100: Puan = "Hatalı not"
Case Is >= 90: Puan = "AA"
Case Is >= 85: Puan = "BA"
Case Is >= 75: Puan = "BB"
Case Is >= 70: Puan = "CB"
Case Is >= 60: Puan = "CC"
Case Is >= 55: Puan = "DC"
Case Is >= 50: Puan = "DD"
Case Is >= 40: Puan = "FD"
Case Is >= 0: Puan = "FF"
Case Else: Puan = "Hatalı not"
End Select
End Function
Döngü Ve Karar Yapılarının Kullanıldığı Basit Uygulamalar
Parola doğru girilene kadar parola soran bir kod yazalım
Sub parola1()
Do
P = InputBox("parola")
If P = "123" Then
Exit Sub
Else
End If
Loop
End Sub
Aynı parola kodunda maksimum 3 hak verilmesini sağlayalım
Sub parola2()
Do
P = InputBox("parola")
i = i + 1
Loop Until P = "123" Or i = 3
If P = "123" Then
MsgBox "hoĢgeldin"
End If
End Sub
1-100 arasında rastgele oluĢturulan bir sayıyı maksimum 5 tahminde bulma oyunu
yazalım
Sub oyun1()
Randomize
s = Int(Rnd() * 100) + 1
‘burada kullandığımız rnd() komutu daha önce kullandığımız rand() komutundan farklı
‘olarak VBA kodudur. Eğer baĢlangıçta Randomize yazmazsak bilgisayar hep aynı rastgele
‘sayıyı üretir.
MsgBox s
Do
t = Int(InputBox("tahmin"))
If t = s Then
MsgBox "bildin"
ElseIf t < s Then
MsgBox "yukarı"
Else
MsgBox "aĢağı"
End If
i = i + 1
Loop Until t = s Or i = 5
End Sub
DıĢarıdan girilen 3 sayının if-else koĢul yapısı ile büyükten küçüğe sıralanması
Sub sırala1()
a = Int(InputBox("1. sayıyı girinizi"))
b = Int(InputBox("2. sayıyı girinizi"))
c = Int(InputBox("3. sayıyı girinizi"))
If a > b Then
t = a
a = b
b = t
End If
If a > c Then
t = a
a = c
c = t
End If
If b > c Then
t = b
b = c
c = t
End If
MsgBox a
MsgBox b
MsgBox c
End Sub
Diziler
Aynı sıralama örneğini dıĢarıdan girilen çok daha fazla sayı için for…next döngüsü ile yapalım. Bu
örnekte dıĢarıdan girilen çok sayıdaki veriyi bir dizinin içine atıyoruz. Diziler
dim x(4) türü bildirile ile tanımlanır. x(4) dizisine 5 adet atama yapılır x(0)=sayı, x(1)=sayı … gibi. Eğer bir
dizinin büyüklüğü baĢtan bilinmiyorsa ve dıĢarıdan alınacak bir sayı ile sonradan tanımlanacaksa dizini baĢtan sınır
belirtilmeden tanımlanması ve sonrasında sınırlanarak yeniden tanımlanması gerekir.
Dim x()
a=Veri giriĢi
ReDimx(a) gibi
eğer dizinin 0 dan değil de 1 den baĢlanması isteniyorsa ReDimx(1 to a) Ģeklinde tanımlanması gerekir.
Burada tanımladığımız dizi 1 boyutlu dizidir. Ġhtiyaç halinde (örneğin bir matris hesabında) 2 ve daha çok
boyutlu diziler de tanımlanabilir.
Sıralama örneğini dıĢarıdan girilen çok daha fazla sayı için for…next döngüsü ile
yapalım
Sub sırala2()
Dim x()
s = Int(InputBox("dizinin büyüklüğünü giriniz"))
ReDim x(1 To s)
For i = 1 To s
x(i) = Int(InputBox(i & ". sayıyı giriniz"))
Next i
For i = 2 To s
For j = 1 To i - 1
If x(j) > x(i) Then
t = x(i)
x(i) = x(j)
x(j) = t
End If
Next j
Next i
For i = 1 To s
MsgBox x(i)
Next i
End Sub
EXCEL ĠLE PROGRAMLAMAYA GIRIġ
Hücre Seçmek, Hücreye Değer Atamak, Hücreye Formül Yazdırmak
Hücre seçmek
Sub makrom1()
Range("b2").Select
End Sub
Sub makrom2()
Cells(2, 2).Select
End Sub
Sub makrom3()
[b2].Select
End Sub
Hücre aralığı seçmek
Sub makrom4()
Range("a3:c10").Select
End Sub
Sub makrom5()
Range("a1,b3:d5,c10:c12,f8").Select
End Sub
Satır seçmek
Sub makrom6()
Rows("14:14").Select
End Sub
Birden fazla satır seçmek için
Sub makrom7()
Range("2:2,5:5,11:14").Select
End Sub
Sütun seçmek
Sub makrom8()
Columns("b:b").Select
End Sub
Birden fazla sütunu seçmek
Sub makrom9()
Range("a:a,c:c,f:j").Select
End Sub
Bütün hücreleri seçmek
Sub makrom10()
Cells.Select
End Sub
Seçili hücrelere ait satırın tamamını seçmek
Sub makrom11()
Selection.EntireRow.Select
End Sub
Seçili hücrelere ait sütunun tamamını seçmek
Sub makrom12()
Selection.EntireColumn.Select
End Sub
Aktif hücrenin etrafındaki dolu hücreleri seçmek
Sub makrom13()
ActiveCell.CurrentRegion.Select
End Sub
Seçili hücrenin etrafındaki dolu hücreleri seçmek
Sub makrom15()
Selection.CurrentRegion.Select
End Sub
Seçili olan hücrelerin sayısını öğrenmek
Sub makrom16()
Range("a1").Value = Selection.Count
End Sub
Seçimin satır sütun sayısını bulmak
Sub makrom17()
MsgBox Selection.Rows.Count
MsgBox Selection.Columns.Count
End Sub
Seçili alan sayısını bulmak
Sub makrom18()
MsgBox Selection.Areas.Count
End Sub
Hücreye formül yazdırmak
Sub makrom19()
Range("b3").Formula = "=b1+b2"
End Sub
Sub makrom20()
Range("b3").Formula = "=sum(b1:b2)"
End Sub
r1 c1 baĢvuru stili
Sub makrom21()
Range("a1").FormulaR1C1 = "=R[4]C[2]+R[5]C[2]" 'a1 den sonraki 4. satır ve 2. sütun
End Sub
Sub makrom22()
Range("a1").FormulaR1C1 = "=sum(RC[1]+R[1]C[1])"
End Sub
Sub makrom23()
Range("a1").FormulaR1C1 = "=IF(RC[2]=15,""c1 deki sayı 15"",""c1'deki sayı 15 değil"")"
End Sub
Hücreye değer atamak
Sub makrom24()
Range("b2").Value = 125
End Sub
Seçili hücreye değer atamak
Sub makrom25()
Range("b2").Value = "merhaba"
End Sub
Seçili hücreye değer atamak
Sub makrom26()
Range("b2").Text = "merhaba"
End Sub
Seçili hücreye değer atamak
Sub makrom27()
Range("b2").Select
Range("b2").Value = 125
End Sub
Seçili hücreye değer atamak
Sub makrom28()
Range("b2").Select
Selection.Value = 125
End Sub
Seçili olan bütün hücrelere aynı değeri atamak
Sub makrom29()
Range("a1,b3:d5,c10:c12,f8").Select
Selection.Value = 150
End Sub
Seçili hücrelere değer atadıktan sonra A1 hücresi seçili kalsın
Sub makrom30()
Range("a1,b3:d5,c10:c12,f8").Select
Selection.Value = 150
Range("a1").Select
End Sub
Seçili hücrelere değer atadıktan sonra A100 hücresi seçili kalsın
Sub makrom31()
Range("a1,b3:d5,c10:c12,f8").Select
Selection.Value = 150
Range("a100").Select
End Sub
Seçili hücrelere değer atadıktan sonra A100 hücresi seçili kalsın fakat ekran 1. satıra
gelsin
Sub makrom32()
Range("a1,b3:d5,c10:c12,f8").Select
Selection.Value = 150
Range("a100").Select
ActiveWindow.ScrollRow = 1
'atif penceredeki kaydırma çubuğunu 1. satıra getir
'hangi rakamı yazarsak o rakama ait satır ekranın en baĢında olur.
End Sub
Hücre ve yazıtipinin (font) özelliklerini değiĢtirmek
Sub makrom33()
Range("b5").Value = "caner kılınç"
Range("b5").Interior.ColorIndex = 3 '3 kırmızıdır
End Sub
Bir önceki kodun sütün geniĢliğini de değiĢtirelim
Sub makrom34()
Range("b5").Value = "merhaba"
Range("b5").Interior.ColorIndex = 3
Columns("b:b").ColumnWidth = 35 ' 35 250 pikseldir, 8,43 64 pikseldir
End Sub
Bir önceki kodun yazı rengini değiĢtirelim geniĢliğini de değiĢtirelim
Sub makrom35()
Range("b5").Value = "caner kılınç"
Range("b5").Interior.ColorIndex = 3
Columns("b:b").ColumnWidth = 35
Range("b5").Font.ColorIndex = 6 'font: yazı tipi
End Sub
Bir önceki kodun bold ve italic özelliğini aktifleĢtirelim
Sub makrom36()
Range("b5").Value = "caner kılınç"
Range("b5").Interior.ColorIndex = 3
Columns("b:b").ColumnWidth = 35
Range("b5").Font.ColorIndex = 6 'font: yazı tipi
Range("b5").Font.Size = 20
Range("b5").Font.Bold = True
Range("b5").Font.Italic = True
End Sub
With-End With
Bir önceki kodda range(“b5”) „i sürekli yazmak yerine with..end with özelliği
kullanarak bir sefer de yazabiliriz
Sub makrom37()
With Range("b5")
.Value = "caner kılınç"
.Interior.ColorIndex = 3
.Font.ColorIndex = 6
.Font.Size = 20
.Font.Bold = True
.Font.Italic = True
End With
Columns("b:b").ColumnWidth = 35
End Sub
Aynı Ģekilde font özelliğini de with..end with ile tek sefer yazalım
Sub makrom38()
With Range("b5")
.Value = "caner kılınç"
.Interior.ColorIndex = 3
With .Font
.ColorIndex = 6
.Size = 20
.Bold = True
.Italic = True
End With
End With
Columns("b:b").ColumnWidth = 35
End Sub
Sütun geniĢliğini columns yerine range(“b5”) ile de değiĢtirebilirim. Bir hücrenin
geniĢliğini değiĢtrimek için sütunun geniĢliği değiĢmek zorundadır.
Sub makrom39()
With Range("b5")
.Value = "caner kılınç"
.Interior.ColorIndex = 3
.ColumnWidth = 35
With .Font
.ColorIndex = 6
.Size = 20
.Bold = True
.Italic = True
End With
End With
End Sub
Hücre Ġçini Otomatik Doldurmak
Hücre içini otomatik olarak doldurmak
a1 hücresine 500 girdik f1 e kadar doldurmak istiyoruz
Sub sagadoldur()
Range("a1:f1").FillRight
End Sub
Sub soladoldur()
Range("a1:f1").FillLeft
End Sub
Sub asagıyadoldur()
Range("a1:a10").FillDown
End Sub
Sub yukariyadoldur()
Range("a1:a10").FillUp
End Sub
Kaynak hücreleri referans alarak hedef hücreleri doldurmak ilk iki hücredeki
veriye göre dizi oluĢturmak
Sub doldur()
Range("a1:a2").AutoFill Destination:=Range("a1:a20")
End Sub
Hücreye Rastgele Sayı Atamak
Sub rasgele1()
Range("a1").Formula = "=rand()"
End Sub
Sub rasgele2()
Range("a1").Formula = "=rand()*100"
End Sub
Sub rasgele3()
Range("a1").Formula = Rnd
End Sub
Rastgele sayının ondalık kısmını atmak
Sub rasgele4()
Range("a1").Formula = Int(Rnd * 100)
End Sub
BaĢka Programları Çağırmak
hesap makinesi
Sub ac1()
Dim a
a = Shell("c:\windows\notepad.exe", vbMaximizedFocus)
End Sub
Word
Sub ac2()
Application.ActivateMicrosoftApp xlMicrosoftWord
End Sub
Aktif ÇalıĢma Kitabını Kaydetmek
Sub kayıt1()
ActiveWorkbook.Save 'belgelerime kaydeder
End Sub
Bütün çalıĢma kitaplarını kaydeder
Sub kayıt2()
Dim i As Integer
For i = 1 To Workbooks.Count
Workbooks(i).Save
Next i
End Sub
Aktif ÇalıĢma Kitabını Kapatmak
Sub kapa1()
ActiveWorkbook.Close
End Sub
Sub kapa2()
ActiveWorkbook.Close True 'kayderek kapamak için
End Sub
Sub kapa3()
Workbooks("book2.xls").Close 'book 2 yi önceden kaydetmeliyiz.
End Sub
Yeni ÇalıĢma Kitabı Eklemek
Sub ekle()
Workbooks.Add
End Sub
Var olan çalıĢma kitabını açma belirtilen hücre aralığına veri kaydetmek
Sub ac1()
Workbooks.Open Filename:="C:\Documents and Settings\caner\Desktop\deneme.xls"
Range("a1:f10").Value = "merhaba"
End Sub
Var olan çalıĢma kitabını açma belirtilen sayfada belirtilen hücre aralığına veri
kaydetmek
Sub ac2()
Workbooks.Open Filename:="C:\Documents and Settings\caner\Desktop\deneme.xls"
Worksheets("sheet2").Select
Range("a1:f10").Value = "merhaba"
End Sub
Var olan çalıĢma kitabını açmadan belirtilen sayfada belitirlen hücre aralığına veri
kaydetmek
Sub ac3()
Workbooks.Open Filename:="C:\Documents and Settings\caner\Desktop\deneme.xls"
Worksheets("sheet2").Range("a1:f10").Value = "merhaba"
End Sub
Var olan çalıĢma kitabını açmadan belirtilen sayfada belitirlen hücre aralığına veri
kaydetmek ve sayfayı kaydederek kapatmak
Sub ac4()
Workbooks.Open Filename:="C:\Documents and Settings\caner\Desktop\deneme.xls"
Worksheets("sheet2").Select
Range("a1:f10").Value = "merhaba"
Workbooks("deneme.xls").Close True
End Sub
Sayfa açıkken belirtilen sayfada belirtilen hücre aralığına veri kaydetmek
Sub acık()
Workbooks("deneme.xls").Worksheets("sheet2").Range("a1:f10").Value = "domates"
End Sub
ÇalıĢma Kiyabına Yeni Sayfa Eklemek
Sub sayfaekle1()
Worksheets.Add
End Sub
ÇalıĢma kiyabına yeni sayfa eklemek ve eklenen sayfaya isim vermek
Sub sayfaekle2()
Worksheets.Add
ActiveSheet.Name = "yeni"
End Sub
ÇalıĢma kiyabına yeni sayfa eklemek sayfayı sona taĢımak ve yeni isim vermek
Sub sayfaekle3()
Worksheets.Add.Move after:=Worksheets(Worksheets.Count)
ActiveSheet.Name = "yeni"
End Sub
ÇalıĢma kiyabına yeni sayfa eklemek sayfayı sondan bir önceye taĢımak ve yeni isim
vermek
Sub sayfaekle4()
ActiveWorkbook.Sheets.Add before:=Worksheets(Worksheets.Count)
ActiveSheet.Name = "yeni"
End Sub
Sayfa seçmek
Sub sec1()
Sheets("sheet2").Select
End Sub
Birden fazla sayfayı seçmek
Sub sec2()
Sheets(Array("sheet2", "sheet3")).Select
End Sub
Sayfa taĢımak
Sub tası1()
Worksheets("sheet1").Move after:=Worksheets("sheet3")
End Sub
Sub tası2()
Worksheets("sheet1").Move before:=Worksheets("sheet3")
End Sub
Sayfa sayısını öğrenmek
Sub sayfasayisi1()
MsgBox Worksheets.Count
End Sub
5 sayfa ekledikten sonra uyaracak ve sayfa eklemeyecek
Sub sayfasayisi2()
If Worksheets.Count < 5 Then
Worksheets.Add
Else
MsgBox "sayfa sıyınız:" & Worksheets.Count
End If
End Sub
Aktif sayfanın adını öğrenmek
Sub adi1()
MsgBox ActiveSheet.Name
End Sub
Aktif sayfa ismini B2 hücresine yazar
Sub adi2()
Range("b2").Value = ActiveSheet.Name
End Sub
Sayfaların isimlerini A1 hücresinden itibaren yazacak
Sub adi3()
Dim i As Integer
For i = 1 To Worksheets.Count
Cells(i, 1).Value = Worksheets(i).Name
Next i
End Sub
Sayfaları küçükten büyüğe doğru sıralamak
Sub sırala()
Dim i As Integer
Dim j As Integer
If Worksheets.Count = 1 Then Exit Sub
For i = 1 To Worksheets.Count - 1
For j = i + 1 To Worksheets.Count
If Worksheets(j).Name < Worksheets(i).Name Then
Worksheets(j).Move before:=Worksheets(i)
End If
Next j
Next i
End Sub
Aktif penceredeki seçimin adresini verir
Sub adres1()
MsgBox ActiveWindow.Selection.Address
End Sub
Sub adres2()
MsgBox ActiveWindow.Selection.Address(external:=True)
End Sub
Seçimdeki dolu hücre sayısı
Sub doluhucresayisi()
Dim adet As Integer
adet = Application.CountA(Selection)
MsgBox "seçimdeki dolu hücre sayısı: " & adet
End Sub
Aranan bir kelimenin belirtilen hücre aralığında kaç adet olduğunu bulur
Sub inputbocpenceresi1()
Dim k As Range
Dim i As Integer
b = InputBox("kelimeyi yazın.", "kelime gir")
i = 0
For Each k In Range("a1:f10")
If k = b Then i = i + 1
Next k
MsgBox "aranan kelimeden " & i & " adet bulunmaktadır."
End Sub
Ġnutbox a girilen hücre aralığına istenilen bilgiyi yazar
Sub inputboxpenceresi2()
hucre = InputBox("hücre aralığını girin")
Range(hucre).Value = InputBox("hücrelere yazılacak kelimeyi girin")
End Sub
Ġnutbox a girilen hücre aralığını seçer
Sub inputbocpenceresi3()
hucre = InputBox("hücre aralığını girin")
Range(hucre).Select
End Sub
Ġnputbox fonksiyonunda application nesnesi
Sub appinputbox1()
hucre = Application.InputBox("hücre aralığını giriniz.")
Range("d1").Value = hucre
End Sub
Seçtiğimiz hücrenin içini d1:f5 e yazdırır
Sub appinputbox2()
hucre = Application.InputBox("hücre aralığını giriniz.")
Range("d1:f5").Value = hucre
End Sub
Offset
Offset kullanım: offset, bulunduğumuz hücreyi referans alarak bu hücereye göre gideceğimiz hücreyi
yazmamızı sağlar. Örneğin Cells(1,1).offset(0,0).value=”adı” kodu cells (1,1) hücresini referans al ve bu hücreden 0
sağa ve 0 sola giderek geldiğin hücrenin içine adı kelimesini yaz anlamına gelir
Uygulamaları
Sub offsetkullan1()
Cells(1, 1).Value = "adı"
Cells(1, 2).Value = "soyadı"
Cells(1, 3).Value = "d_tarihi"
Cells(1, 4).Value = "d_yeri"
End Sub
Sub offsetkullan2()
Cells(1, 1).offset(0, 0).Value = "adı"
Cells(1, 1).offset(0, 1).Value = "soyadı"
Cells(1, 1).offset(0, 2).Value = "d_tarihi"
Cells(1, 1).offset(0, 3).Value = "d_yeri"
End Sub
Sub offsetkullan3()
Cells(3, 4).offset(-1, 0).Value = "d3 referansımdır"
End Sub
Sub offsetkullan4()
Range("a1").offset(0, 0).Value = "adı"
Range("a1").offset(0, 1).Value = "soyadı"
Range("a1").offset(0, 2).Value = "d_tarihi"
Range("a1").offset(0, 3).Value = "d_yeri"
Range("a1").offset(1, 0).Value = "caner"
Range("a1").offset(1, 1).Value = "kılınç"
Range("a1").offset(1, 2).Value = "1977"
Range("a1").offset(1, 3).Value = "samsun"
End Sub
Bir önceki kodun aktif hücreye uyarlanması
Sub offsetkullan5()
ActiveCell.offset(0, 0).Value = "adı"
ActiveCell.offset(0, 1).Value = "soyadı"
ActiveCell.offset(0, 2).Value = "d_tarihi"
ActiveCell.offset(0, 3).Value = "d_yeri"
ActiveCell.offset(1, 0).Value = "caner"
ActiveCell.offset(1, 1).Value = "kılınç"
ActiveCell.offset(1, 2).Value = "1977"
ActiveCell.offset(1, 3).Value = "samsun"
End Sub
ġimdi yazacağımız kod A2 hücresinden itibaren sırayla 1 den baĢlayarak
rakamların yazılamsını sağlar. Eğer sırayla yazılan değerlerden aradaki bir değer
silinirse bir sonraki sayının silinen sayıdan sonraki hücreye silinen sayıdan sonraki
değerle yazılasını sağlar. Bu kodu user form hazırlarken de kullanacağız.
Sub offsetkullan6()
Range("a1").Select
ActiveCell.Offset(1, 0).Select
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Select
Loop
If Range("a2").Value = "" Then
Range("a2").Value = 1
Else
ActiveCell.Value = ActiveCell.Offset(-1, 0).Value + 1
End If
End Sub
Program her çalıĢtığında en sona bir rakam daha ekler ve 11, 12 diye devam eder
Eğer aradan silinen değerler olursa program tekrar çalıĢtığında önce eksik
değerleri bir öneki hücreye bakarak o hücrenin bir fazlası değerle doldurur ve tüm
eksik hücreler dolduktan sonra en sondali hücreden sırayla doldurmaya devam
ederek ilerler.
Mesajbox
Sub mesajkutusu()
cevap = MsgBox("a1 hücresine 500 yazsın mı?", vbYesNo)
MsgBox cevap
‘msgbox ta yes yada no dediğimizde bir sayısal değer cevap seçeneğine atanır.
‘sayısal değeri görmek için bu satırı yazdık
If cevap = 6 Then
Range("a1").Value = 500
Else
MsgBox "a1 hücresine bir Ģey yaılmayacak"
End If
End Sub
USER FORM VE ÖZELLIKLERI
VBA project: kitabın adı parantez içinde yazar istersek ismini tools>>VBAproject properties ten
değiĢtirebiliriz.
Bölümler
Appearance:elemanın görünüĢü ile ilgili özellikler
Behavior:elemanın durumu, davranıĢı ile ilgili özellikler
Font:yazıtipi ile ilgili özellikler
Misc:herhangi bir grubu bulunmayan farklı özellikler
Picture: resimle ilgili özellikler
Position:elemanın boyutları, form ve ekran üzerindeki konumları ile ilgili özellikler
1.Form : Coommandbutton Ve Textbox’ı Tanıma
Text box‟taki veriyi 1. botona tıklayarak A1
hücresine yazdırmak için
Private Sub CommandButton1_Click()
Range("a1").Value = TextBox1.Text
End Sub
2. butona tıklayarak formu kapatmak için
Private Sub CommandButton2_Click()
Unload UserForm1
End Sub
Formun üzerine bir kez tıklayınca mesaj kutusunun açılması için
Private Sub UserForm_Click()
MsgBox "formun herhangi bir yerine tıkladınız"
End Sub
Butonların görünen ismini kodla değiĢtirmek için
Private Sub UserForm_Initialize()
CommandButton1.Caption = "veri ekle"
CommandButton2.Caption = "formu kapat"
End Sub
2. Form : Oyun Makinası
Private Sub CommandButton1_Click()
Randomize Timer
a = Int(Rnd() * 100)
b = Int(Rnd() * 100)
c = Int(Rnd() * 100)
Label1.Caption = a
Label2.Caption = b
Label3.Caption = c
If a = b And b = c Then
MsgBox "Büyük ikramiye!.."
ElseIf a = b Or a = c Or b = c Then
MsgBox "Amorti!.."
Else
End If
End Sub
3. Form : Hesap Makinası
Captionlar
CommandButton1=1
CommandButton2=2
CommandButton3=3
CommandButton4=4
CommandButton5=5
CommandButton6=6
CommandButton7=7
CommandButton8=8
CommandButton9=9
CommandButton10=0
CommandButton11= “C”
CommandButton12= “=”
CommandButton13= “+”
CommandButton14= “-“
CommandButton15= “*”
CommandButton16= “/”
Kodu
Dim a, islem
Private Sub CommandButton1_Click()
TextBox1.Text = TextBox1.Text & "1"
End Sub
Private Sub CommandButton2_Click()
TextBox1.Text = TextBox1.Text & "2"
End Sub
Private Sub CommandButton3_Click()
TextBox1.Text = TextBox1.Text & "3"
End Sub
Private Sub CommandButton4_Click()
TextBox1.Text = TextBox1.Text & "4"
End Sub
Private Sub CommandButton5_Click()
TextBox1.Text = TextBox1.Text & "5"
End Sub
Private Sub CommandButton6_Click()
TextBox1.Text = TextBox1.Text & "6"
End Sub
Private Sub CommandButton7_Click()
TextBox1.Text = TextBox1.Text & "7"
End Sub
Private Sub CommandButton8_Click()
TextBox1.Text = TextBox1.Text & "8"
End Sub
Private Sub CommandButton9_Click()
TextBox1.Text = TextBox1.Text & "9"
End Sub
Private Sub CommandButton10_Click()
TextBox1.Text = TextBox1.Text & "0"
End Sub
Private Sub CommandButton11_Click()
TextBox1.Text = ""
End Sub
Private Sub CommandButton12_Click()
b = Int(TextBox1.Text)
Select Case islem
Case "+"
s = a + b
Case "-"
s = a - b
Case "x"
s = a * b
Case "/"
s = a / b
End Select
TextBox1.Text = s
End Sub
Private Sub CommandButton13_Click()
a = Int(TextBox1.Text)
islem = "+"
TextBox1.Text = ""
End Sub
Private Sub CommandButton14_Click()
a = Int(TextBox1.Text)
islem = "-"
TextBox1.Text = ""
End Sub
Private Sub CommandButton15_Click()
a = Int(TextBox1.Text)
islem = "x"
TextBox1.Text = ""
End Sub
Private Sub CommandButton16_Click()
a = Int(TextBox1.Text)
islem = "/"
TextBox1.Text = ""
End Sub
4. Form : Kayıt Formu
Forma eklenen nesneler ve nesnelerde yapılan değiĢiklik bilgilerinin tablosu
Kodu
Private Sub cmdkapat_Click()
Unload frmpers
End Sub
Private Sub cmdkayit_Click()
Range("a2").Select
Do While Not IsEmpty(ActiveCell) „daha önce kullanacağımızı söylediğimiz kod
ActiveCell.Offset(1, 0).Select
Loop
If Range("a2").Value = "" Then
Range("a2").Value = 1
Range("a2").Select
Else
ActiveCell.Value = ActiveCell.Offset(-1, 0).Value + 1
End If
ActiveCell.Offset(0, 1).Value = txtad.Text
ActiveCell.Offset(0, 2).Value = txtmeslek.Text
ActiveCell.Offset(0, 3).Value = txtdtarihi.Text
ActiveCell.Offset(0, 4).Value = txtdyeri.Text
aciklama = "kayit islemi tamamlandi"
dugme = vbOKOnly + vbInformation + vbDefaultButton1
baslik = "KAYIT"
MsgBox aciklama, dugme, baslik
End Sub
Private Sub cmdtemizle_Click()
txtad = ""
txtmeslek = ""
txtdtarihi = ""
txtdyeri = ""
txtad.SetFocus
End Sub
‘formun excel sayfasından bir nesne ile çalıĢtırılması için (buton, custom menu item vd.)
‘yazılacak modül
Sub goster()
Frmpers.Show
End Sub
Formumuza bir CommandButton ekleyelim bu buton txtad TextBox‟ına
yazacağımız ismin bilgilerini ekrana getirsin
Eklediğimiz CommendButton‟un Name‟ini “cmdpercagir”, caption‟unu “personel
cagir” yaptık.
Kodun son haline cmdpercagir botununa çift tıklayarak eklediğimiz kod
Private Sub cmdpercagir_Click()
If txtad.Value = "" Then
MsgBox "Lütfen ad soyad kutusuna geçerli personel girin."
Exit Sub
End If
Set adsoyad = Range("b2:b30").Find(txtad.Value, searchdirection:=xlNext, MatchCase:=False)
If adsoyad Is Nothing Then
MsgBox "aradiginiz ad ve soyadda kayit yok"
Exit Sub
End If
ilksatir = adsoyad.Row
Set adsoyad = Range("b2:b30").FindPrevious(Range("b30"))
sonsatir = adsoyad.Row
Set adsoyad = Range(Cells(ilksatir, 2), Cells(sonsatir, 2)).Find(txtad.Value, searchdirection:=xlNext,
MatchCase:=False)
txtad.Value = Cells(ilksatir, 2).Value
txtmeslek.Value = Cells(ilksatir, 3).Value
txtdtarihi.Value = Cells(ilksatir, 4).Value
txtdyeri.Value = Cells(ilksatir, 5).Value
End Sub
Formumuza bir ComboBox ekleyelim bu ComboBox‟tan seçeceğimiz ismin bilgileri
ekrana gelsin
Eklediğimiz ComboBox‟ın Name‟ini “cboad” yaptık.
Rowsource olarak B2:B30 hücre aralığını belirledik
Kodun son haline cboad ComboBox‟ına çift tıklayarak eklediğimiz kod
Private Sub cboad_Change()
Set adsoyad = Range("b2:b30").Find(cboad.Value, searchdirection:=xlNext, MatchCase:=False)
ilksatir = adsoyad.Row
Set adsoyad = Range("b2:b30").FindPrevious(Range("b30"))
sonsatir = adsoyad.Row
Set adsoyad = Range(Cells(ilksatir, 2), Cells(sonsatir, 2)).Find(cboad.Value, searchdirection:=xlNext,
MatchCase:=False)
txtmeslek.Value = Cells(ilksatir, 3).Value
txtdtarihi.Value = Cells(ilksatir, 4).Value
txtdyeri.Value = Cells(ilksatir, 5).Value
End Sub
Yeni eklediğimiz bir kayıdın daha önceden olup olmadığını kontrol etmek için
“cmdkayit” butonuna çift tıklayarak kodun en baĢına Private Sub‟ın altından
itibaren Ģu kodu da ekleyelim
For Each ayni_mi In Range("b2:b30")
If ayni_mi.Value = txtad.Value Then
MsgBox "Bu personel kayitlarimizda zaten var"
Exit Sub
End If
Next ayni_mi
Eklediğimiz ComboBox‟I kullsnırken dikkat ettiysek ComboBox açıldığında
rowsource‟unda belirttiğimiz B2:b30 arasındaki hücrelerin tamamı gelmektedir. Bu
durum bilgisayarımızın performansını düĢürür. ComboBox‟ta sadece kayıt edilen
hücrelerin gelmesi için önce rowsource‟unu siler ve Userform‟un initialize‟ına Ģu
kodu yazarız
Private Sub UserForm_Initialize()
cboad.RowSource = "sheet1!b2:b" & WorksheetFunction.CountA(Range("b2:b30")) + 1
End Sub
Formumuzun üzerinde bir kapat butonu var fakat form sol üst köĢesinde ki “X”
iĢaretine tıklanarak da kapatılabiliyor. Bu “X” ile kapatılmasını engellemek için
kodumuzun son haline Ģu kodu da ekleyerek formu bitirelim
Private Sub UserForm_QueryClose(cancel as integer,closemode as integer)
If closemode=vbFormControlMenu Then
Cancel=true
End If
End Sub
Eğer kodumuzun en üstündeki boĢ alana “Option Explicit » yazmıĢ olsaydık
kodumuz sırasında tanımlanmayan değiĢkenler için hata verecekti. Bu da bizi bütün
değiĢkenleri tanımlamaya zorunlu bırakacaktı. DeğiĢken tanımlamak bprogram
performansı açısından önemlidir.
MICROSOFT ACCESS BAĞLANTISI
Bu örneğimizde Excele yazdığımız veriyi Access‟e kaydeden, Accesse yaptığımız kayıtları çağıran, silen,
güncelleyen, Excel‟e çağırdığımız kayıtların maaĢlarını verdiğimiz kritere göre renklendiren ve maaĢın rengine göre
toplama yapan bir kod yazalım.
Bu örnek için öncelikle kullanağımız veri tiplerini tanımalayabilmek için VBA‟in bazı kütüphane
dosyalarını aktif hale getirmemiz gerekiyor.
Bunun için VBA pencereinden tools>>references seçeneğine tıklarız. Bueada bulunan seçeneklerden
Microsoft DAO 3.6 Objects 2.1 Library ve Microsoft ActiveX Data Objects 2.1 Library
seçeneklerinin sol taraflarındaki kutucuğu iĢartleyerek ok düğmesine tıklarız. Artık tanımlayacağımız veri tipleri
VBA tarafından anlaĢılacaktır.
Kodu
1.kod:
excel sayfasında A2, B2, C2 hücrelerindeki verileri C‟nin altında bulanan
“deneme.mdb” veritabanına kaydeder. Eğer girilen kayıdın numarası daha önceden
baĢka bir kayıda verilmiĢse “Kayıt Zaten Var” uyarısını verir.
Sub Ekle()
Dim conn As Database
Dim rs As DAO.Recordset
Dim a As Integer
a = 1
Set conn = OpenDatabase("c:\\deneme.mdb")
Set rs = conn.OpenRecordset("table1")
Do Until rs.EOF
If Range("a2").Value = rs.Fields("no") Then
bulundu = True
End If
rs.MoveNext
Loop
If bulundu = True Then
MsgBox ("Kayıt Zaten Var")
ElseIf Range("a2") <> "" And Range("b2") <> "" And Range("c2") <> "" Then
rs.AddNew
rs.Fields("no").Value = Range("a2").Value
rs.Fields("ad").Value = Range("b2").Value
rs.Fields("maas").Value = Range("c2").Value
rs.Update
MsgBox ("Kayıt YapılmıĢtır")
End If
End Sub
2.kod
Access‟te kayıtlı olan verileri E2 hücresinden itibaren listeler.
Sub VeriAl()
Dim conn As Database
Dim rs As DAO.Recordset
Dim a As Integer
a = 2
Set conn = OpenDatabase("c:\\deneme.mdb")
Set rs = conn.OpenRecordset("table1")
Range("e2:g65536").Clear
Do Until rs.EOF
Cells(a, 5).Value = rs.Fields("no")
Cells(a, 6).Value = rs.Fields("ad")
Cells(a, 7).Value = rs.Fields("maas")
rs.MoveNext
a = a + 1
Loop
rs.Close
conn.Close
End Sub
3. kod
Numarasını A2 hücresine yazdığımız veriyi günceller
Sub Veriguncelle()
Dim conn As Database
Dim rs As DAO.Recordset
Dim a As Integer
Set conn = OpenDatabase("c:\\deneme.mdb")
Set rs = conn.OpenRecordset("Table1")
deger = InputBox("Lütfen Bir Ġsim Girin")
deger1 = InputBox("Lütfen Ücret Girin")
Do Until rs.EOF
If Range("a2").Value = rs.Fields("no").Value Then
MsgBox ("Kayıt Güncellendi")
rs.Edit
rs.Fields("no").Value = Range("a2").Value
rs.Fields("ad").Value = deger
rs.Fields("maas").Value = Val(deger1)
rs.Update
End If
rs.MoveNext
Loop
rs.Close
conn.Close
End Sub
4. kod
Numrasını A2 hücresine yazdığımız verinin bilgilerini getirir.
Sub Veribul()
Dim conn As Database
Dim rs As DAO.Recordset
Dim a As Integer
Set conn = OpenDatabase("c:\\deneme.mdb")
Set rs = conn.OpenRecordset("Table1")
Do Until rs.EOF
If Range("a2").Value = rs.Fields("no").Value Then
Range("a2").Value = rs.Fields("no").Value
Range("b2").Value = rs.Fields("ad").Value
Range("c2").Value = rs.Fields("maas").Value
End If
rs.MoveNext
Loop
rs.Close
conn.Close
End Sub
5.kod
Girilen maaĢa göre maaĢların arka plan rengini kırmızı yapar.
Eğer girilen maaĢa eĢit maaĢların renklendirilmesi isteniyorsa “0” ,
Girilen maaĢtan büyük maaĢların renklendirilmesi isteniyorsa “2”,
Girilen maaĢtan küçük maaĢların renklendirilmesi isteniyorsa “1” seçeneği seçilir.
Sub renklendir()
Range("g2").Select
Range(Selection, Selection.End(xlDown)).Select
kacoldu = Selection.Count
Range("g1").Select
Range("g2:g" & kacoldu + 1).Interior.ColorIndex = xlNone
sor = InputBox("MaaĢı gireceksiniz")
sonuc = InputBox("Büyük için 2----Küçük için 1----EĢit için 0 Girin")
Application.ScreenUpdating = False
For I = 1 To kacoldu
If Val(sonuc) = 1 And Range("g" & I + 1) < Val(sor) Then
Range("g" & I + 1).Interior.Color = vbRed
End If
If Val(sonuc) = 0 And Range("g" & I + 1) = Val(sor) Then
Range("g" & I + 1).Interior.Color = vbRed
End If
If Val(sonuc) = 2 And Range("g" & I + 1) > Val(sor) Then
Range("g" & I + 1).Interior.Color = vbRed
End If
Next I
End Sub
6.kod
MaaĢ sütununda kırmızı renkli hücreleri toplar. Toplamı “I2” hücresine yazar.
Sub renktopla()
Dim i As Integer
Dim topla As Integer
topla = 0
For i = 2 To 40
If Range("g" & i).Interior.Color = vbRed Then
topla = topla + Range("g" & i).Value
Range("I2") = topla
End If
Next i
End Sub
GRAFIK OLUġTURMAK
Sayfa1 A1:A7 Hücrelerindeki Verilerden Grafik OluĢturmak
Sub grafik()
Charts.Add
ActiveChart.ChartType = xlColumnClustered
ActiveChart.SetSourceData Source:=Sheets("Sayfa1").Range("A1:A7")
ActiveChart.Location Where:=xlLocationAsObject, Name:="Sayfa1"
End Sub
VAW ÇALMAK
Sub muzik_cal()
If Range("A1").Value > 5 Then
ExecuteExcel4Macro ("SOUND.PLAY(, ""C:\Windows\Media\Tada.wav"")")
End If
End Sub
OFFICE YARDIMCISINI ÇAĞIRMAK
Sub yardımcıkullanmak()
With Assistant.NewBalloon
.Heading = "excel sayfası ile irtibat"
.Text = "aĢağıdaki düğmelere tıklayarak seçeneklerdeki iĢleri yaptırabilirsiniz"
.Icon = msoIconTip
.Labels(1).Text = "a1 hücresine yazar"
.Labels(2).Text = "c sütununa sayı yazdırır"
.Labels(3).Text = "mesaj kutusu açar"
.Labels(4).Text = "yardımcıyı kapatır"
.BalloonType = msoBalloonTypeButtons
.Mode = msoModeModeless
.Callback = "makrom"
.Button = msoButtonSetOkCancel
.Show
End With
End Sub
Sub makrom(balon As Balloon, secenek As Long, mtk As Long)
Select Case secenek
Case 1
Range("a1").Value = "iĢte a1 hücresine yazdım"
Case 2
For i = 3 To 10
Cells(i, 3).Value = i
Next i
Case 3
MsgBox "dediğim giibi bu bir mesaj kutusu"
Case 4
balon.Close
End Select
End Sub
API’LER (APPLICATION PROGRAMMING INTERFACE)
CD Sürücüsünü Açıp Kapamak
Private Declare Function mciExecute Lib "winmm.dll" _
(ByVal lpstrCommand As String) As Long
Sub CD_ac()
Call mciExecute("Set CDaudio door open")
End Sub
Sub CD_kapa()
Call mciExecute("Set CDaudio door closed")
End Sub
Windows'un Bilgisayarı Kapat Penceresini ÇalıĢtırmak
Private Declare Function SHShutDownDialog Lib "shell32" _
Alias "#60" (ByVal YourGuess As Long) As Long
Private Sub ShutDown()
SHShutDownDialog 0
End Sub
PROJE-1 (Ürünleri Sayfalara Bölmek)
Bu projemizde, bir tekstil firmasının bütün satıĢlarını içeren bir tablodan her ürün için
yeni bir sayfada ürün ile ilgili verileri alıp. Bu veriler üzerinden hesaplamalar yapacak.
Tablomuz aĢağıdaki gibidir.
1. Ürün Listesi Çıkarılır.
2. Veriler Fitrelenir ve Sayfalara Kopyalanır.
3. Ürün Toplamları Alınır.
4. Baslama Modülü OluĢturulur
Resim 1
Ürün SatıĢlarını gösteren kaynak tablo
1. Ürün Listesi Çıkarılır
Tablonun B sütununda kayıtların ürün bilgisi mevcut. ġu anda tablomuz da13 ürün
mevcut ve ürün isimleri belirli ama bu listedeki ürünlerin sayısı ve adının
değiĢebileceğini varsayarak Ürün sayınsı ve listesini belirleyen bir modül ile baĢlayalım.
Sub UrunListesiVeSayisi()
Columns("B:B").AdvancedFilter Action:=xlFilterCopy,CopyToRange:=Range("K1"), Unique:=True
Range("K2").Select
Range(Selection, Selection.End(xlDown)).Select
ToplamUrunSayisi = Selection.Count
End Sub
ToplamUrunSayisi değiĢkeni farklı baĢka bir modülde de kullanılacağı için
sayfanın en üstüne Tanımlanır.
Dim ToplamUrunSayisi As Integer
Resim 2
UrunListesiVeSayisi Modülü sonrasında ki görünüm.
Resim 3
VerileriKopyala Modülü sonrasında ki görünüm.
2. Veriler Fitrelenir ve Sayfalara Kopyalanır
For döngüsü içerisinde Aktif olan hücrenin değeri Alınarak Tablodan Filtrelernir.
Filtrelediği alanida yeni bir sayfa açarak kopyalar sonra verinin bulunduğu sayfaya geri
dönüp bu iĢlemi tekrar yapar.
Sub VerileriKopyala()
For i = 1 To ToplamUrunSayisi-1
UrunAdi = ActiveCell.Value
Range("C1").Select
Selection.AutoFilter
ActiveSheet.Range("$A$1:$I$48").AutoFilter Field:=2, Criteria1:=UrunAdi
Selection.CurrentRegion.Select
Selection.Copy
Sheets.Add After:=Sheets(Sheets.Count)
ActiveSheet.Name = UrunAdi
ActiveSheet.Paste
UrunToplamlariAl ‘(Üçüncü Modül)
Sheets("Veri").Select
Application.CutCopyMode = False
Selection.AutoFilter
Range("K2").Select
ActiveCell.Offset(i+1, 0).Select
Next i
End Sub
Resim 4
UrunToplamlariAl Modülü sonrasında ki görünüm.
3. Ürün Toplamları Alınır
VerileriKopyala Modülünde kopyalama iĢlemi bittikten sonra Veri sayfasına dönmeden
önce Ürünlerin Adet toplamını alan bir modül. Bu modülde ki kodlarıda Verileri Kopyala
modülünün içerisine yazabilirdik ama hem yaptıkları iĢ açısından hemde kodun okunabilirliği
açaısından farklı bir modülde yapmayı doğru bulduk.
Sub UrunToplamlariAl()
Dim ToplamAdet As Integer
Range("H2").Select
Range(Selection, Selection.End(xlDown)).Select
Toplamkayit = Selection.Count
ToplamAdet = 0
For i = 1 To Toplamkayit
ToplamAdet = ToplamAdet + ActiveCell.Value
ActiveCell.Offset(1, 0).Select
Next i
ActiveCell.Value = ToplamAdet
ActiveCell.Offset(0, -1).Value = "Toplam Adet"
End Sub
Resim 5
Ürün Rapor iĢeminden sonra ki görünüm.
4. Baslama Modülü Oluşturulur
Projemide Ģu anda kadar 3 modül oluĢturduk bunlardan UrunToplamlariAl modülü
VerileriKopyala modülünün içerisinde çalıĢıyor. Fakat UrunListesiVeSayisi modülünden
sonra VerileriKopyala modülünü tetikleyecek bir kod yok.
Macro çalıĢırken ekranın sabir tutacak ,diğer modüllerin çalıĢtıracak ve son olarak
oluĢturduğu ürün listesini Temizleyecek Baslama modülü oluĢturalım.
Sub BaslamaModulu()
Application.ScreenUpdating = False
UrunListesiVeSayisi
VerileriKopyala
Columns("K:K").Select
Selection.Delete Shift:=xlToLeft
End Sub
Ve bu modülü çalıĢtıracak bir buton ekleyelim.
Buton eklemek için Developer Ribonundan Insert Menüsünü kullanınız.
Açılan pencereden BaslamaModulunu seçelim.
PROJE -2 (Rapordan Tablo Oluşturmak)
Bir çoğumuzun makrolara asıl ihtiyaç duyguğumuz anlar genellikle standartların dıĢında
elimize ulaĢan verilerdir. Bazen elimize ulaĢan verilerde boĢ satırlar veya ara toplamlar gibi
kayıtlar bulunabiliyor. Bu durumda Excel fonksiyonları ile bir rapor oluĢturmak imkansız
hale geliyor.
Bu projemizde yukarıda bahsettiğim gibi bir tablomuz var aslında bu tablo zaten bir rapor.
Fakat bu rapordan baĢka raporlar oluĢturmak isteniyor. Nitekim bu tabloda da istenilen rapor;
Bölge Bazında Kredi türlerine göre müĢteri adetleri ve Ana Para Toplamı.
1. BaĢlıklar Yazdırılır.
2. Türe Göre Toplam alınır
3. Sıralama Yapılır
4. Bölgelere Göre Toplam Alınır
5. BaĢlama Modülü oluĢturulur.
Resim 1
MüĢteri Toplam ve BölgeToplamlarını gösteren kaynak tablo.
1. Başlıklar Yazdırılır
Yeni oluĢacak tablolarımızın baĢlıklarını aynı sayfada bulunan hücrelere yazan bir modül
oluĢturalım.
Sub BasliklariOlustur()
Range("G2") = "ġube"
Range("H2") = "Ürün"
Range("I2") = "MüĢteri Adedi"
Range("J2") = "Ana Para Risk Toplamı"
Range("L2") = "ġube"
Range("M2") = "Ürün"
Range("N2") = "MüĢteri Adedi"
Range("O2") = "Ana Para Risk Toplamı"
End Sub
Resim 2
BasliklariOlustur Modülünden sonraki görünüm.
2. Türe Göre Veri Toplamları
Tablomuzda boĢluklar olduğu için direk olarak toplam alamamaktayız. Bu nedenle
müĢterileri adetini de alarak Konut ve TaĢıt olarak toplamları alan bir tablo oluĢturacağız.
Sub MusteriyeGoreTopla()
i = 2
k = 0
Do While (i < Range("a65536").End(xlUp).Row)
If Right(Cells(i, 1).Value, 7) = "Bölgesi" Then
sira = Application.WorksheetFunction.Find(" ", Cells(i, 1), 1)
sube = Left(Cells(i, 1), sira - 1)
mus_adet = 0
toplam_ara_para = 0
urun = Cells(i + 1, 2)
ElseIf (Left(Cells(i, 1).Value, 7) = "MüĢteri") Then
toplam_ara_para = toplam_ara_para + Cells(i, 5)
mus_adet = mus_adet + 1
yeni_urun = Cells(i + 1, 2)
If (yeni_urun <> urun) Then
Cells(k + 3, 7) = sube
Cells(k + 3, 8) = urun
Cells(k + 3, 9) = mus_adet
Cells(k + 3, 10) = toplam_ara_para
urun = yeni_urun
mus_adet = 0
toplam_ara_para = 0
k = k + 1
End If
End If
i = i + 1
Loop
End Sub
3. Sıralama Modülü
Makro kullanarak oluĢturduğumuz yeni tabloda, Artık sıralama yaparak verileri toplattıra biliriz.
Sub Sirala()
Range("H7").Select
Selection.CurrentRegion.Select
Selection.Sort Key1:=Range("G3"), Order1:=xlAscending, Key2:=Range("H3") _
, Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2:=xlSortNormal
End Sub
Resim 3
Sıralama Modülünden sonraki görünüm.
4. Bölgelere Göre Toplam
Yeni oluĢturduğumuz tabloda bölge tekrarları mevcut. Bunlarında toplamını oluĢturacak yeni bir
tablo yapması için benzer mantıkla bir yeni bir tablo yapılır.
Sub BolgelereGoretopla() k = 3
i = 3
urun = Range("H3")
Do While (i < Range("H65536").End(xlUp).Row + 1)
yeni_urun = Cells(i + 1, 8)
If (yeni_urun <> urun) Then
Cells(k, 12) = Cells(i, 7)
Cells(k, 13) = Cells(i, 8)
Cells(k, 14) = mus_adet + Cells(i, 9)
Cells(k, 15) = toplam_ara_para + Cells(i, 10)
k = k + 1
mus_adet = 0
toplam_ara_para = 0
Else
mus_adet = mus_adet + Cells(i, 14)
toplam_ara_para = toplam_ara_para + Cells(i, 15)
End If
urun = yeni_urun
i = i + 1
Loop End Sub
Resim 4
Sıralama Modülünden sonraki görünüm.
5. Baslama Modülü Oluşturulur
Projemide Ģu anda kadar 4 modül oluĢturduk. Macro çalıĢırken diğer modüllerin
çalıĢtıracak Baslama modülü oluĢturalım.
Sub Basla() BasliklariOlustur
MusteriyeGoreTopla
Sirala
BolgelereGoretopla
End Sub
Ve bu modülü çalıĢtıracak bir buton ekleyelim.
Buton eklemek için Developer Ribonundan Insert Menüsünü kullanınız.
Açılan pencereden BaslamaModulunu seçelim.
Resim 5
Butona Basıdıktan sonraki görünüm.
PROJE -3 (Grafik Rapor Oluşturmak)
Bu projemizde yine bir tekstil firmasının bütün satıĢlarını içeren bir tablodan Ürünler
bazında Firmlar Bazında ve Aylar bazında Grafik yapan bir makro oluĢturacağız.
Tablomuz AĢağıdaki gibidir
1. Ürün SatıĢları Tablosu.
2. Üretici Firma SatıĢ Tablosu
3. Aylıl SatıĢ Tablosu
4. Ġsimler Düzenlenir.
5. Ürün Grafiği OluĢturulur
6. Firmalar Grafiği OluĢturulur
7. Aylık Grafik OluĢturulur
8. Baslama Modülü OluĢturulur
Resim 6
Ürün SatıĢlarını gösteren kaynak tablo
1. Ürün Satışları Tablosu
Tablonun B sütununda kayıtların ürün bilgisi mevcut. Ürün adına göre sıralama iĢlemi
yaptırılır. Daha Sonra Ürünlere göre altoplam alınır. Alttoplam modunda bütün toplamlar
sayfa 2 ye kopyalanır. Sayfa 1‟e geri gelerek alttoplam kaldırılır.
Sub UrunToplam()
Range("B2").Select
ActiveWorkbook.Worksheets("Sayfa1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sayfa1").Sort.SortFields.Add Key:=Range("B2"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sayfa1").Sort
.SetRange Range("A2:I52")
.Header = xlNo
.Apply
End With
Selection.Subtotal GroupBy:=2, Function:=xlSum, TotalList:=Array(8), _
Replace:=True, SummaryBelowData:=True
ActiveSheet.Outline.ShowLevels RowLevels:=2
Range("B:B,H:H").Select
Selection.SpecialCells(xlCellTypeVisible).Select
Selection.Copy
Sheets("Sayfa2").Select
Range("A1").Select
ActiveSheet.Paste
Sheets("Sayfa1").Select
Application.CutCopyMode = False
Range("A1").Select
Selection.RemoveSubtotal
End Sub
2. Üretici Firma Satış Tablosu
Tablonun C sütununda kayıtların Üretici Firma bilgisi mevcut. Üretici Firma adına göre
sıralama iĢlemi yaptırılır. Daha Sonra Üretici Firmaya göre altoplam alınır. Alttoplam
modunda bütün toplamlar sayfa 2 ye kopyalanır. Sayfa 1‟e geri gelerek alttoplam
kaldırılır.
Sub UreticiFirmaToplam()
Range("C2").Select
ActiveWorkbook.Worksheets("Sayfa1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sayfa1").Sort.SortFields.Add Key:=Range("C2"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sayfa1").Sort
.SetRange Range("A2:I52")
.Header = xlNo
.Apply
End With
Selection.Subtotal GroupBy:=3, Function:=xlSum, TotalList:=Array(8), _
Replace:=True, SummaryBelowData:=True
ActiveSheet.Outline.ShowLevels RowLevels:=2
Range("C:C,H:H").Select
Selection.SpecialCells(xlCellTypeVisible).Select
Selection.Copy
Sheets("Sayfa2").Select
Range("D1").Select
ActiveSheet.Paste
Sheets("Sayfa1").Select
Application.CutCopyMode = False
Range("A1").Select
Selection.RemoveSubtotal
End Sub
3. Aylık Satış Tablosu
Tablonun D sütununda kayıtların Ay bilgisi mevcut. Aylara göre sıralama iĢlemi
yaptırılır. Daha Sonra Aylara göre altoplam alınır. Alttoplam modunda bütün toplamlar
sayfa 2 ye kopyalanır. Sayfa 1‟e geri gelerek alttoplam kaldırılır.
Sub AylikToplam()
Range("D2").Select
ActiveWorkbook.Worksheets("Sayfa1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sayfa1").Sort.SortFields.Add Key:=Range("D2"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sayfa1").Sort
.SetRange Range("A2:I52")
.Header = xlNo
.Apply
End With
Selection.Subtotal GroupBy:=4, Function:=xlSum, TotalList:=Array(8), _
Replace:=True, SummaryBelowData:=True
ActiveSheet.Outline.ShowLevels RowLevels:=2
Range("D:D,H:H").Select
Selection.SpecialCells(xlCellTypeVisible).Select
Selection.Copy
Sheets("Sayfa2").Select
Range("G1").Select
ActiveSheet.Paste
Sheets("Sayfa1").Select
Application.CutCopyMode = False
Range("A1").Select
Selection.RemoveSubtotal
End Sub
Alttoplam aldığımız Ürünler Firmalar ve ayların toplam tablolarını sayfa2‟ye almıĢ olduk . Fakat
söyle bir sorunla karĢılaĢıyoruz. Bütün tanımların baĢına Toplam kelimesi eklenmiĢ. Ġngilizce
versiyonda bu Total olarak görünülür.
4. İsimler Düzenlenir
Sayfa2‟de oluĢan tablolarda Toplam kelimesini çıkartmak için bir modul yazılır. Ayrıca
Alttoplamdan dolayı tablolarımızın sonunda genel toplam satırı bulunmakdatır. Bu
satırlarıda silelim.
Sub Duzenle() Sheets("Sayfa2").Select
Range("A1").Select
Cells.Replace What:="Toplam ", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows
Range("A1").Select
Selection.End(xlDown).Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.ClearContents
Range("D1").Select
Selection.End(xlDown).Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.ClearContents
Range("G1").Select
Selection.End(xlDown).Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.ClearContents
End Sub
Resim 2
Duzenle modülünden sonraki görünüm.
5. Urunler Grafiği Oluşturulur
Artık Grafik oluĢturmak için verimiz hazır. Ürünlerin bulunduğu alan seçilerek grafik
oluĢturulur.
Sub UrunlerGrafigi() Range("A1").Select
Selection.CurrentRegion.Select
ActiveSheet.Shapes.AddChart.Select
ActiveChart.SetSourceData Source:=Range("Sayfa2!$A$1:$B$11")
ActiveChart.ChartType = xl3DPieExploded
ActiveChart.ApplyLayout (1)
ActiveChart.ChartTitle.Select
ActiveChart.ChartArea.Select
ActiveChart.Parent.RoundedCorners = True
ActiveChart.ChartTitle.Text = "Ürünler"
ActiveChart.ChartStyle = 45
End Sub
Resim 3
UrunlerGrafigi modülünden sonraki görünüm.
Resim 4
UreticiFirmalaGrafigi modülünden sonraki görünüm.
6. Firma Grafiği Oluşturulur
Firmaların bulunduğu alan seçilerek grafik oluĢturulur.
Sub UreticiFirmaGrafigi()
Range("D1").Select
Selection.CurrentRegion.Select
ActiveSheet.Shapes.AddChart.Select
ActiveChart.SetSourceData Source:=Range("Sayfa2!$D$1:$E$5")
ActiveChart.ChartType = xl3DPieExploded
ActiveChart.ApplyLayout (1)
ActiveChart.ChartTitle.Select
ActiveChart.ChartArea.Select
ActiveChart.Parent.RoundedCorners = True
ActiveChart.ChartTitle.Text = "Firmalar"
ActiveChart.ChartStyle = 44
End Sub
Resim 5
AylarGrafigi modülünden sonraki görünüm.
7. Aylık Grafik Oluşturulur
Ayların bulunduğu alan seçilerek grafik oluĢturulur.
Sub AylikGrafik()
Range("G1").Select
Selection.CurrentRegion.Select
ActiveSheet.Shapes.AddChart.Select
ActiveChart.SetSourceData Source:=Range("Sayfa2!$G$1:$H$13")
ActiveChart.ChartType = xl3DPieExploded
ActiveChart.ApplyLayout (1)
ActiveChart.ChartTitle.Select
ActiveChart.ChartArea.Select
ActiveChart.Parent.RoundedCorners = True
ActiveChart.ChartTitle.Text = "Aylar"
ActiveChart.ChartStyle = 48
End Sub
Resim 5
Basla modülünden sonraki görünüm.
8. Baslama Modülü Oluşturulur
Projemide Ģu anda kadar 4 modül oluĢturduk. Macro çalıĢırken diğer modüllerin
çalıĢtıracak Baslama modülü oluĢturalım.
Sub Basla() Sheets("Sayfa1").Select
UrunToplam
UreticiFirmaToplam
AylikToplam
Duzenle
UrunlerGrafigi
UreticiFirmaGrafigi
AylikGrafik
End Sub