bir alanın son boş satırına nasıl gidebilirim?

mersilen

Destek Ekibi
Destek Ekibi
Katılım
31 Aralık 2009
Mesajlar
1,103
Excel Vers. ve Dili
excel 2007 türkçe
Excel Vers. ve Dili Ofis 2003
Merhaba
Bunu da bir deneyin
Makronun içinde sonsat diye kullanabilirsiniz.
Kod:
Private Sub CommandButton1_Click()
For Each h In Range("b26:ı43")
If h <> "" Then sonsat = h.Row: Cells(1, 1) = sonsat
Next
End Sub
Kod:
For Each h In Range("b26:ı43"): If h <> "" Then sonsat = h.Row: Next
 
Katılım
22 Ağustos 2011
Mesajlar
32
Excel Vers. ve Dili
2003 - türkçe
Halit Bey, Korhan Bey ve mersilen;
Kodlarınızı denedim ve gayet güzel çalıştıklarını gördüm. Emeklerinize sağlık. benim kodumunda gayet güzel çalışması benim açımdan sevindirici. Ne var ki hepimizin kodları da 1 seferlik çalışıyor. Yani eğer sadece kodlarımızın olduğu bir modül çalıştırırsak her seferinde doğru sonucu veriyor. elle bu alana bir bilgi girildiğinde de gayet güzel bir şekilde en son satırı bulabiliyor. kodlarımızı başka bir modül içinde sadece bulma amaçlı çalıştırırsak da her seferinde doğru sonucu buluyor. Ancak modulde komutlarımızdan sonraki satırda alana yönelik bir işlem yaptırdığımızda (örneğin: s3.Cells(sonsatir + 1, "B") = s2.Cells(i, 1)) kodlarımız bir daha asla doğru sonucu bulamıyor. sonsatir değişkeni artık her seferinde 0 değerini alıyor. dim satırıyla tanımlamamışsak da empty değerini alıyor. Bu arada Halit Bey, 2 tane örnek dosyam var. asıl dosya ddd.xls, diğeri sonuçta nasıl bir tablo yapmaya çalıştığıma dair örnek dosya. yani kodlarımızı ddd.xls üzerinde deniyorum.

modul4: son satır özellikle hatalı yazılmıştır.

Sub gyazilirapor()
Dim Alan As Range, sonsatir As Long
Application.ScreenUpdating = False
Set s1 = Sheets("gumruklu silo")
Set s2 = Sheets("renkler")
Set s3 = Sheets("gkroki")
s1son = s1.Cells(Rows.Count, 1).End(xlUp).Row
s2son = s2.Cells(Rows.Count, 1).End(xlUp).Row
Set Alan = Sheets("gkroki").Range("B25:I43")
For i = 3 To s2son
If WorksheetFunction.CountIf(s1.Range("G3:G19"), s2.Cells(i, 1)) > 0 Then
If WorksheetFunction.CountIf(s3.Range("B26:B43"), s2.Cells(i, 1)) = 0 Then
'sonsatir = Alan.Find(What:="*", After:=Adres.Cells(1), Lookat:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row
sonsatir = Sheets("gkroki").Range("B26:I43").Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 'alanın son dolu satir numarasını veriyor
s3.Cells(sonsatir + 1, "A").Interior.Color = s2.Cells(i, 2).Interior.Color
s3.Cells(sonsatir + 1, "B") = s2.Cells(i, 1) ' bu satır olmasa herşey normal gibi
End If
For k = 26 To 43
Set D = s3.Range("B26:B43").Find(firmaadi)
gemiadi = s1.Cells(i, "H")
If WorksheetFunction.CountIf(s3.Range("D26:D43"), gemiadi) = 0 Then
s3.Cells(WorksheetFunction.CountA(Range("B26:I43")) + 1, "D") = gemiadi 's2.Cells(i, 1)
End If
depokodu = Mid(s1.Cells(i, "B"), 6, 2)
If WorksheetFunction.CountIf(s3.Range("F26:F43"), depokodu) = 0 Then
bosaltimtarihi = s1.Cells(i, "P")
If WorksheetFunction.CountIf(s3.Range("I26:I43"), bosaltimtarihi) > 0 Then
If s3.Cells(WorksheetFunction.CountA(Range("B26:I43")), "F") = "" Then
s3.Cells(WorksheetFunction.CountA(Range("B26:I43")), "F") = depokodu
End If
doluf = s3.Cells(WorksheetFunction.CountA(Range("B26:I43")), "F")
s3.Cells(WorksheetFunction.CountA(Range("B26:I43")), "F") = doluf & "-" & depokodu
End If
End If
s3.mCells(WorksheetFunction.CountA(Range("B26:I43")), "I") = bosaltimtarihi
Next
End If
Next
End Sub
 
Katılım
22 Ağustos 2011
Mesajlar
32
Excel Vers. ve Dili
2003 - türkçe
Benim bu konudaki görüşüm: Sanırım excel, sayfayı ve alanı kaybediyor. ben bu kodlarla ilgili başka denemeler yaparken "runtime:91 object not set" hatası almıştım. bu gün bu hatayı araştırdım ve çoğunlukla aktif sayfa dışında bir sayfada işlem yapmaya çalışıldığında bu hatanın oluştuğunu öğrendim. bununla beraber kodlardan önce worksheets("gkroki").select kodu eklememe rağmen yine de sonuç değişmedi.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
43,029
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Merhaba,

Olayı yanlış yerden irdeleğimizi düşünüyorum.

"ddd" isimli dosyanızda tam olarak yapmak istediğiniz işlemi açıklarsanız kodu ona göre düzenleyebiliriz.
 
Katılım
22 Ağustos 2011
Mesajlar
32
Excel Vers. ve Dili
2003 - türkçe
Merhaba,

Olayı yanlış yerden irdeleğimizi düşünüyorum.

"ddd" isimli dosyanızda tam olarak yapmak istediğiniz işlemi açıklarsanız kodu ona göre düzenleyebiliriz.

Merhaba,
ddd dosyasında s1 deki tablodan (A3:S19) öncelikle firma adına göre, daha sonra gemi adına göre, daha sonra sözleşme bitiş tarihine göre verileri süzüp, s3'teki alana (B26:I43) aynı firma-aynı gemi-aynı sözleşme tarihine sahip kuyuları ayrı satırlarda değil, aynı satırda ve bu kuyularında miktarlarını da toplayarak "miktar" sütununa yazdırmak istiyorum. ortaya çıkacak tablo yaklaşık olarak Yeni excel sayfası olarak başlığa koyduğum dosyadaki gibi olacak. aslında büyük bir kısmı filtreleme. filtrelemeden ayrılan kısmı; aynı sözleşme tarihine sahip kuyuların tek hücreye yazılması ve bunların miktarlarının da toplanarak tek bir hücreye yazılması. Tabii bir de B26:I43 alanının altında başka veriler de olabileceğini gözönünde bulundurmamız gerekiyor.
Özetlersek: Aynı firmaya ait gemiler alt alta, herbir geminin aynı sözleşme tarihli kuyuları ve miktarları aynı satırda, aynı geminin sözleşme tarihi farklı olan herbir kuyusu ve miktarı alt alta gelecek.
Sonradan firma adına göre veya gemi adına göre renklendirmeler falan da yapılabilir. En altta özet miktar bilgisi, gemi sayısı, firma sayısı vb. bilgiler de yazdırılabilir. vb...
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
43,029
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Merhaba,

Aktarım yapıldıktan sonra "gkroki" sayfasındaki görünümün nasıl olması gerektiğini örnek dosyanıza ekleyip foruma yollarmısınız.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
43,029
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Kuyu bilgisini nerden elde ediyorsunuz?
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
43,029
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Merhaba,

Aşağıdaki kodu deneyiniz.

Kod:
Option Explicit
 
Sub RAPOR()
    Dim S1, S2, S3, X, Bul, Satir, Renk, Renk_Kodu, WF, Son
        
    Application.ScreenUpdating = False
    
    Set S1 = Sheets("gumruklu silo")
    Set S2 = Sheets("gkroki")
    Set S3 = Sheets("renkler")
    Set WF = WorksheetFunction
    
    S1.Range("IV:IV").Delete
    
    Son = S1.Cells(Rows.Count, "A").End(3).Row
    
    With S1.Range("IV3:IV" & Son)
        .Formula = "=G3&""#""&H3&""#""&P3"
        .Value = .Value
    End With
    
    S2.Range("A26:J65536").Clear
    S2.Range("F26:F65536").NumberFormat = "@"
    S2.Range("I26:I65536").NumberFormat = "m/d/yyyy"
    
    Satir = 26
    
    For X = 3 To S1.Cells(Rows.Count, "IV").End(3).Row
        Set Renk = S3.Range("A:A").Find(S1.Cells(X, "G"), , , xlWhole)
        If Not Renk Is Nothing Then Renk_Kodu = Renk.Offset(0, 1).Interior.ColorIndex
        
        If WF.CountIf(S2.Range("IV:IV"), S1.Cells(X, "IV")) = 0 Then
            S2.Cells(Satir, "A").Interior.ColorIndex = Renk_Kodu
            S2.Cells(Satir, "B") = S1.Cells(X, "G")
            S2.Cells(Satir, "D") = S1.Cells(X, "H")
            S2.Cells(Satir, "F") = Right(S1.Cells(X, "B"), 2)
            S2.Cells(Satir, "H") = S1.Cells(X, "C")
            S2.Cells(Satir, "I") = S1.Cells(X, "P")
            S2.Cells(Satir, "IV") = S1.Cells(X, "IV")
            Satir = Satir + 1
        Else
            Set Bul = S2.Range("IV:IV").Find(S1.Cells(X, "IV"), , , xlWhole)
            If Not Bul Is Nothing Then
                S2.Cells(Bul.Row, "F") = S2.Cells(Bul.Row, "F") & "-" & Right(S1.Cells(X, "B"), 2)
                S2.Cells(Bul.Row, "H") = S2.Cells(Bul.Row, "H") + S1.Cells(X, "C")
            End If
        End If
    Next
    
    S2.Range("A26:J65536").Sort Key1:=S2.Range("B26"), Order1:=xlAscending, Key2:=S2.Range("D26"), Order2:=xlAscending
    
    Son = S2.Cells(Rows.Count, "B").End(3).Row
    
    S2.Range("B26:C" & Son).Merge True
    S2.Range("D26:E" & Son).Merge True
    S2.Range("F26:G" & Son).Merge True
    S2.Range("I26:J" & Son).Merge True
    
    S1.Range("IV:IV").Delete
    S2.Range("IV:IV").Delete
    
    Set S1 = Nothing
    Set S2 = Nothing
    Set S3 = Nothing
    Set WF = Nothing
    
    Application.ScreenUpdating = True
 
    MsgBox "İşleminiz tamamlanmıştır.", vbInformation
End Sub
 
Katılım
22 Ağustos 2011
Mesajlar
32
Excel Vers. ve Dili
2003 - türkçe
Merhaba Korhan Bey,
kodu denedim, sorun yok gibi görünüyor. elinize sağlık. farklı bir mantıkla yazmışsınız, henüz kıt excel bilgimle anlamaya çalışıyorum. sanırım bir kaç sorum olacak.
 
Katılım
22 Ağustos 2011
Mesajlar
32
Excel Vers. ve Dili
2003 - türkçe
sorularım

1- With S1.Range("IV3:IV" & Son)
.Formula = "=G3&""#""&H3&""#""&P3"
.Value = .Value
End With
bu kod ne yapıyor?

2- If WF.CountIf(S2.Range("IV:IV"), S1.Cells(X, "IV")) = 0 Then
bu koda kadar s2.range("IV:IV") hiç geçmiyor, bu durumda zaten boş değil mi?
neden burda aratma yapıyoruz?

3- Set Bul = S2.Range("IV:IV").Find(S1.Cells(X, "IV"), , , xlWhole)
bu kod ne yapıyor? aradığı alan boş değil mi?

4- Son = S2.Cells(Rows.Count, "B").End(3).Row
neden programın sonunda bunu yapıyoruz? Son bir daha kullanılmayacak ki?

5- S2.Range("B26:C" & Son).Merge True
bu kod ne yapıyor?

6- son satırlardaki set S1... niye set ediyoruz? bir daha kullanılmayacaklar ki?
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
43,029
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Merhaba,

1- Bu kod bloğu ile sayfada yardımcı bir alan oluşturulmuştur. Veri olan satır kadar "gumruklu silo" isimli sayfanızda "IV" sütununda G-H-P sütunları birleştiriliyor. Bu birleştirilmiş veri alanı sorguda kolaylık olması için kullanılmıştır.

2- Hayır boş değil. Aşağıdaki kod satırı ile "gkroki" sayfasındaki "IV" sütunu dolduruluyor. Birinci maddedeki birleştirilmiş veri bu alana aktarılmaktadır. Bu işlem kodu hızlandırmak için kullanılmıştır.

Kod:
S2.Cells(Satir, "IV") = S1.Cells(X, "IV")
3- Hayır boş değil. Mükerrer verileri üst üste aktarmak için arama yapıyor. Bulduğu verinin satır numarasını kullanıyoruz.

4- Siz raporu aldığınız alanda birleştirilmiş hücreler kullanmışsınız. Bende bunu bozmak istemedim. Bu sebeple en son satır numarasını tesbit edip "merge" işlemi yapılacak alanı buldum. Bu sebeple "Son" değişkenini tekrar kullandım. Aslında "Satir" değişkenini de kullanabilirdik.

5- Rapor alınan alandaki hücreleri birleştiriyor.

6- Son satırdaki "Set" ifadeleri makro başlarken hafızaya aldığımız değişkenleri sıfırlamak (nothing) için kullanılmıştır.
 
Katılım
22 Ağustos 2011
Mesajlar
32
Excel Vers. ve Dili
2003 - türkçe
çok teşekkür ederim. iyi bayramlar.
 
Üst