Makro ile eğersay

Katılım
6 Mayıs 2014
Mesajlar
264
Excel Vers. ve Dili
office 365
Altın Üyelik Bitiş Tarihi
23-06-2021
Eli dosyanın A sayfası G sütununda formül ile yaptığım işlemi F sütununda kod ile yapıp sonuçları F sütununda yazdırmak istiyorum. Yardımlarınız için teşekkürler.
 

Ekli dosyalar

Katılım
6 Mart 2005
Mesajlar
6,233
Excel Vers. ve Dili
Excel Vers. ve Dili:
Office 2016 TR 64 Bit
Altın Üyelik Bitiş Tarihi
22/12/2022
Deneyiniz.
Kod:
Sub sayısay()
Dim s1 As Worksheet: Dim s2 As Worksheet
Dim i As Integer: Dim ii As Integer
Set s1 = Sheets("A"): Set s2 = Sheets("tablo")
Set wf = WorksheetFunction
s1.Range("F4:F13").ClearContents
For ii = 4 To 13
For i = 1 To 5
If wf.Count(s1.Range("A" & ii & ":" & "E" & ii)) = 0 Then GoTo 10
t = wf.CountIf(s2.Range("A4:E7"), s1.Cells(ii, i))
Tpl = Tpl + t
Next i
s1.Cells(ii, i) = Tpl
Tpl = 0
10:
Next ii
End Sub
 
Katılım
6 Mayıs 2014
Mesajlar
264
Excel Vers. ve Dili
office 365
Altın Üyelik Bitiş Tarihi
23-06-2021
Ne demek. Bu bilgiler benim için çok değerli. Bedavaya hizmet alıyorum, yeni şeyler öğreniyorum ve bunları aktif olarak kullanıyorum. Büyük kolaylık sağlıyor, hızlı bir şekilde işlem yapmamızı sağlıyor. Siz değerli yardım eden arkadaşlar teşekkürden daha fazlasını hak ediyorsunuz. Bilgi güçtür.
 
Katılım
6 Mayıs 2014
Mesajlar
264
Excel Vers. ve Dili
office 365
Altın Üyelik Bitiş Tarihi
23-06-2021
Sayın Çıtır, kodun içindeki bazı kısımları dinamik olarak tanımlamak mümkün mü?
Kod:
Sub TEST_3()
Dim s1 As Worksheet: Dim s2 As Worksheet
Dim i As Integer: Dim ii As Integer
Set s1 = Sheets("A"): Set s2 = Sheets("tablo")
Set wf = WorksheetFunction
s1.Range("F4:F13").ClearContents
For ii = 4 To 13
For i = 1 To 5
If wf.Count(s1.Range("A" & ii & ":" & "E" & ii)) = 0 Then GoTo 10
t = wf.CountIf(s2.Range("A4:E7"), s1.Cells(ii, i))
Tpl = Tpl + t
Next i
s1.Cells(ii, i) = Tpl
Tpl = 0
10:
Next ii
End Sub
Yukarıda kırmızı ile belirttiğim beş farklı kısım veri büyüklüğüne göre değişebileceğinden bu kısımları her defasında değiştirmekle uğraşmamak için sordum. Mesela "son satir= " şeklinde tanımlama yapılıp bu tanımlama kullanılıyordu kodların içinde. Ben mesela
Kod:
s1.Range("F4:F13").ClearContents
kısmını
Kod:
s1.Range("F4:F").ClearContents
şeklinde değiştirdim. Ama işe yaramadı.

Bir de merak ettiğim bir husus:
Sizin kullandığınız bu for döngüsü veriler büyük olursa hız açısından olumlu ya da olumsuz bir etki eder mi? Sizin kullandığınız kodlarda "go to" "Tpl = Tpl + t" gibi pek görmediğim terimler var.
Şu https://www.excel.web.tr/threads/makro-ile-egersay-topla.184451/ linkte de for döngüsü var. Sizin kullandığınız ile diğerinin arasında kullanılan yapılar, kod yazım teknikleri açısından bir fark var mı bilmiyorum. Ama bütün for döngüleri elde ettiği sonuçları toplu olarak değil de tek tek bütün bütün satırlara sırası ile yazıyor herhalde. Böyle düşününce hepsi aynı performansı sağlar diyebilir miyiz?
 
Katılım
6 Mayıs 2014
Mesajlar
264
Excel Vers. ve Dili
office 365
Altın Üyelik Bitiş Tarihi
23-06-2021
Kırmızı alanlar çıkmadı. Tekrar yazayım.
s1.Range("F4:F13").ClearContents
For ii = 4 To 13
If wf.Count(s1.Range("A" & ii & ":" & "E" & ii)) = 0 Then GoTo 10
t = wf.CountIf(s2.Range("A4:E7"), s1.Cells(ii, i))
10:
 
Katılım
6 Mart 2005
Mesajlar
6,233
Excel Vers. ve Dili
Excel Vers. ve Dili:
Office 2016 TR 64 Bit
Altın Üyelik Bitiş Tarihi
22/12/2022
Sayın coşkun79;
Sorularınızın bazıları konusunda çok fazla bilgim olduğunu söyleyemem.Sizi yanıltmak istemem.Bilgileri başka kaynakdan da bakmanızda yarar var.
Verilerin fazla olması kodlama nasıl olursa olsun sanırım etkiler.
goTo deyimi çok kullanılan bir deyimdir.goTo deyimi ile şarta göre herhangi bir satıra gidebilirsiniz.
Sonsatir ve sonsütun bularak bunları ait olduğu alanlarda kullanarak dinamik alanlar oluşturabilirsiniz.Bildiğim kadar sorularınız cevaplamaya çalıştım.Umarım faydalı olur.
 

AdemCan

Altın Üye
Destek Ekibi
Katılım
1 Eylül 2008
Mesajlar
1,386
Excel Vers. ve Dili
2019 TR
Merhaba, bende bildiğim kadar açıklama yapmak isterim. :)
Öncelikle Sn. çıtır'ın belirttiği gibi Son Dolu Hücre bilgisini alabilmek için bir değişkene ihtiyacımız var.

s1 yani A sayfasındaki son dolu hücre bilgisi için sonsatir_s1 isimli bir değişken belirledim.
s2 yani tablo sayfasındaki son dolu hücre bilgisi için sonsatir_s2 isimli bir değişken belirledim.
Not: Değişken isimlerini istediğiniz gibi değiştirebilirsiniz.

A isimli sayfada H sütununda formüller olduğu için tablo boyunca boş hücre olmaz düşüncesi ile değişkeni bu sütuna bağladım.
*Başka bir sütuna göre son dolu satır numarasını almak isterseniz, sütun harfini değiştirmeniz yeterlidir.
sonsatir_s1 = s1.Cells(Rows.Count, "H").End(xlUp).Row
Bu satır H sütunundaki son dolu hücrenin satır numarasını verir.
Paylaşmış olduğunuz örnek dosyada H sütunundaki son dolu hücrenin satır numarası 13

tablo isimli sayfadaki alan Tablo Olarak Biçimlendirilmiş, bu nedenle tablo olarak biçimlendirilen alan içerisindeki herhangi bir sütundan son satır numarası alabilirsiniz.
sonsatir_s2 = s2.Range("E" & Rows.Count).End(xlUp).Row
Bu satır s2 yani tablo isimli sayfada E sütununa göre son hücrenin satır numarasını verir.
Paylaşmış olduğunuz örnek dosyada tablo olarak biçimlendirilen alan 12. satırda bittiği için, bu satır sonsatir_s2 değişkenine 12 ye eşitler.

GoTo 10 için de, 10 yerine istediğiniz bir değişken yazabilirsiniz.

Örnek olarak, If wf.Count(s1.Range("A" & ii & ":" & "E" & ii)) = 0 Then GoTo gec
Bu satırın anlamı, A ve E arasındaki hücrelerde değer yoksa diğer satıra geç, bu nedenle Next ii satırından önce yazılmış.

Tpl = Tpl + t ifadesi de değişkenlerden oluşmaktadır.
Yukarıda bahsettiğim gibi Değişken isimlerini istediğiniz gibi değiştirebilirsiniz.
Örnek olarak, Tpl yerine Sonuc , t yerine de x yazabiliriz.
Sonuc=Sonuc + x şeklinde kod içerisinde kullanabilirsiniz.

Satırları karşılaştırmak için, Kod içerisinde değiştirilen satırların pasif halleri de bulunmaktadır
Kod:
Set s1 = Sheets("A"): Set s2 = Sheets("tablo")
Set wf = WorksheetFunction

sonsatir_s1 = s1.Cells(Rows.Count, "H").End(xlUp).Row
s1.Range("F4:F" & sonsatir_s1).ClearContents
's1.Range("F4:F13").ClearContents

sonsatir_s2 = s2.Range("E" & Rows.Count).End(xlUp).Row

For ii = 4 To sonsatir_s1
'For ii = 4 To 13

For i = 1 To 5

If wf.Count(s1.Range("A" & ii & ":" & "E" & ii)) = 0 Then GoTo gec
'If wf.Count(s1.Range("A" & ii & ":" & "E" & ii)) = 0 Then GoTo 10

x = wf.CountIf(s2.Range("A4:E" & sonsatir_s2), s1.Cells(ii, i))
't = wf.CountIf(s2.Range("A4:E" & sonsatir_s2), s1.Cells(ii, i))
't = wf.CountIf(s2.Range("A4:E7"), s1.Cells(ii, i))

Sonuc = Sonuc + x
'Tpl = Tpl + t
Next i

s1.Cells(ii, i) = Sonuc
's1.Cells(ii, i) = Tpl

Sonuc = 0
'Tpl = 0

gec:
'10:
Next ii
Umarım yanlış bir ifade kullanmamışımdır. Yanlışlık varsa kusura bakmayın :) ustalarımız eksikleri tamamlayıp, yanlış kısımları düzeltecektir.
 
Katılım
6 Mayıs 2014
Mesajlar
264
Excel Vers. ve Dili
office 365
Altın Üyelik Bitiş Tarihi
23-06-2021
GoTo 10 için de, 10 yerine istediğiniz bir değişken yazabilirsiniz.
Örnek olarak, If wf.Count(s1.Range("A" & ii & ":" & "E" & ii)) = 0 Then GoTo gec
Bu satırın anlamı, A ve E arasındaki hücrelerde değer yoksa diğer satıra geç, bu nedenle Next ii satırından önce yazılmış.
Ben bunu a sayfasındaki 4-13 arasındaki satır sayısı sanmıştım.
İşte benim kod ile ilgili temel bilgilerim eksik. Bu yüzden zorlanıyorum. Formüllere başladığımda da zorlanmıştım. Sizlerden gelen cevaplardaki kodları arşivleyip sonra kendi dosyalarıma uyarlamaya çalışıyorum. Ama saatlerce uğraşmama rağmen her zaman başarılı olamıyorum. Bazen bir kodun yanlış yerini değiştiriyorum. Bazen yanlış yere ekleme yapıyorum vs. İşte böyle sora sora, deneye deneye öğrenmeye çalışıyorum.
İkinize de teşekkür ederim.
 

AdemCan

Altın Üye
Destek Ekibi
Katılım
1 Eylül 2008
Mesajlar
1,386
Excel Vers. ve Dili
2019 TR
Deneme yanılma güzel bir öğrenme yöntemi bence :) bu yöntem ile birçok kez Excel'i kitlediğim oluyor.

*Kodların nasıl bir işlem yaptığını, VBA ekranında kod satırlarını F8 ile adım adım ilerleterek takip edebilirsiniz.
Forum üzerindeki örnekler güzel bir kaynak, bunun yanında YouTube üzerinde de makro anlatımları için videolar bulunmaktadır.
 
Üst