Biraz da Macro: Excel


Belirli zamanlarda uretmek zorunda oldugunuz bazi Excel dosyalariniz var diyelim..

Urettiginiz format belli, bu formati olusturmakta kullandiginiz diger Excel dosyalarin formati belli.. 

Surekli ayni dosyalari acip, kopyalamak, kucuk bazi formullerle bir takim hesaplamalar yaptirip diger Excel ‘e veri aktarmak.. Bu her ne kadar “kolay” olsa da vakit alan zahmetli bir is, degil mi?

Daha once ne Macro yazmis, ne de yazmayi dusunmustum. 

Ama tam da yukaridaki gibi “rutin” bir islem her hafta buyuk vaktimi alacak gibi gorununce maliyetsiz, kolayca uygulayabilecegim bir cozum aramaya koyuldum.

Kapsam

Durumu cok komplekslestirmeye gerek yok, kisaca elinizde belirli bir sutun desenine sahip bir Excel olsun. 
 
Bu Excel ‘i kullanarak baska bir Excel olusturalim.
 
Hatta olusturacagimiz Excel icin bir taslak form kullanalim, boylece ayni duzende hazirlanmis standart bir gorunume sahip formlar olusturalim..
 

Yontem

Tabii ki sayisiz platformda uygulanabilecek onlarca yontem var.. Macro yazmak kesinlikle en “rasyonel” cozum degil. Ama ek yazilim maliyeti istemiyorsaniz, ortaya cikarmaya calistiginiz is kurumsal olcekte bir urun degil, gundelik islerinizi gormeye yonelik bir cozumse, Macro dogru secim olabilir.
 
Bu yazida yontem olarak Macro kullanacagiz.
 

Ornek

Ben gercek bir senaryo uzerinden gitmeyecegim icin, oncelikle kendime ornek bir “kaynak” tablo olusturuyorum..
 
Bu benim arastirma kayitlarimi tuttugum tablo olsun.. 
 
Fakat bir yandan da arastirma kayitlarima gore belirli bir formatta uretmek zorunda oldugum sonuc formlari olsun. Bunlara belki imza atilacak, belki de sadece soft copy olarak saklamak istiyoruz.
 
Ornek sonuc formum da soyle bir sey olsun:
 
 
Tabii ki burada “tarih”, katilimci, sorumlu, sure ve sonuc kisimlari dinamik olarak dolacak. En azindan bunu istiyoruz :)
 
Ve son olarak, bir karisiklik olmasin diye Sheet 1 ve Sheet 2 ‘de yer alan kaynak ve sonuc sekmelerimin isimlerini kaynak ve sonuc olarak degistiriyorum.
 
 
 
1.Adim
Excel dosyalarinizda alttaki gibi bir DEVELOPER sekmesi goremiyorsaniz, oncelikle Excel ayarlarimizdan DEVELOPER modunu acalim.
 
 
2.Adim
Artik developer modu acik olduguna gore, Developer sekmesine tiklayip
 
 
3.Adim
Insert menusunden calisma sayfamiza bir buton ekleyelim:
 
4.Adim
Design Mode secenegi aktifken, ekrana yerlestirdigimiz butona cift tiklarsak, Visual Basic editoru acilacak:

 

 
 
 
Simdi eglenceli kisma baslayabiliriz :)
 
5.Adim
Aslinda yapmak istedigimiz ne? Kisaca buna bakalim..
 
Kaynak tablomdaki Tarih kolonundan, Sonuc Formu olarak hazirladigim taslagin “spesifik” bir hucresine veri tasimak istiyorum.
 
Bu islemi KatilimciSorumluSureSonuc verileri icin de yaparsam Sonuc Formu hazir olacak..
 
O halde bana bir kac degisken gerekecek.
Dim katilimci As String
Dim sorumlu As String
Dim tarih As Date
Dim sure As String
Dim sonuc As String
 
Bu degiskenleri Sub satirimizdan sonra tanimlayalim.
 
Bir degisken de koordinat ifade etmek icin tanimlayalim, adi mesela loc olsun..
 

Dim loc As Integer

loc = 2 

 

loc degiskenimiz 2. satirdan baslasin dedim; cunku ilk satirda kolon basliklarimiz var.

Kucuk programimizin 2. satirdan baslayarak asagi dogru tablomuzu taramasini ve kaynak tablomuzdaki her bir satir icin bir sonuc formu olusturmasini istedigimize gore, satirlar bitince, yani bos bir satira gelince dongunun sonlanmasini soyleyelim.

 

Do While Not IsEmpty(Sheet1.Range(“a” & loc))

 

Boylece ilgili sheet ‘te bos bir satira gelmedikce loop etmeye birazdan ifade edecegimiz satirlari islet demis olduk.

O halde simdi kaynak tablonun nasil okunacagini ve sonuc formunun bu bilgilerle nasil doldurulacagini programlayabiliriz:

 

katilimci = Sheet1.Range(“b” & loc) 

sorumlu = Sheet1.Range(“c” & loc)

tarih = Sheet1.Range(“d” & loc)

sure = Sheet1.Range(“e” & loc)

sonuc = Sheet1.Range(“f” & loc)


Her satiri tek tek aciklamaya gerek yok, ama gordugunuz gibi en ustte tanimladigimiz her degiskenin, ilgili sheet ‘teki koordinatlarini verdim.

Soz gelimi LOOP ‘un ilk turunda katilimci degiskeni, Sheet1 ‘deki b2 hucresinde buldugu degeri alacak.

Sonra Do While kosulumuza gore bir sonraki satir hala bos degilse, 2. kez loop edecek, bu kez b3 hucresinde buldugu degeri alacak.

Boylece bu 5 degiskenimiz her bir LOOP ‘ta kaynak tablomdaki ilgili degerlerle guncellenecekler.

Simdi bu degiskenleri sonuc formunda uygun yerlere adresleyelim..

Once kursorumuze artik “kaynak” sheet ‘inde degil “sonuc” sheet ‘inde islem yapacagimizi soyluyoruz:

 

Worksheets(“sonuc”).Select

 

Arkasindan katilimci, sorumlu, tarih, sure, sonuc degiskenlerimizin sonuc formunda hangi hucrelere aktarilacagini adresliyoruz:

 

Worksheets(“sonuc”).Range(“b7”).Select

ActiveCell.Value = tarih

 

Worksheets(“sonuc”).Range(“e10”).Select

ActiveCell.Value = katilimci

 

Worksheets(“sonuc”).Range(“e11”).Select

ActiveCell.Value = sorumlu

 

Worksheets(“sonuc”).Range(“e12”).Select

ActiveCell.Value = sure

 

Worksheets(“sonuc”).Range(“g14”).Select

ActiveCell.Value = sonuc

 

 

Burada da soz gelimi ilk blokta aslinda, 

 

“sonuc” isimli sheet ‘imdeki b7 hucresine git, bu hucrenin degeri tarih degiskenimin degeridir. “


dedik.

Unutmayin, hala ilk loop ‘un icinde kursorumuz.. 

Simdi sonuc formu dosyamizin bu halini kaydedip bir sonraki satir icin yeni bir form olusturmaliyim.. O halde:

fname = katilimci & “_sonuc_dosyasi”  

gibi bir satir yazalim, boylece her dosyanin anlasilir bir ismi olsun. Hala ilk LOOP ‘ta oldugumuzu soylemistik, o halde ilk sonuc formu icin dosya adi b2 hucresindeki katilimci ismi ile baslayacak, ikinci LOOP ‘a gectigimizde ayni ifade bu kez b3 hucresindeki katilimci ismini alacagi icin dosya adimiz bu yeni katilimci ismi ile baslayacak.

Simdi de sonuc sheet ‘ini kopyalayip istedigimiz bir klasore yazmasini soyleyelim.

Worksheets(“sonuc”).Copy
ChDrive (“C”)
ChDir (“C:\sonuc_formlarim”)
ActiveWorkbook.SaveAs Filename:=fname & “.xlsx”

Ilk satirda ilgili sayfayi almasini, ikinci satirda “C” harfiyle baslayan diskime gitmesini, ucuncu satirda dosyanin kaydedilmesini istedigim klasorun yerini, dorduncu satirda ise fname degiskeniyle yukarida belirledigim dosya adimin XLSX uzantisi ile kaydedilmesini soylemis oldum.

Boylece ilk sonuc formum doldurulmus oldu, o halde loc degerimi 1 artirmali, yani 1 sonraki satira gecmeli ve LOOP etmeliyim.


loc = loc + 1
Loop


Bu dongu ustte  Do While ile belirttigimiz kosul saglandigi muddetce calisacak, bos satira gelince sonlanacak. 

Burada istiyorsak programimizi 

End Sub

Diyerek sonlandirip calistirmayi deneyebiliriz.  Programimizi kaydedelim ve kaynak sayfamiza donelim.

Sayfaya ekledigimiz butona bastigimiza formlar otomatik olarak olusacaktir..





Ya da bonus olarak her bir dokumanin bir de default yazicimiza gitmesini soyleyebiliriz. Tabii ki bunu henuz LOOP icindeyken yapmaliyiz :)

Iyi calismalar!

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.