You are on page 1of 111

SubyuiopasdfghjklzxcvbnmsMsgboxq

wertyuintegeropasdfghjklzSelectqwe
rtyuiopasdfghjklzxForcvbnmqwertyui
opasdfghjklzxcvbnmqwerOffcetpasdfg
hjklzxcvbnGototyuiopasdfghjklzxcvbn
erComboBoxfghjklzxcvbDimwertAsy
uiopasdfghjklActivecellszxcvbnmqwe
Excel Ġle Programlama
rtyuiopasdfghjklzxcvbnmqwertyuiote
(Visual Basic For Application)
xtboxpasdfghjklzxcvbnmqwertyOffset
uiopaInputboxsdfghjklzxSelecttertrtAc
DERS NOTLARI VE UYGULAMALARI

tiveworkbookmqwertyuiopTrimasVB
Adfghjklzxcsheetsvbnmqwertyuiopasd
jklzxcvBilgeadambqcomboRangebox
eIfrtyuiopasdfghjklRangezxcvbnmqw
ertyuiopActivecellssasdfghjklzxcvbFu
nctionnmqwerEndSubtyuiopasdfghjk
lzxcvbnmqwertyiopaExitSubsdfghjklz
xcvbnmqEndIFwertyuiopasdfghjklzxc
MAKROLAR HAKKINDA GENEL BILGI ............................................................................................................. 4
MAKRO ÇEġĠTLERĠ ..................................................................................................................................................... 4
MAKRO KAYDETMEK ................................................................................................................................................. 4
KAYIT MAKROSU ÖRNEĞĠ ......................................................................................................................................... 5
MAKROLARI ÇALIġTIRMAK ........................................................................................................................................ 7
MAKROYU DÜZENLEMEK .......................................................................................................................................... 7
MAKROLARDA GÜVENLĠK VE MAKRO AÇARKEN GELEN UYARI.................................................................................. 8
SAYISAL ĠMZALAR HAKKINDA ................................................................................................................................... 8
VISUAL BASIC FOR APPLICATION‟DA OPERATÖRLER ............................................................................. 9
ARĠTMETĠKSEL OPERATÖRLER ................................................................................................................................. 10
KARġILAġTIRMA OPERATÖRLERĠ ............................................................................................................................. 12
MANTIKSAL OPERATORLER ..................................................................................................................................... 14
VBA PROGRAMLAMA YAPILARI ...................................................................................................................... 15
DEGISKENLER .......................................................................................................................................................... 15
KAÇ TÜRLÜ DEĞĠġKEN VARDIR VE NEREDE TANIMLANIR. ..................................................................................... 15
Local ve Global Değişken................................................................................................................................... 16
Costants(Sabitler) Değişken Tanımlama ............................................................................................................ 19
KOġUL ġART YAPILARI ............................................................................................................................................ 20
If…End If ............................................................................................................................................................ 20
End SubSelect Case ............................................................................................................................................ 22
Select Case.......................................................................................................................................................... 23
DÖNGÜLER ............................................................................................................................................................... 24
For … next .......................................................................................................................................................... 24
For each… next .................................................................................................................................................. 28
Do while… loop .................................................................................................................................................. 30
Do while… loop .................................................................................................................................................. 30
Do… loop while .................................................................................................................................................. 30
Do until… loop ................................................................................................................................................... 31
Do… loop until ................................................................................................................................................... 31
Goto döngüsü...................................................................................................................................................... 35
FUNCTĠON PROSEDÜRLER ........................................................................................................................................ 36
Döngü ve karar yapılarının kullanıldığı basit uygulamalar ............................................................................... 40
DĠZĠLER .................................................................................................................................................................... 43
EXCEL ĠLE PROGRAMLAMAYA GIRIġ ............................................................................................................ 45
WĠTH-END WĠTH ..................................................................................................................................................... 52
HÜCRE ĠÇĠNĠ OTOMATĠK DOLDURMAK .................................................................................................................... 53
HÜCREYE RASTGELE SAYI ATAMAK........................................................................................................................ 54
BAġKA PROGRAMLARI ÇAĞIRMAK .......................................................................................................................... 55
AKTĠF ÇALIġMA KĠTABINI KAYDETMEK .................................................................................................................. 55
AKTĠF ÇALIġMA KĠTABINI KAPATMAK .................................................................................................................... 56
YENĠ ÇALIġMA KĠTABI EKLEMEK .............................................................................................................................. 56
ÇALIġMA KĠYABINA YENĠ SAYFA EKLEMEK ............................................................................................................ 58
OFFSET..................................................................................................................................................................... 64
MESAJBOX ............................................................................................................................................................... 67
USER FORM VE ÖZELLIKLERI .......................................................................................................................... 68
1.FORM : COOMMANDBUTTON VE TEXTBOX‟I TANIMA ........................................................................................... 69
2. FORM : OYUN MAKĠNASI ....................................................................................................................................... 70
3. FORM : HESAP MAKĠNASI ...................................................................................................................................... 71
4. FORM : KAYIT FORMU .......................................................................................................................................... 74
MICROSOFT ACCESS BAĞLANTISI .................................................................................................................. 82
GRAFIK OLUġTURMAK........................................................................................................................................ 89

BilgeAdam Sayfa 2
VAW ÇALMAK......................................................................................................................................................... 89
OFFICE YARDIMCISINI ÇAĞIRMAK ................................................................................................................ 90
API‟LER (APPLICATION PROGRAMMING INTERFACE) ............................................................................ 91
PROJE-1 (ÜRÜNLERĠ SAYFALARA BÖLMEK) ................................................................................................ 92
1. ÜRÜN LĠSTESĠ ÇIKARILIR ............................................................................................................................... 93
2. VERĠLER FĠTRELENĠR VE SAYFALARA KOPYALANIR ...................................................................................... 94
3. ÜRÜN TOPLAMLARI ALINIR ............................................................................................................................ 95
4. BASLAMA MODÜLÜ OLUġTURULUR ............................................................................................................... 96
PROJE -2 (RAPORDAN TABLO OLUġTURMAK) ............................................................................................. 97
1. BAġLIKLAR YAZDIRILIR ................................................................................................................................. 98
2. TÜRE GÖRE VERĠ TOPLAMLARI ...................................................................................................................... 99
3. SIRALAMA MODÜLÜ ..................................................................................................................................... 100
4. BÖLGELERE GÖRE TOPLAM .......................................................................................................................... 101
5. BASLAMA MODÜLÜ OLUġTURULUR ............................................................................................................. 102
PROJE -3 (GRAFĠK RAPOR OLUġTURMAK).................................................................................................. 103
1. ÜRÜN SATIġLARI TABLOSU .......................................................................................................................... 104
2. ÜRETĠCĠ FĠRMA SATIġ TABLOSU ................................................................................................................... 105
3. AYLIK SATIġ TABLOSU ................................................................................................................................. 106
4. ĠSĠMLER DÜZENLENĠR ................................................................................................................................... 107
5. URUNLER GRAFĠĞĠ OLUġTURULUR ............................................................................................................... 108
6. FĠRMA GRAFĠĞĠ OLUġTURULUR .................................................................................................................... 109
7. AYLIK GRAFĠK OLUġTURULUR ..................................................................................................................... 110
8. BASLAMA MODÜLÜ OLUġTURULUR ............................................................................................................. 111

BilgeAdam Sayfa 3
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.

BilgeAdam Sayfa 4
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

BilgeAdam Sayfa 5
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

BilgeAdam Sayfa 6
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.

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

BilgeAdam Sayfa 8
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.

BilgeAdam Sayfa 9
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

BilgeAdam Sayfa 10
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

BilgeAdam Sayfa 11
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

BilgeAdam Sayfa 12
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

BilgeAdam Sayfa 13
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

BilgeAdam Sayfa 14
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.

BilgeAdam Sayfa 15
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

BilgeAdam Sayfa 16
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

BilgeAdam Sayfa 17
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

BilgeAdam Sayfa 18
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

BilgeAdam Sayfa 19
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

BilgeAdam Sayfa 20
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

BilgeAdam Sayfa 21
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

BilgeAdam Sayfa 22
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

BilgeAdam Sayfa 23
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

BilgeAdam Sayfa 24
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

BilgeAdam Sayfa 25
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

BilgeAdam Sayfa 26
 Ġç 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

BilgeAdam Sayfa 27
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

BilgeAdam Sayfa 28
 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

BilgeAdam Sayfa 29
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

BilgeAdam Sayfa 30
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

BilgeAdam Sayfa 31
BilgeAdam Sayfa 32
 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

BilgeAdam Sayfa 33
 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

BilgeAdam Sayfa 34
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

BilgeAdam Sayfa 35
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

BilgeAdam Sayfa 36
 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

BilgeAdam Sayfa 37
 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

BilgeAdam Sayfa 38
 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

BilgeAdam Sayfa 39
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

BilgeAdam Sayfa 40
 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

BilgeAdam Sayfa 41
 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

BilgeAdam Sayfa 42
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.

BilgeAdam Sayfa 43
 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

BilgeAdam Sayfa 44
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

BilgeAdam Sayfa 45
 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

BilgeAdam Sayfa 46
 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

BilgeAdam Sayfa 47
 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

BilgeAdam Sayfa 48
 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

BilgeAdam Sayfa 49
 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

BilgeAdam Sayfa 50
 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

BilgeAdam Sayfa 51
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

BilgeAdam Sayfa 52
 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

BilgeAdam Sayfa 53
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

BilgeAdam Sayfa 54
 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

BilgeAdam Sayfa 55
 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

BilgeAdam Sayfa 56
 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

BilgeAdam Sayfa 57
 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

BilgeAdam Sayfa 58
 Ç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

BilgeAdam Sayfa 59
 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

BilgeAdam Sayfa 60
 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

BilgeAdam Sayfa 61
 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

BilgeAdam Sayfa 62
 Ġ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

BilgeAdam Sayfa 63
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

BilgeAdam Sayfa 64
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

BilgeAdam Sayfa 65
 ġ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.

BilgeAdam Sayfa 66
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

BilgeAdam Sayfa 67
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

BilgeAdam Sayfa 68
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

BilgeAdam Sayfa 69
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

BilgeAdam Sayfa 70
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

BilgeAdam Sayfa 71
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

BilgeAdam Sayfa 72
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

BilgeAdam Sayfa 73
4. form : Kayıt Formu
 Forma eklenen nesneler ve nesnelerde yapılan değiĢiklik bilgilerinin tablosu

BilgeAdam Sayfa 74
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

BilgeAdam Sayfa 75
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

BilgeAdam Sayfa 76
 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.

BilgeAdam Sayfa 77
 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

BilgeAdam Sayfa 78
 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

BilgeAdam Sayfa 79
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

BilgeAdam Sayfa 80
 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.

BilgeAdam Sayfa 81
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.

BilgeAdam Sayfa 82
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

BilgeAdam Sayfa 83
 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

BilgeAdam Sayfa 84
 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

BilgeAdam Sayfa 85
 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

BilgeAdam Sayfa 86
 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

BilgeAdam Sayfa 87
 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

BilgeAdam Sayfa 88
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

BilgeAdam Sayfa 89
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

BilgeAdam Sayfa 90
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

BilgeAdam Sayfa 91
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.

Resim 1

Ürün SatıĢlarını gösteren kaynak tablo

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

BilgeAdam Sayfa 92
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.

BilgeAdam Sayfa 93
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 3

VerileriKopyala Modülü sonrasında ki görünüm.

BilgeAdam Sayfa 94
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 4

UrunToplamlariAl Modülü sonrasında ki görünüm.

BilgeAdam Sayfa 95
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.

Resim 5

Ürün Rapor iĢeminden sonra ki görünüm.

BilgeAdam Sayfa 96
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ı.

Resim 1

MüĢteri Toplam ve BölgeToplamlarını gösteren kaynak tablo.

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.

BilgeAdam Sayfa 97
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.

BilgeAdam Sayfa 98
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

BilgeAdam Sayfa 99
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.

BilgeAdam Sayfa 100


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.

BilgeAdam Sayfa 101


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.

BilgeAdam Sayfa 102


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

Resim 6

Ürün SatıĢlarını gösteren kaynak tablo

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

BilgeAdam Sayfa 103


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

BilgeAdam Sayfa 104


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

BilgeAdam Sayfa 105


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.

BilgeAdam Sayfa 106


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.

BilgeAdam Sayfa 107


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.

BilgeAdam Sayfa 108


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 4

UreticiFirmalaGrafigi modülünden sonraki görünüm.

BilgeAdam Sayfa 109


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

AylarGrafigi modülünden sonraki görünüm.

BilgeAdam Sayfa 110


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

Resim 5

Basla modülünden sonraki görünüm.

BilgeAdam Sayfa 111

You might also like