Fonksiyon ve macrolar nasıl kullanılıyor

Katılım
9 Aralık 2004
Mesajlar
24
Exceldeki fonksiyonların adını biliyorum ama yeni bir fonksiyon yazarken bunu nereye yazmam gerektiğini bilmiyorum. Tools - Macro - Visual basic Editör diye bir bölüm var. Buraya yazmam gerekiyor sanırım ama hazır olan birkaç fonskiyonu yazayım dedim başarılı olamadım. Macro ve fonksiyonların nereye ve nasıl yazıldığı ve nasıl kullanıldığı hakkında bilgi verebilir misiniz acaba?
 

Levent Menteşoğlu

Administrator
Yönetici
Admin
Katılım
13 Ekim 2004
Mesajlar
16,057
Excel Vers. ve Dili
Excel 2010-32 bit-Türkçe
Excel 365 -32 bit-Türkçe
Visual basic düzenleyicisini seçtikten sonra "insert" başlığından "module" seçeneği seçilir. Açılan sayfa kodların yazıldığı sayfadır. Fakat buraya eklenecek kodların nasıl yazıldığını burada anlatmak çok zor bunu siteyi takip ederek öğrenmenizi tavsiye ederim. Mevcut excel fonksiyonlarının kodlarını göremezsiniz. Fakat bu bölümde;eğer amacınızı gerçekleştirecek hazır fonksiyon bulamazsanız, yeni bir fonksiyon tanımlayabilirsiniz. bunun için ise

Kod:
Sub function a(x,y)
......
end function
şeklinde yazarak yeni bir fonksiyon kodlayabilirsiniz. "....." yazan yere yapılacak işlem ile ilgili kodlar yazılmalıdır. burada fonksiyonun adı "a" dır. x ve y ise fonksiyonun parametreleridir. Bu parametreleri x,y,z,...şeklinde yazarak arttırabilirsiniz.

selamlar
 
X

xxrt

Misafir
Sayın leventm açık olarak yazmış.Fonksiyon kodlarını yazacağınız yeri görsel olarak görürseniz,daha iyi kavrarsınız..Kolay Gelsin.
 
Katılım
9 Aralık 2004
Mesajlar
24
İlginize çok teşekkürler. Daha önce kodları module değil sayfa (sheet) kısmına kopyaladığım için çalışmıyormuş. Ancak macro bölümü ile fonksiyon bölümün farkını anlayamadım. Yani macro bölümü fonsksiyon (Visual basic editor - VBE) bölümünden daha farklı bir mantıkla mı çalışıyort?
Macro kodlarını fonsksiyon olarak VBE modüllerine kopyalayıp kullanamıyoruz ve aynı şekilde VBE'deki fonksiyonlarıda macro olarak kullanamıyoruz sanırım. Doğru mu acaba?
 
X

xxrt

Misafir
Macro kodlarını fonsksiyon olarak VBE modüllerine kopyalayıp kullanamıyoruz ve aynı şekilde VBE'deki fonksiyonlarıda macro olarak kullanamıyoruz sanırım. Doğru mu acaba?
Makro veya Fonksiyonları Modül içinde kullanabilirsiniz.Aşağıdaki yazılartı dikkatle incelerseniz sanırım çok faydası olacaktır.

VBA programındaki prosedürler bir seçenek değildir ve her zaman her yerde kullanılabilirler. Eğer bir VBA programında sadece bir komut bulunsa bile, her komut kendi içerisinde bir prosedüre ait olduğu için aynı zamanda bir tane de prosedür bulunur .
Prosedürler, isimlendirilmiş alanlardır ve bir veya daha çok VBA komutu içerirler. VBA programına istediğiniz zaman prosedür ekleyebilirsiniz. Bunun için yapmanız gereken tek şey Sub komutu ile beraber prosedürün ismini girmektir. VBA, bunun sonucunda End Sub komutunu otomatik olarak ekleyerek prosedürün sınırlarını belirleyecektir. Prosedür için, adlandırma kurallarına uyarak istediğiniz ismi kullanabilirsiniz. Ancak ismi doğru girdiğiniz zaman VBA için bir anlamı olacaktır.
Ã?rnek:
Kod:
Sub NoktaliKontrol ()
Dim bolNoktaliMevcut As Boolean
For lngSayac = 1 To Len(strIsimKontrol)
Select Case Mid(strIsimKontrol, lngSayac, 1)
Case "i", "İ", "ö", "Ã?", "ü", "Ü"
bolNoktaliMevcut = True
End Select
Next lngSayac
End Sub
VBA altında fonksiyon tanımlama
VBA programcıları Function komutunu kullanarak kendi fonksiyonlarını hazırlayabilirler. Bu, özellikle özel hesaplamalarda veya belirli bir operasyonun bir çok defa kullanılacağı durumlarda pratik bir çözüm teşkil edecektir. Bir fonksiyon Function komutu ile başlar ve End Function komutu ile de son bulur. Bunun için fonksiyon içerisinde işlem gören komutların bir önemi yoktur. Eğer fonksiyon bir değer geri döndürecekse, bu değer fonksiyon içerisinde fonksiyon ismi ile atanmalıdır. Fonksiyonun genel tanımı aşağıdaki gibidir:

Kod:
Function Fonksiyonİsmi (Bileşen Listesi) As VeriTürü
' Komutlar
Fonksiyonİsmi= Deger
End Function
Yukarıdaki prosedür örneğini kullanarak kullanılan noktalı harfleri kontrol eden ve sonucu geri döndüren bir fonksiyon hazırlayabiliriz. Bunun için yapılması gereken tek şey prosedür yerine fonksiyon tanımlamasıdır.


Kod:
Function NoktaliKontrol() As Boolean
Dim lngSayac As Long
For lngSayac = 1 To Len(strIsimKontrol)
Select Case Mid(strIsimKontrol, lngSayac, 1)
Case "i", "İ", "ö", "Ã?", "ü", "Ü"
NoktaliKontrol= True
Case Else
NoktaliKontrol = False
End Select
Next lngSayac
End Function
Aradaki küçük fakat önemli farklara dikkat etmelisiniz:
· İlk olarak Sub yerine Function ve benzer şekilde End Sub yerine de End Function komutu kullanılmalıdır.
* Prosedür başlangıcındaki fonksiyon ismi ve parantezi (Parametre olmadığı zamanlarda) "As Boolean" ifadesi takip eder. Bu, fonksiyondan geri döndürülen değerin veri tipinin Boolean olacağını belirtir. Yani fonksiyon ismine sahip değişken bu veri tipindedir.
·* Bu değişikliklerin yanında prosedür içerisinde de bir değişiklik yapılır ve geri dönüş değeri için fonksiyon ismi kullanıldığı için NoktaliMevcut değişkeni NoktaliKontrol olarak değiştirilir. Fonksiyon ismi direkt olarak sorgu içerisine eklendiği için artık NoktaliMevcut adında bir değişken kullanılmasına gerek yoktur.

Kod:
İsimKontrol= "İsmail Köylü"
If NoktaliKontrol= True Then
Fonksiyonun yapısında IsimKontrol değişkenin strKontrol olarak değiştirilmesi haricinde bir fark yoktur. Boş parantezler yerine fonksiyona aktarılacak olan tüm parametreler tanımlanmışlardır. Parantez içerisindeki Optional ifadesi bu parametrenin kullanılmak zorunda olunmadığını belirtir.
 
Katılım
9 Aralık 2004
Mesajlar
24
Cevaplar için teşekkürler.Çok faydalı oldu.Ayrıca fonksiyon ve makrolarla ilgili başlangıç düzeyi için bir kitap veya internette kaynaklar önerebilirseniz memnun olurum. Bu konuda bilgili diğer arkadaşlarında görüş ve bilgilerini paylaşması dileğiyle saygılar sunuyorum.
 
Katılım
9 Aralık 2004
Mesajlar
24
Link içinde teşekkürler. VBA'ya girince sol üst bölümde bulunan VBA Project bölümünde(Project Explorer) 4 tane klasör adı var. Bunlar "Microsoft Excel Objects" "Userform" "Module" ve "ClassModule"
Bu bölümlere gördüğüm kadarı ile istediğimiz kadar sayfa insert edebiliyoruz.Fonksiyonları anladığım kadarı ile "Module" kısmına giriyoruz. Bu bölümlerin ne işe yaradığı hakkında bilgi verirseniz memnun olurum.
 
Katılım
29 Eylül 2004
Mesajlar
1,810
Excel Vers. ve Dili
Excel 2002 TR
VBA’de tüm kodlarımızı modüllerin içinde yazıyoruz. Henüz makro içermeyen bir excel dosyasında Alt+F11 ile Visual Basic düzenleyicimizi açtığımızda Project Explorer penceresinde bir tane Workbook için ve her sayfa(sheet) için birer tane olmak üzere hazır modüller olduğunu görürüz.

Workbook modülünde ;

Activate
AddinInstall
AddinUninstall
BeforeClose
BeforePrint
BeforeSave
Deactivate
NewSheet
Open
PivotTableCloseConnection
PivotTableOpenConnection
SheetActivate
SheetBeforeDoubleClick
SheetBeforeRightClick
SheetCalculate
SheetChange
SheetDeactivate
SheetFollowHyperlink
SheetPivotTableUpdate
SheetSelectionChange
WindowActivate
WindowDeactivate
WindowResize


Gibi Event Handlerlar vardır. Bunlar Workbook düzeyinde yaptığınız veya oluşan olayları tespit ederek prosedür içine yazdığınız kodların çalışmasını sağlar. Sık sık görmüşsünüzdür forumdada hani, kodumuz açılışta çalışsın, kapatmadan önce şuraya bir yedek alsın, yazdırmadan önce şunu ayaralasın vs. gibi olayları gerçekleştirmek için bu event handlerlardan faydalanıyoruz. Ve bunları workbook modülünde yazıyoruz.


Ã?bür taraftan sheet düzeyindede bir hücreye değer girdiğimde kodum çalışsın, hücreye çift tıkladığımda makrom çalışsın, sayfada şu hücrenin değeri şu olunca
Makrom çalışsın, sağ tıkladığımda şu olsun vb soruların cevabında ise worksheet modülünde bulunan aşağıdaki event handlerlar sayesinde gerçekleştiriyoruz.

Activate
BeforeDoubleClick
BeforeRightClick
Calculate
Change
Deactivate
FollowHyperlink
PivotTableUpdate
SelectionChange


Workbook ve worksheet modüllerinde sadece event handler (olay yöneticileri (sonunda tam türkçesini buldum) kullanmak zorunda değiliz. Hatta çok büyük bir işe kalkışmıyorsak hemen her şeyi bu sayfa ve çalışma kitabı modüllerinde yapıp bitirebiliriz.

Ancak proje büyüdükçe kodların takibi , programın kullanılabilirliği vs sebepler ile farklı modüllere ihtiyacımız başlar. Bunun için VB bize 3 modül daha sunmuş.

Standart Modül
Kullanıcı formu (Use Form)
Sınıf Modülü (Class Module)

Bu modülleri öğrenme sırasıda kanımca yazdığım sıra ile oluyor/olmalı. Başlarda kodlarımız anlaşılır olsun, kolayca dolaşabilmek için vs sebepler ile standart modülleri kullanmaya başlıyoruz. Bunun bize sağladığı diğer fayda da modüllerimizin başka projelere taşınabilirliği veya başka projeden modül almak kolaylaşıyor..

Bir adım sonra excelin kendi içinde sürekli kullandığımız kullanıcı formlarına ihtiyaç duymaya başlıyoruz. Ã?zellik le kullanıcıdan pek çok bilgi girişi istiyorsak bunların her biri için tek tek inputbox ekrana getirmek kullanıcı için çok can sıkıcı olabilir, üstelik kullanıcı bir seçeneği seçerken bir önceki inputbox’da neyi seçtiğini bilmesi/hatırlaması gerekiyor olabilir.. Oysa sekmelerde koyabildiğimiz tek bir UserForm ile kullanıcıdan bir defada pek çok özelliği, değişkeni, bilgiyi vs alabiliriz.

Class Modülü ise genelde pek çoğumuzun en yabancısı olduğu konu.
Bunun başlıca iki sebebi var. Bir tanesi Class ile yapıpda diğer modüller ile yapamayacağınız hemen hiçbir şey yoktur. Bir diğer sebebde her ne kadar VBA’nın kendiside Nesneye yönelik programlama(nyp)’da olsa excel’i kavradı isek VBA kodlarınıda kavramak hangi terimin hangi excel (object)nesnesinin hangi özelliğini (property) yani rengini, boyunu, çizgisini vs vs vs.. değiştirdiğini anlamak ve hangi terimlerin bir excel nesnesi ile birlikte kullanabileceğimiz method (yani kes, sil, taşı vs vs) olduğunu anlamak kolay oluyor. Oysa Class Modülünü kendi nesnemizi oluşturmak için kullanıyoruz. Nesnemizin kendi özelliklerini ve metotlarını oluşturuyoruz. Ã?rneğin bir banka hesabı için sınıf oluşturalım desek ve tarih, açıklama, borç/alacak ve tutar şeklinde 4 sütunumuz olsa.. gerçek bir banka hesabında hangi özellikler olur ise (örneğin sütunlara sırası ile tarih, yazı, B//A ve rakam yazılmalı, hesap terse dönmemeli hesaba giriş çıkış olduğunda bakiyeyi döndürmeli vb) özellik ve metotları sınıf modülünde bir defaya mahsus belirleyip daha sonra istediğimiz kadar banka hesabı için aynı özellik ve metotlardan faydalanabiliriz.
Bir başka örnekte API’lerden faydalanmak üzerine.. Ã?rneğin klavyemizin Caps Lock düğmesi basılımı değilmi tespit etmek ve değiştirebilmek için API’den faydalanmamız gerektiğinde bunu bir defa sınıf modülünde nesneye çevirir ve isminede BuyKucH dersek daha sonra diğer modüllerimizde sıradan bir excel nesnesi gibi BuyKucH.Value şeklinde CapsLock’ın durumunu öğrenebilir yada BuyKucH.Value=True şeklinde durumunu değiştirebiliriz. Dahada çoğaltılabilir örnekler, windows registry’e ulaşmak için, sayfalarımıza koyduğumuz grafiklerin event handlerlarını oluşturmak için vs.. Ancak ne mesleğim bilgisayarla ilgili ne hazırladığım projeleri başkasının kullanımı için hazırlıyorum* , hergün koca koca projelere imza atmadığım için sınıf modüller ile pekde işim olmadı.

Bu yazı yeterince uzamış, dili zaten kötüde umarım çok fazla teknik hata yoktur. Maksat konu açılsın(gelişsin) , ustalarda bizi düzeltsin.

*(birkaç defa denedim , kendin için hazırlamaktan çok farklı, AS400 ekranının karşısında bir tek tuşu bile dikkatle basan insanlara excel nedense light geldiğinden illa orasında burasında kurcalayacak bozacak birşeyler bulup göçertmeye çalışıyorlar)
 

Levent Menteşoğlu

Administrator
Yönetici
Admin
Katılım
13 Ekim 2004
Mesajlar
16,057
Excel Vers. ve Dili
Excel 2010-32 bit-Türkçe
Excel 365 -32 bit-Türkçe
Sn danersin

Yazmış olduğunuz yazıyı bir nefeste okudum. Son derece anlaşılır bir biçimde çok güzel bilgiler vermişsiniz. Ã?ncelikle bu tür bir bilgi desteğinde bulunduğunuz için teşekkür ederim. Dikkatinizi çekmiştir. Makro Dersanesi isimli yeni başlık açıldı. Bu başlık altında, bilgilerinizi yayınlayarak paylaşırsanız çok memnun oluruz. Sizden, zamanınız olduğu müddetçe bu tür yazılarınızı bizlerle paylaşmaya devam etmenizi rica ederim.


saygılarımla
 
Katılım
7 Mart 2005
Mesajlar
85
merhaba
macro başlangıcı için güzel bir yazı olmuş bende eklesem.

Kodda görülen
Dim ne işe yarar ?
 
Üst