excel makro · diziler irden fazla değeri ir değişken üzerinde tutmak ve unlara ir index vermek...

19
Excel Makro MAKROLARA GİRİŞ 1 Değişkenler (Variables) Dim degisken_adi as type Dim sayi as integer Sayı adında tam sayı bir değişken tanımlar. Integer değişken tipi 2 byte’tır ve -32.768 ile 32.767 arasında değerler alabilir. Ek-A daki listede diğer değişken tiplerinin de özellikleri verilmiştir. VBA ‘in anahtar sözcükleri kullanmayın. Maksimum uzunluk 255 karakterdir. İlk karakterin bir harf olması gerekir. Değişkenin ismi nokta, boşluk yada ! @ # & veya $ içeremez. Mantıksal değişken tanımlama Dim bugunhaftaicimi as Boolean Bugunhaftaicimi=true Tarihsel değişken tanımlama Dim d1, d2, d3 as date d1=# 01/01/1999 # 2 Sabitler (Const) Const sabit_adi as Type=değer Const sayi as double=0.055 Const yol=”c:\deneme.xls” Sabit için type belirtmezseniz, VBA seçtiğiniz değere en uygun değişken tipini kullanır. İsimlendirme kuralları değişken tanımlamada kullanılan kurallar ile aynıdır. 3 Diziler Dim dizi(10) as string Dim ikiboyutlu(10,5) as integer

Upload: phamnhu

Post on 05-May-2019

237 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Excel Makro · Diziler irden fazla değeri ir değişken üzerinde tutmak ve unlara ir index vermek için kullanılır. VBA da diziler 0 dan aşlar. Örneğin 10 genişlikli ir dizinin

Excel Makro

MAKROLARA GİRİŞ

1 Değişkenler (Variables)

Dim degisken_adi as type

Dim sayi as integer

Sayı adında tam sayı bir değişken tanımlar. Integer değişken tipi 2 byte’tır ve -32.768 ile 32.767

arasında değerler alabilir. Ek-A daki listede diğer değişken tiplerinin de özellikleri verilmiştir.

VBA ‘in anahtar sözcükleri kullanmayın.

Maksimum uzunluk 255 karakterdir.

İlk karakterin bir harf olması gerekir.

Değişkenin ismi nokta, boşluk yada ! @ # & veya $ içeremez.

Mantıksal değişken tanımlama

Dim bugunhaftaicimi as Boolean

Bugunhaftaicimi=true

Tarihsel değişken tanımlama

Dim d1, d2, d3 as date

d1=# 01/01/1999 #

2 Sabitler (Const)

Const sabit_adi as Type=değer

Const sayi as double=0.055

Const yol=”c:\deneme.xls”

Sabit için type belirtmezseniz, VBA seçtiğiniz değere en uygun değişken tipini kullanır. İsimlendirme

kuralları değişken tanımlamada kullanılan kurallar ile aynıdır.

3 Diziler

Dim dizi(10) as string

Dim ikiboyutlu(10,5) as integer

Page 2: Excel Makro · Diziler irden fazla değeri ir değişken üzerinde tutmak ve unlara ir index vermek için kullanılır. VBA da diziler 0 dan aşlar. Örneğin 10 genişlikli ir dizinin

Diziler birden fazla değeri bir değişken üzerinde tutmak ve bunlara bir index vermek için kullanılır.

VBA da diziler 0 dan başlar. Örneğin 10 genişlikli bir dizinin 0...10 a kadar 11 elemanı olabilir.

4 Kontrol deyimleri

if...........then.........else yapısı

if then else yapısı en sık kullanılan kontrol bloklarındandır. Temelde program içersinde karar vermeyi

sağlar. AND, OR, NOT, XOR gibi yardımcı ifadelerle de güçlendirilir.

if koşu1 then

işlemler

elseif koşul2 then

işlemler

else

işlemler

end if

Örnek

if not<45 then

durum=”KALDI”

elseif not>=45 and <70

durum=”ORTA”

elseif not>=70 and not<85 then

durum=”İYİ”

else

durum=”ÇOK İYİ”

end if

Select case yapısı

if then else yapısında oluşturulduğunda karmaşaya yola açabilecek yada daha uzun yazmak

gerektiğinde select case yapısı if then else yapısının yerine geçer ve işlemleri basitleştirirek

yazılmasını kısaltır.

Select case değişken

Page 3: Excel Makro · Diziler irden fazla değeri ir değişken üzerinde tutmak ve unlara ir index vermek için kullanılır. VBA da diziler 0 dan aşlar. Örneğin 10 genişlikli ir dizinin

Case koşul1

İşlemler

Case koşul2

İşlemler

Case else

İşlemler

End select

Örnek

Dim not as integer

not=inputbox(“Öğrencinin Notunu Giriniz”,”Not Girişi”)

select case not

case not <45

msgbox “KALDI”

case not>=45 and not<70

msgbox “ORTA”

case not>=70 and not<85

msgbox “İYİ”

case else

msgbox “ÇOK İYİ”

end select

5 Döngüler

For next döngüsü

Çok fazla tekrarlanan işlemleri döngüler yardımıyla daha az kod ile yazarız. For next döngüsü bir

değişken kullanarak tekrarlanan işlemler yapar.

Toplam=0

For i=1 to 5

Toplam=toplam+i^2

Next i

Page 4: Excel Makro · Diziler irden fazla değeri ir değişken üzerinde tutmak ve unlara ir index vermek için kullanılır. VBA da diziler 0 dan aşlar. Örneğin 10 genişlikli ir dizinin

Msgbox toplam

i i2 Toplam

1 1 1

2 4 5

3 9 14

4 16 30

5 25 55

Not: for i=5 to 1 step -1 olsaydı 1 azalarak döngü dönerdi.

Do while döngüsü

Bir koşula bağlı olarak tekrarlı işlemleri yapmak için kullanılan döngülerdir. Koşul sağlandığı sürece

işlemler yapılır. Koşul sağlanmasa bile While ifadesi şayet loop un yanında ise döngü en az bir kez

döner.

i=0

Do while i<=5

i=i+1

Toplam=toplam+i^2

Loop

----------------------------------------------------

Toplam=0

i=5

do

i=i-1

toplam=toplam+i^2

loop while i>5

Yukarıdaki döngü sadece bir kez döner ve toplam=16 çıkar.

Do until döngüsü

Koşul sağlanana kadar işlemler yapılır. Koşul sağlanmasa bile until ifadesi şayet loop un yanında ise

döngü en az bir kez döner.

Page 5: Excel Makro · Diziler irden fazla değeri ir değişken üzerinde tutmak ve unlara ir index vermek için kullanılır. VBA da diziler 0 dan aşlar. Örneğin 10 genişlikli ir dizinin

i=0

Do until i=5

i=i+1

Toplam=toplam+i^2

Loop

Msgbox toplam

----------------------------------------------------

Toplam=0

i=5

do

i=i-1

toplam=toplam+i^2

loop until i=4

Yukarıdaki döngü sadece bir kez döner ve toplam=16 çıkar.

6 MSGBOX kullanımı

Msgbox kullanıcıya mesaj vermek için kullanılır. Aşağıdaki Yapıda Yazılır.

Msgbox (Mesaj, Parametre1+Paremetre2+Parametre3, Başlık)

Parametre1: Mesaj kutusundaki simgenin ne olacağını belirler. (VbInformation, VbQuestion vb..)

Parametre2: Mesaj kutusundaki Butonların stilini belirler (VbYesNo, VbOkCancel, VbOkOnly vb..)

Parametre3: Mesaj kutusundaki butonlardan hangisinin ilk açılışta varsayılan buton olacağını belirler.

(VbDefaultbutton1, VbDefaultButton2 vb..)

Örnek

Bir form üzerinde çalışıldığında programı bir mesaj ile kullanıcıya sorarak sonlandırır.

Private Sub CommandButton6_Click()

cevap = MsgBox("Çıkmak İstediğinizden Emin misiniz?", vbQuestion + vbYesNo + vbDefaultButton2,

"Çıkış")

If cevap = vbYes Then

End

Page 6: Excel Makro · Diziler irden fazla değeri ir değişken üzerinde tutmak ve unlara ir index vermek için kullanılır. VBA da diziler 0 dan aşlar. Örneğin 10 genişlikli ir dizinin

End If

End Sub

Not: Daha fazla bilgi için Ek-B den yararlanabilirsiniz...

7 INPUTBOX kullanımı

İnputbox kullanıcıya bir mesaj vererek kullanıcıdan bir değer almayı sağlar ve bu değeri bir değişkene

aktarır.

Değişken=inputbox(Mesaj, Başlık, İfade)

not= inputbox (“Bir not giriniz”,”Not Girişi”,”Buraya Not Yazın”)

if not<45 then

durum=”kaldı”

else

durum=”geçti”

end if

WORKBOOKS

Çalışma Kitabı nesnesidir. Bir VBA dilinde yada Visual Basicte program yazarken workbooks nesnesi

çalışma kitaplarını gösterir.

Bir Workbook oluşturmak ve eklemek

Private Sub CommandButton1_Click()

Dim Workbook1 As Workbook

Dim Workbook2 As Workbook

Set Workbook1 = Workbooks.Add

Set Workbook2 = Workbooks.Add

Workbook1.Activate

End Sub

Private Sub CommandButton13_Click()

Dim sayfam As Excel.Worksheet

Set sayfam = Worksheets.Add()

End Sub

Page 7: Excel Makro · Diziler irden fazla değeri ir değişken üzerinde tutmak ve unlara ir index vermek için kullanılır. VBA da diziler 0 dan aşlar. Örneğin 10 genişlikli ir dizinin

Bir workbook nesnesi açmak

Private Sub CommandButton4_Click()

Dim Workbook1 As Workbook

Set Workbook1 = Workbooks.Open(FileName:="C:\book1.xls")

MsgBox Workbook1.Name

End Sub

Private Sub CommandButton2_Click()

Dim Workbook1 As Workbook

Set Workbook1 = Workbooks.Add(Template:="C:\book1.xls")

End Sub

Daha önceden kaydedilmiş bir workbook açar ve A1 hücresine bugünün tarihini formatlayarak

girer.

Private Sub CommandButton10_Click()

Dim Workbook1 As Workbook

Set Workbook1 = Workbooks.Open(FileName:="c:\book1.xls")

Range("A1").Value = Format(Date, "ddd mmm dd, yyyy")

Range("A1").EntireColumn.AutoFit

Workbook1.Close SaveChanges:=True

End Sub

Bir workbook nesnesini kapatmak

Private Sub CommandButton5_Click()

ActiveWorkbook.Close

End Sub

Work book nesnesini kaydetmek, ancak aynı isimle daha önceden var ise dosya sonuna bir sonraki

dosya sayısını atar.

Private Sub CommandButton9_Click()

Dim Workbook1 As Workbook

Dim i As Integer

Page 8: Excel Makro · Diziler irden fazla değeri ir değişken üzerinde tutmak ve unlara ir index vermek için kullanılır. VBA da diziler 0 dan aşlar. Örneğin 10 genişlikli ir dizinin

Dim FileName As String

Set Workbook1 = Workbooks.Add(Template:=ThisWorkbook.Path & "\book1.xls")

i = 0

Do

i = i + 1

FileName = ThisWorkbook.Path & "\book1.xls" & i & ".xls"

Loop While FileExists(FileName)

Workbook1.SaveAs FileName:=FileName

End Sub

Work book nesnesini aynı isimli diğer dosya üzerine kaydetmek

Private Sub CommandButton7_Click()

Dim Workbook1 As Workbook

Set Workbook1 = Workbooks.Add

Application.DisplayAlerts = False

Workbook1.SaveAs FileName:=ThisWorkbook.Path & "\book1.xls"

Application.DisplayAlerts = True

End Sub

Workbook klasör içinde daha önceden kaydedilmiş mi?

Private Sub CommandButton8_Click()

Dim FileName As String

FileName = ThisWorkbook.Path & "\book1.xls"

If FileExists(FileName) Then

MsgBox FileName & " daha önce kaydedilmiş"

Else

MsgBox FileName & " kaydedilmemiş"

End If

End Sub

Page 9: Excel Makro · Diziler irden fazla değeri ir değişken üzerinde tutmak ve unlara ir index vermek için kullanılır. VBA da diziler 0 dan aşlar. Örneğin 10 genişlikli ir dizinin

WORKSHEETS

Worksheetlerin index numaralarının mesaj ile gösterilmesi.

Private Sub CommandButton11_Click()

Dim i As Integer

For i = 1 To ThisWorkbook.Worksheets.Count

MsgBox Worksheets(i).Name & " has Index = " & ThisWorkbook.Worksheets(i).Index

Next i

End Sub

Girilen isimdeki çalışma sayfasını siler.

Private Sub CommandButton12_Click()

sayfaadi = InputBox("Bir Çalışma Sayfası Adı Giriniz", "Çalışma Sayfası Silme", "")

Application.DisplayAlerts = False

ActiveWorkbook.Worksheets(sayfaadi).Delete

Application.DisplayAlerts = True

End Sub

Girilen isimdeki çalışma sayfasını kopyalar.

Private Sub CommandButton14_Click()

sayfaadi = InputBox("Bir Çalışma Sayfası Adı Giriniz", "Çalışma Sayfası Kopyalama", "")

ActiveWorkbook.Worksheets(sayfaadi).Copy after:=Worksheets(Worksheets.Count)

End Sub

RANGE

B3 ten E10 a kadar olan aralığı seçer. C5 hücresini aktif eder.

Private Sub CommandButton15_Click()

Range("B3:E10").Select

Range("C5").Activate

End Sub

Aktif çalışma sayfasının A1:A10 hücre aralığındaki değerlerin toplamını mesajlar.

Page 10: Excel Makro · Diziler irden fazla değeri ir değişken üzerinde tutmak ve unlara ir index vermek için kullanılır. VBA da diziler 0 dan aşlar. Örneğin 10 genişlikli ir dizinin

Private Sub CommandButton16_Click()

MsgBox WorksheetFunction.Sum(ActiveWorkbook.ActiveSheet.Range("A1:A10"))

End Sub

Range Nesnesi üreten özellik ve metodlar

ActiveCell Etkin hücre (Application, Window nesnelerinde)

Currentregion En yakındaki boş satırlar, boş sütunlar ve çalışma sayfası kenarıyla sınırlanan ancak

bunların dahil olmadığı bir aralık. (Range nesnesinde)

Dim rng as range

Rng=ActiveCell.CurrentRegion

Selectionà Geçerli seçim (Application, Window nesnelerinde)

UsedrangeàÇalışma sayfasındaki kullanılan bütün hücreleri içeren en küçük dikdörtgen alan (Ws

nesnesinde)

SpecialCellsàBelirtilen tip ve değerle eşleşen bütün hücreleri seçmeyi sağlar. (Range nesnesinde)

SpecialCells metodu için

Rng.SpecialCells(Type, Value)

Type zorunludur. Value ihmal edilebilir. Value ihmal edilirse tiplerine bakmadan bütün hücreler için

seçme işlemi geçerli olur.

Type Argumanları

xlCellTypeAllFormatConditionsàHerhangi bir formattaki hücreler.

xlCellTypeAllValidationàGeçerlilik denetimi ölçütleri içeren hücreler.

xlCellTypeBlanksàBoş Hücreler

xlCellTypeCommentsàNot içeren hücreler

xlCellTypeConstantsàSabit (sayı yada metin) içeren hücreler

xlCellTypeFormulasàFormül içeren hücreler

xlCellTypeLastCellàKullanılan aralıktaki en son hücre

xlCellTypeSameFormatConditionsàAynı formata sahip hücreler

xlCellTypeSameValidationàAynı geçerlilik denetimine sahip hücreler

xlCellTypeVisibleàGörünür durumdaki hücreler.

Value Argumanları

Page 11: Excel Makro · Diziler irden fazla değeri ir değişken üzerinde tutmak ve unlara ir index vermek için kullanılır. VBA da diziler 0 dan aşlar. Örneğin 10 genişlikli ir dizinin

xlErrorsàHatalı formül hücreleri

xlLogicalàMantıksal formüller içeren hücreler

xlTextValuesàMetin içeren hücreler

xlNumbersàSayı içeren hücreler

Etkin hücreyi çevreleyen geçerli bölge içinde metin bulunan bütün hücrelerin içeriğini siler.

Private Sub CommandButton17_Click()

Dim r As Range

Worksheets("deneme").Activate

Set r = ActiveCell.CurrentRegion

r.SpecialCells(xlCellTypeConstants, xlTextValues).Value = ""

End Sub

Selection özelliği kullanımı

Sub secme()

Dim rng As Range

Set rng = Application.Selection

adres = rng.Address

MsgBox adres

End Sub

Range.Range Kullanımı

Private Sub CommandButton19_Click()

Dim range3 As Range

Dim range4 As Range

Set range3 = Worksheets("deneme").Range("b2")

Set range4 = range3.Range("c4")

'b2 den dolayı c5 hücresini gösterir. b2 yi ilk hücre yani a1 kabul eder

End Sub

Range nesnesinin Offset Özelliği ile Union ve Intersect metodları

Page 12: Excel Makro · Diziler irden fazla değeri ir değişken üzerinde tutmak ve unlara ir index vermek için kullanılır. VBA da diziler 0 dan aşlar. Örneğin 10 genişlikli ir dizinin

Offset belli bir satır veya sütun kadar öteleme sağlar. Range.Range özelliğinden farklı olarak Alfa

numerik öteleme yerine sayısal bir öteleme avantajı sağlar.

Worksheets(“sheet1”).Activate

ActivateCell.Offset(ColumnOffset:=3).Activate

Union ile birden fazla range birleştirilir. Böylece union metodu kullanılmış range ler üzerinde bir işlem

aynı anda yapılabilir.

Dim r1 as range

Set r1=union(range(“a1:b2”), range(“b2:c4”))

r1.value=”Merhaba”

Yukarıda a1:b2 ve b2:c4 içeren birleştirilmiş aralık içersine merhaba mesajını koyar.

Intersect iki yada daha fazla aralığın kesişen hücreleri üzerinde işlem yapmayı sağlar.

Dim r1 as range

Set r1=intersect(Range(“a1:b2”), range(“b2:c4”))

r1.value=”Merhaba”

Sadece b2 hücresine Merhaba yazar.

CELLS

Cells özelliğinin kullanımı

Worksheets.Cells(5,5)

Worksheets.Cells.item(5,5)

B1:B10 aralığındaki hücreleri 10,20,30 .... 100 değerleriyle doldurur.

Dim i as integer

For i=1 to 10

Worksheets(“sheet1”).Cells(2,i).Value=i*10

Cells ifadesi kullanarak içiçe fordöngüsü ile 10,5 matris oluşturup içlerine i ve j nin çarpımını koyar.

Yani 10x5 lik çarpım tablosu oluşturur.

Private Sub CommandButton18_Click()

Dim i As Integer, j As Integer

For i = 1 To 10

For j = 1 To 5

Page 13: Excel Makro · Diziler irden fazla değeri ir değişken üzerinde tutmak ve unlara ir index vermek için kullanılır. VBA da diziler 0 dan aşlar. Örneğin 10 genişlikli ir dizinin

Cells(i, j).Value = i * j

Next j

Next i

End Sub

Cells özelliğini kullanarak etkin hücre etrafındaki dolu hücrelere bakar ve 45 ten küçük olanları

kırmızı diğerlerini yeşil olarak işaretler.

Dim row As Integer, col As Integer

Dim r As Range

Set r = ActiveCell.CurrentRegion

For row = 1 To r.Width

For col = 1 To r.Height

If r.Cells(row, col) < 45 Then

r.Cells(row, col).Font.Color = RGB(255, 0, 0)

Else

r.Cells(row, col).Font.Color = RGB(0, 255, 0)

End If

Next col

Next row

Aralıkların adlandırılması

Dim r As Range

Set r=Range(“A2”)

r.name=”rng”

range(“rng”).value=12

adresgoster=range(“rng”).adress

msgbox adresgoster

Çalışma Sayfasının İçeriğini Yönetmek

Range(“A1”).Value=12

Range(“A2”).Value=15

Page 14: Excel Makro · Diziler irden fazla değeri ir değişken üzerinde tutmak ve unlara ir index vermek için kullanılır. VBA da diziler 0 dan aşlar. Örneğin 10 genişlikli ir dizinin

Range(“A3”).Value=”=A1+A2”

Range(“A4”).Value=”=topla(“a1:a2)”

v=Range(“A3”).Value

f=Range(“A3”).Formula

Range nesnesinin metodları

FONKSİYONLAR

1 Sık Kullanılan Fonksiyonlar

Tarih ve saat fonksiyonları, tarih ve saat (zaman) bilgisinin elde edilmesi ve işlenmesini sağlar.

DATE Fonksiyonu:

Excel'de her güne bir seri numarası verilir. DATE fonksiyonu belirtilen bir tarihin (günü) seri

numarasını verir.

=DATE(yıl, ay, gün)

=TARİH(yıl, ay, gün)

Sonucunda o tarihin numarası elde edilir.

TODAY Fonksiyonu:

Bulunulan günü verir. Genellikle sistem tarihinden gün bilgisini alarak işlem yapıldığında kullanılır.

=TODAY() - "1/1/2001"

= BUGÜN()

Yukarıdaki ifade ile bugün ile yıl sonu arasında kaç gün olduğu hesaplanır.

TIME Fonksiyonu:

Zamanın seri numarası olarak karşılığını verir. Bir günün başlangıç anı 0 ile, bitiş anı da 0.9999 değeri

ile ifade edilir.

=TIME(saat, dakika, saniye)

Sonucunda o zaman değerinin numarası elde edilir.

NOW Fonksiyonu:

O anki zamanı tarih ve zaman olarak verir. Diğer bir deyişle o anki zamanı gün, ay, yıl ve saat olarak

verir.

=NOW()

= ŞİMDİ()

Page 15: Excel Makro · Diziler irden fazla değeri ir değişken üzerinde tutmak ve unlara ir index vermek için kullanılır. VBA da diziler 0 dan aşlar. Örneğin 10 genişlikli ir dizinin

Sonucunda o anın değeri elde edilir.

INT Fonksiyonu:

Belirtilen bir sayıyı tam sayıya yuvarlar.

=INT(2.34)

Sonucu: 2

=TAMSAYI()

Örneğin rastgele üretilen bir değeri tamsayıya çevirmek için:

=INT(RAND()+1)

Sayısal loto sayısı üretmek:

=TAMSAYI((S_SAYI_ÜRET()*49)+1)

PRODUCT Fonksiyonları

Verilen sayıları çarpar.

=PRODUCT(3,7)

ya da

=ÇARPIM(3,7)

Sonucu: 21

RAND Fonksiyonu:

0 ile 1 arasında rastgele bir sayı üretir.

=S_SAYI_ÜRET()

=RAND()

RAND() fonksiyonu 0 ile 1 arasında bir gerçek bir sayı üretir. Bu nedenle genellikle bir sayı ile çarpılır

ve tamsayıya çevrilerek kullanılır.

=Int(Rnd(1) * 49) + 1

Yukarıdaki fonksiyon her çalıştığında 1 ila 48 arasında bir sayı üretir.

ROUND Fonksiyonu

Tanımlanan bir sayıyı belirtilen ondalık uzunluğa yuvarlar.

=ROUND(sayı, hane sayısı)

=ROUND(42.789, 1)

Page 16: Excel Makro · Diziler irden fazla değeri ir değişken üzerinde tutmak ve unlara ir index vermek için kullanılır. VBA da diziler 0 dan aşlar. Örneğin 10 genişlikli ir dizinin

=YUVARLA(42.789, 1)

Sonucu: 42.72

EXCEL'in en yaygın kullanıldığı alanlardan birisi de finanstır (mali işler). Çok

sayıda finansal fonksiyonun kullanımını öğrenerek mevcut ticari işlemlerinizi kolaylaştırabilir ya da

yeni çözümler ve uygulamalar yapabilirsiniz.

PMT Fonksiyonu:

En yaygın kullanılan finansal (mali) fonksiyondur. Payment (ödeme) fonksiyonu, belli bir faiz oranı

üzerinden n dönem sonunda gerçekleşecek nakit girişi ya da çıkışını hesaplar.

=PMT(ana para, faiz, süre)

Örnek: Yıllık %90 faizle 400 milyon liralık malı 12 ay taksitle almak için ne kadar ödeme yapmanız

gerekir?

=PMT(%90/12;12;-400000000)

2 Kullanıcı Tanımlı Fonksiyonlar

Excel'de bir çok Yerleşik Fonksiyon mevcuttur. Fakat bunlar bazen yapmak istediğiniz işi

görmeyebilirler. Belki de siz kendinize özel bir program hazırlamak istiyorsunuz ve burada kullanmak

istediğiniz bir fonksiyon Excel'de yok. O halde kendi Fonksiyonunuzu hazırlamalı ve Excel Çalışma

Sayfasında kullanılabilir hale getirmelisiniz. İşte bu hazırladığınız fonksiyona Kullanıcı Tanımlı

Fonksiyon denmektedir.

Ama bu o kadar da kolay bir iş değil. Öncelikle VBA kodlamanın ne olduğunu ve nasıl yapıldığını

bilmelisiniz. Eğer bu sayfada iseniz ve bu satırları merakla okuyorsanız, demek ki bu konu hakkında

biraz da olsa bilginiz var.

Şimdi kullanıcı tanımlı fonksiyon nasıl hazırlanır, bunun ön bilgilerini verelim.

... Öncelikle şunu bilmelisiniz ki, bu tür fonksiyonları hangi Çalışma kitabında hazırlayıp

kaydetmişseniz, ancak o Çalışma Kitabında kullanabilirsiniz.

... Bir çalışma kitabı açın ve bu kitabı kaydedin.

... Daha sonra VBA Kod sayfasına geçin.

... Yeni bir Modül açın.

... Yazmak istediğiniz fonksiyonu

Function fonksiyonun_adı (fonksiyonda kullanılan değişkenler)

End Function

bloğu arasına yazın.

... Hazırladığınız fonksiyonu kaydedin. (Bir çok kullanıcı bu işlemi yapmadan çalıştırmaya çalışıyor.

Tabi ki, yapamıyor, önce kayıt işlemi yapılmalı, daha sonra çalıştırılacak)

... Excel Çalışma Sayfasına geçin ve fonksiyonunuzu kullanmaya başlayın.

Aşağıda sizin için basit bir örnek olsun diye böyle bir Kullanıcı Tanımlı Fonksiyon hazırladık. Siz de

bunu uygulamaya geçerek işe başlayabilirsiniz.

Örnek 1:

Page 17: Excel Makro · Diziler irden fazla değeri ir değişken üzerinde tutmak ve unlara ir index vermek için kullanılır. VBA da diziler 0 dan aşlar. Örneğin 10 genişlikli ir dizinin

Amaç: Öğrencinin yıl sonu not hesabı

Veriler: 1 vize ve 1 final notu var. Vize notunun %30'u final notunun ise %40'ı yıl sonu notuna etki

edecek.

Kullanılacak Formül: 0.3*Vize + 0.7*Final

Modül sayfasına yazılacak Kod:

Function basari(vize As Integer, final As Integer)

basari = 0.3 * vize + 0.7 * final

End Function

Şimdi, her türlü önleme karşı yazdığınız bu kodu kaydedin. Bazı arkadaşlarımızın, bizim yukarıda

yazdığımız kodu hemen alıp modül sayfasına kopyaladıklarını görüyor gibiyim. Tamam, bu da olur

ama yazmak, kopyalamakla kıyaslanamayacak kadar iyidir. Eğer hep böyle kopyalama işine alışırsanız,

VBA Kod sayfasındaki olayları anlamakta güçlük çekersiniz. Bu basit bir uyarıydı. Tabi ki bu arada siz

Çalışma sayfasına geçtiniz. Bundan sonra yapılacak işlem çok kolay. Aşağıdaki şekilde görüldüğü gibi,

herhangi bir hücreye gidin ve =basari(50;60) yazın ve Enter tuşuna basın. Sonucu göreceksiniz.

Yerleşik Fonksiyonlarda olduğu gibi, Kullanıcı Tanımlı Fonksiyonlarda da, ister doğrudan değişkenlere

değer vererek yazarsınız, isterseniz değişken yerine değerin bulunduğu hücre adresini yazarsınız.

Burada size yapabileceğimiz tavsiye, tabi ki, ikincisi olan hücre adresini yazmanızdır. Bu değişkenler,

adı üzerinde olduğu gibi değişkendir. Sürekli değiştiğinde formülün içine girip yazmanız zor olacaktır.

Yine de seçim size kalmış.

Yukarıda verdiğimiz örneği biraz daha geliştirelim.

Örnek 2:

Bu defa iki vize notu olsun ve yıl sonu başarı notuna bu vizelerin ortalaması eklensin.

Function basari(vize1 As Integer, vize2 As Integer, final As Integer)

vizeort = (vize1 + vize2) / 2

basari = 0.3 * vizeort + 0.7 * final

End Function

Excel Dosyanızda bir fonksiyon hazırladınız ve bu hazırladığınız fonksiyonu da bütün Excel

dosyalarında kullanmak istiyorsunuz? Bunun için aşağıda anlattığımız adımları izlemeniz yeterli.

1. Excel Modül sayfasında bir fonksiyon hazırlayın.

2. Excel Çalışma sayfasına geçerek Dosya (File) menüsünden Farklı Kaydet (Save As) komutunu

tıklayın. Aşağıdaki Save As penceresi açılacaktır.

3. Bu penceredeki, Farklı Kayıt Tipi (Save As Type) kutusundan, Microsoft Excel Eklentisi (Microsoft

Excel Add-In) (*.xla) seçeneğini seçin. Bu arada Save in kutusundaki kayıt yerinin de AddIns klasörü

olduğuna dikkat edin. Bu klasörün yolu şöyledir.

"C:\.......\Application Data\Microsoft\AddIns"

4. Dosyanız bu defa AddIns klasörünebasari.XLA dosyası olarak kaydedilecektir. Artık dosyamız bir

Eklenti dosyası olarak hazır. (unutmayın bu dosya yukarıdaki yolunu verdiğimiz klasörde bulunmalı)

Page 18: Excel Makro · Diziler irden fazla değeri ir değişken üzerinde tutmak ve unlara ir index vermek için kullanılır. VBA da diziler 0 dan aşlar. Örneğin 10 genişlikli ir dizinin

5. Şimdi Excel'i Kapatın ve yeniden açın.

6. Araçlar (Tools) menüsünden Eklentiler...(Add-Ins...) komutunu seçin. Ekrana Eklenti penceresi

gelecektir. basarı adında bir eklenti listede yerini almış. Sol tarafındaki kutuyu onaylayın ve Tamam

(OK) düğmesine tıklayın. Artık, Exceliniz her dosya için basari fonksiyonunu kullanmaya hazır.

Aralık ve Metin girildiğinde girilen metinden kaç adet olduğunu bulur. Metinsay fonksiyonu

kullanılmıştır.

Private Sub CommandButton20_Click()

Dim aralik As String

Dim metin As String

aralik = InputBox("Aralık giriniz", "Aralık")

metin = InputBox("Metin giriniz", "Metin")

MsgBox metinsay(Range(aralik), metin)

End Sub

Kullanılan Fonksiyonlar.

Bir dosyanın uzunluğunu sıfırdan büyük olup olmadığına bakan fonksiyon

Function FileExists(ByVal FileName As String) As Boolean

FileExists = Len(Dir(FileName)) > 0

End Function

Girilen metnin seçilen bölgede kaç adet olduğunu görünteleyen fonksiyon

Function metinsay(rng As Range, metin As String)

Dim sayi As Long

Dim r As Range

Dim ilkadres

sayi = 0

Set r = rng.Find(metin)

If r Is Nothing Then

sayi = 0

Exit Function

Else

Page 19: Excel Makro · Diziler irden fazla değeri ir değişken üzerinde tutmak ve unlara ir index vermek için kullanılır. VBA da diziler 0 dan aşlar. Örneğin 10 genişlikli ir dizinin

ilkadres = r.Address

Do

sayi = sayi + 1

Set r = rng.FindNext(r)

Loop While r.Address <> ilkadres

End If

metinsay = sayi

End Function