Makro koduyla 150 farklı sonucu listelemek

xternet

Altın Üye
Katılım
12 Kasım 2004
Mesajlar
462
Excel Vers. ve Dili
2010 Tr
Altın Üyelik Bitiş Tarihi
12-10-2028
Merhaba arkadaşlar.

Özetlemem gerekirse 150 kişilik bir listeye göre değişken sonuçlar veren bir tablom var. Amacım; yapılacak bir makro koduyla bu 150 farklı sonucu 150 hücrede listelemek. Örnek dosyada da açıklamaya çalıştım. Desteğinizi bekliyorum.

İyi çalışmalar
 
Son düzenleme:

hamitcan

Uzman
Uzman
Katılım
1 Temmuz 2004
Mesajlar
7,733
Excel Vers. ve Dili
Excel 2019 Türkçe
Sorunuzu tam olarak açıklayamamışsınız. Bahsettiğiniz tablo ile ilgili bir örnek ekleyiniz.
 

xternet

Altın Üye
Katılım
12 Kasım 2004
Mesajlar
462
Excel Vers. ve Dili
2010 Tr
Altın Üyelik Bitiş Tarihi
12-10-2028
Sanırım bu örnek dosya biraz daha açık. Desteğinizi bekliyorum arkadaşlar.

İyi çalışmalar.
 

xternet

Altın Üye
Katılım
12 Kasım 2004
Mesajlar
462
Excel Vers. ve Dili
2010 Tr
Altın Üyelik Bitiş Tarihi
12-10-2028
Sayın fpc; kodunuz tam istediğim gibi çalışıyor. Çok teşekkür ederim. Zihninize sağlık.

Örnek calışmamda da belirttiğim gibi ben bu kodu asıl çalışmama uyarlayacaktım. (uyarlayabileceğimi sanıyordum) Ancak benim vb bilgim çok zayıf olduğu için yazdığınız kodu kendi çalışmama uyarlamakta zorluk çekiyorum. Bu kodu yaklaşık 150 kişilik olan çalışmama uyarlayabilmem için, koddaki kavramları yada kendime göre düzenleyeceğim noktaları açıklarsanız sevinirim.

İyi çalışmalar.



Sub hesapla()
Set sh = Sheets("Sayfa1")
sondv = sh.Cells(65536, 1).End(xlUp).Row
sonls = sh.Cells(65536, 11).End(xlUp).Row
If sonls = 3 Then GoTo f1
sh.Range("K4:K" & sonls).ClearContents
f1:
x = 3
Application.Calculation = xlCalculationAutomatic
For i = 13 To sondv
x = x + 1
sh.Cells(x, 11) = sh.Cells(i, 1)
sh.Cells(3, 2) = sh.Cells(i, 1)
sh.Cells(x, 12) = sh.Cells(10, 7)
Next i
sh.Cells(3, 2) = Empty
Set sh = Nothing



End Sub
 
Katılım
15 Haziran 2006
Mesajlar
3,704
Excel Vers. ve Dili
Excel 2003, 2007, 2010 (TR)
KABULLER:
1.Veri Doğrulamada kullanılan liste, raporlamanın esas verileridir. Bu veriler, A13 hücresinde başlayarak, alta doğru iner (satır sayısı önemli değil)

2. Raporun gösterileceği aralık, K4:G4 aralığından başlayarak aşağıya doğru uzanır (Satır sayısı, veri doğrulamaya esas listeye göre değişir. Sınır yok)

Şimdi;

Kod:
Sub hesapla()
Set sh = Sheets("Sayfa1")
Kod:
 (1) sondv = sh.Cells(65536, 1).End(xlUp).Row
A sütununda dolu olan en alt satır bulunur. Bu satır, A13'ten başlayan isim listesinin sonudur.
Kod:
(2) sonls = sh.Cells(65536, 11).End(xlUp).Row
K sütununda dolu olan en alt satır bulunur. Bu satır K4'ten itibaren oluşturulacak rapor-isim listesinin sonudur.
Kod:
(3) If sonls = 3 Then GoTo f1
Eğer sonls değeri (yani K sütunundaki en son satır) 3 nolu satırsa; bir alt satırdaki silme işlemini atla (biz atlayacağı yeri f1 diye gösterdik)... Çünkü, o zaman listeyi temizlemeye gerek yok, mevcut haliyle bu aralık zaten boştur.
Kod:
(4) sh.Range("K4:K" & sonls).ClearContents
sonls değeri 3'ten farklıysa -ki ben burda başlığın sabit olduğunu varsayarak) 3'ten küçük olamayacağını kabul ettim- K4'ten Ksonls hücresine kadar olan aralığı temizle. Bu;ileride veri ilave ettikçe, rapor liste uzunluklarının farklılığından kaynaklanacak artık verilerin bulunmasını engeller.
Kod:
(5) x=3
x'i aşağıdaki satırlarda açıklayacağım
Kod:
(6) Application.Calculation = xlCalculationAutomatic
Herhalukarda kendimizi garanti altına almak için, Excel'in hesaplama özelliğini otomatik olarak ayarladık. Bu kazara, manuel (F9 ile çalıştırılan) moda dönerse, bunu baştan öngörmüş olduk. Eğer kazara manuel'de; rapor oluşturamayız ve formül değeri hep aynı hatalı sonucu verir.
Kod:
(7) For i = 13 To sondv
Daha sonra döngüye girdik. 13.satırdan başlayarak A sütunundaki isim bulunan en alt satıra kadar, isimleri tek tek taratmamız gerekiyordu
Kod:
 (8) x = x + 1
x bir sayaç, ama önemli ... x'in ilk konumu x=3+1 yani 4'tür Döngü her turunda değeri bir artar.
Kod:
(9) sh.Cells(x, 11) = sh.Cells(i, 1)
Örneğin, döngünün ilk tutunda bunun anlamı şuna denk gelir. K4'ün değeri A13'Tür.
Kod:
(10) sh.Cells(3, 2) = sh.Cells(i, 1)
Örneğin, döngünün ilk tutunda bunun anlamı şuna denk gelir. B3'ün değeri, K4 olsun. Yani veri doğrulamaya tek tek isimleri yazdırıyoruz.
Kod:
(11) sh.Cells(x, 12) = sh.Cells(10, 7)
Yine ilk turda; L4'ün değeri, G10'da hesaplanan formül sonucudur.
Kod:
(12) Next i
Döngünün tekrar edileceği ve biteceği nokta
Kod:
(13) sh.Cells(3, 2) = Empty
Son olarak da, B3'ün değerini boşluk olarak belirleyip, veri doğrulama hücresinde sanki seçilmiş bir değer yokmuş havası veriyoruz. Bu satır çok da önemli değil açıkçası :)
Kod:
Set sh = Nothing
Dilim döndüğünce anlatmaya çalıştım. Sürç-ü lisan varsa affola ...
 

xternet

Altın Üye
Katılım
12 Kasım 2004
Mesajlar
462
Excel Vers. ve Dili
2010 Tr
Altın Üyelik Bitiş Tarihi
12-10-2028
Sürç-ü lisan ne demek sayın fpc. Mükemmel.

Makroyu uyarladım. Tam düşündüğüm gibi çalışıyor. Tekrar teşekkür ediyorum. Zihninize sağlık.

İyi çalışmalar
 

xternet

Altın Üye
Katılım
12 Kasım 2004
Mesajlar
462
Excel Vers. ve Dili
2010 Tr
Altın Üyelik Bitiş Tarihi
12-10-2028
Tekrar merhaba.

Kod mükemmel çalışıyor. 150 kişilim listeyi tarıyor ve çıktılarını sıralıyor. Yalnız çalışmamdaki hesaplamalar biraz yoğun olduğu için tarama süresi 2-3 dakikayı buluyor.

Bu liste okuldaki öğretmenlerin listesi. 150 sayısı max olabilecek değer. Ama bizim okulda şu anda 65 öğretmen var. Yani hesapla makrosunun 65 satırı taraması şu an için yeterli. Bu tarama işleminin daha çabuk bitmesi demek.

Kısacası "hesapla" makromuza, başlangıç noktasından itibaren taranacak satır sayısını girebilirsen, tarama işleminin boş satırları taramasını ve zaman kaybını önlemiş olucam. Örneğin makroyu çalıştırdığımda taranacak satır sayısını isteyen bir pencere açılacak. Ben bu pencereye şu andaki öğretmensayımızı giricem ve tarama işlemi girdiğim satır sayısına kadar yapılacak.

İyi çalışmalar
 
Katılım
15 Haziran 2006
Mesajlar
3,704
Excel Vers. ve Dili
Excel 2003, 2007, 2010 (TR)
Eğer gerçek verileriniz de; örnekteki gibi sayfaya yerleştirilmişse ve siz listeye 65 öğretmen ilave ettiyseniz, döngü 65 defa çalışır. Fazla çalışmaz.


Yazdıklarınızdan, dosyanızın başka yerlerinde yoğun formül kullandığınızı anlıyorum.

Saniyelerle de hesaplayabilir. Ancak, datavalidation'la isim seçtiğimizde tablonun altında hesaplanan formül değerini, makro ile belirlemek gerekir.

Bu durumda hesaplamayı manuel'e çekip, işlem hızlandırılabilir.

Sonuç olarak; taranacak satır sayısını elle girme ile alakalı bir durum olduğunu sanmıyorum.
 

xternet

Altın Üye
Katılım
12 Kasım 2004
Mesajlar
462
Excel Vers. ve Dili
2010 Tr
Altın Üyelik Bitiş Tarihi
12-10-2028
Taranan listeye isimler genel bilgilerin girildiği bir sayfadan bağ yapıştır ile geliyor. Ondan dolayı taranan listede 65. öğretmenden sonra boş hücreler için "0" değeri yazıyor ve "hesapla" makromuz bu hücreleride tarıyor. Ben bunu önlemek için böyle bir talepte bulunmuştum. Başka bir çözüm yolu varsa olabilir tabiki.
 
Katılım
15 Haziran 2006
Mesajlar
3,704
Excel Vers. ve Dili
Excel 2003, 2007, 2010 (TR)
O zaman şöyle yapalım. İsim listesinde; ilk "0" gördüğü yerde döngüden çıksın ve makro dursun.

Kod:
Sub hesapla()
Set sh = Sheets("Sayfa1")
sondv = sh.Cells(65536, 1).End(xlUp).Row
sonls = sh.Cells(65536, 11).End(xlUp).Row
If sonls = 3 Then GoTo f1
sh.Range("K4:K" & sonls).ClearContents
f1:
x = 3
Application.Calculation = xlCalculationAutomatic
For i = 13 To sondv
   [COLOR=red][B]if sh.cells(i,1)=0 then goto f2[/B][/COLOR]
   x = x + 1
   sh.Cells(x, 11) = sh.Cells(i, 1)
   sh.Cells(3, 2) = sh.Cells(i, 1)
   sh.Cells(x, 12) = sh.Cells(10, 7)
Next i
[COLOR=red][B]f2:
[/B][/COLOR]sh.Cells(3, 2) = Empty
Set sh = Nothing
End Sub
 

xternet

Altın Üye
Katılım
12 Kasım 2004
Mesajlar
462
Excel Vers. ve Dili
2010 Tr
Altın Üyelik Bitiş Tarihi
12-10-2028
Teşekkür ederim. Bu sorunumuda hallettiniz.

Şu anda çıkmam lazım. Daha müsait bir zamanda sizinle tanışmak ve sohbet etmek isterim. Görüşmek üzere.

İyi çalışmalar.
 
Üst