For-next döngüsünde dinamik son satır

Katılım
29 Ocak 2024
Mesajlar
208
Excel Vers. ve Dili
Office 2016
Kıymetli hocalarım merhabalar,

Aşağıdaki döngüde her satır eeklendiği zaman son satır LastRow neden artmıyor?
ilk Lastrow değerine kadar döngüyü sürdürüyor, sonra döngüden çıkıyor,
oysa Lastrow değerinin dinamik olması gerekiyor

desteğiniz için şimdiden teşekkürler,

Kod:
Dim WSH As Worksheet
Dim lastRow As Long

Set WSH = Sayfa3

lastRow = WSH.Cells(WSH.Rows.Count, "A").End(xlUp).Row

s = 2: r = 1

For i = 2 To lastRow

    If WSH.Cells(i, 1) <> WSH.Cells(i + 1, 1) Then
    
        WSH.Rows(i + 1).Insert
   
        i = i + 1
        
    End If
    
    lastRow = WSH.Cells(WSH.Rows.Count, "A").End(xlUp).Row
    
Next i
iyi akşamlar.
 

ÖmerFaruk

Destek Ekibi
Destek Ekibi
Katılım
22 Ekim 2017
Mesajlar
4,878
Excel Vers. ve Dili
Microsoft 365 Tr-64
Kodunuzun geri kalanı çalışıyor mu peki?
 

volki_112

Altın Üye
Katılım
29 Eylül 2023
Mesajlar
733
Excel Vers. ve Dili
2019 Türkçe
Altın Üyelik Bitiş Tarihi
13-12-2029
Kıymetli hocalarım merhabalar,

Aşağıdaki döngüde her satır eeklendiği zaman son satır LastRow neden artmıyor?
ilk Lastrow değerine kadar döngüyü sürdürüyor, sonra döngüden çıkıyor,
oysa Lastrow değerinin dinamik olması gerekiyor

desteğiniz için şimdiden teşekkürler,

Kod:
Dim WSH As Worksheet
Dim lastRow As Long

Set WSH = Sayfa3

lastRow = WSH.Cells(WSH.Rows.Count, "A").End(xlUp).Row

s = 2: r = 1

For i = 2 To lastRow

    If WSH.Cells(i, 1) <> WSH.Cells(i + 1, 1) Then
   
        WSH.Rows(i + 1).Insert
  
        i = i + 1
       
    End If
   
    lastRow = WSH.Cells(WSH.Rows.Count, "A").End(xlUp).Row
   
Next i
iyi akşamlar.
yapay zeka cevabı

Aslında sorun şu:

Sen döngünün sınırını For i = 2 To lastRow ile belirlediğinde, VBA döngü başlarken lastRow değerini sabitler.
Yani, her döngü adımında sen lastRow = ... ile güncellesen bile For döngüsü bu yeni değeri dikkate almaz.

O yüzden, döngü eklenen satırları görmüyor ve ilk belirlenen lastRow değerinde sonlanıyor.

Çözüm 1: Do While Döngüsü Kullan

For yerine Do While döngüsü kullanırsan lastRow dinamik kalır:

Dim WSH As Worksheet
Dim lastRow As Long
Dim i As Long

Set WSH = Sayfa3

i = 2

Do While i <= WSH.Cells(WSH.Rows.Count, "A").End(xlUp).Row

If WSH.Cells(i, 1).Value <> WSH.Cells(i + 1, 1).Value Then
WSH.Rows(i + 1).Insert
i = i + 1 ' eklenen boş satırı atlamak için
End If

i = i + 1
Loop

Burada her turda güncel lastRow tekrar hesaplanıyor, dolayısıyla yeni eklenen satırlar da döngüye dahil oluyor.

Çözüm 2: For Döngüsüyle Ama Tersten Git

Alternatif olarak, sondan başa doğru gidersek lastRow sabit kalsa bile yeni satırlar sorun çıkarmaz:

Dim WSH As Worksheet
Dim lastRow As Long
Dim i As Long

Set WSH = Sayfa3

lastRow = WSH.Cells(WSH.Rows.Count, "A").End(xlUp).Row

For i = lastRow To 2 Step -1
If WSH.Cells(i, 1).Value <> WSH.Cells(i + 1, 1).Value Then
WSH.Rows(i + 1).Insert
End If
Next i

Burada tersten gittiğimiz için satır eklenmesi üstteki döngüyü etkilemez.

👉 Senin senaryonda dinamik lastRow istiyorsan Do While daha uygun.
Ama eğer sadece aralara boş satır eklemek gibi bir iş yapıyorsan, tersten For döngüsü daha güvenli ve hızlı olur.
 

ÖmerFaruk

Destek Ekibi
Destek Ekibi
Katılım
22 Ekim 2017
Mesajlar
4,878
Excel Vers. ve Dili
Microsoft 365 Tr-64
Şöyle kullanabilirsiniz.
C++:
Sub SatırEkle()
Dim WSH As Worksheet
Dim lastRow As Long, i As Long
    Set WSH = Sayfa1
    lastRow = WSH.Cells(WSH.Rows.Count, "A").End(xlUp).Row
    i = 2
    Do While i < lastRow
        If WSH.Cells(i, 1) <> WSH.Cells(i + 1, 1) Then
            WSH.Rows(i + 1).Insert
            i = i + 1
            lastRow = lastRow + 1
        End If
        i = i + 1
    Loop
End Sub
 
Katılım
29 Ocak 2024
Mesajlar
208
Excel Vers. ve Dili
Office 2016
yapay zeka cevabı

Aslında sorun şu:

Sen döngünün sınırını For i = 2 To lastRow ile belirlediğinde, VBA döngü başlarken lastRow değerini sabitler.
Yani, her döngü adımında sen lastRow = ... ile güncellesen bile For döngüsü bu yeni değeri dikkate almaz.

O yüzden, döngü eklenen satırları görmüyor ve ilk belirlenen lastRow değerinde sonlanıyor.

Çözüm 1: Do While Döngüsü Kullan

For yerine Do While döngüsü kullanırsan lastRow dinamik kalır:

Dim WSH As Worksheet
Dim lastRow As Long
Dim i As Long

Set WSH = Sayfa3

i = 2

Do While i <= WSH.Cells(WSH.Rows.Count, "A").End(xlUp).Row

If WSH.Cells(i, 1).Value <> WSH.Cells(i + 1, 1).Value Then
WSH.Rows(i + 1).Insert
i = i + 1 ' eklenen boş satırı atlamak için
End If

i = i + 1
Loop

Burada her turda güncel lastRow tekrar hesaplanıyor, dolayısıyla yeni eklenen satırlar da döngüye dahil oluyor.

Çözüm 2: For Döngüsüyle Ama Tersten Git

Alternatif olarak, sondan başa doğru gidersek lastRow sabit kalsa bile yeni satırlar sorun çıkarmaz:

Dim WSH As Worksheet
Dim lastRow As Long
Dim i As Long

Set WSH = Sayfa3

lastRow = WSH.Cells(WSH.Rows.Count, "A").End(xlUp).Row

For i = lastRow To 2 Step -1
If WSH.Cells(i, 1).Value <> WSH.Cells(i + 1, 1).Value Then
WSH.Rows(i + 1).Insert
End If
Next i

Burada tersten gittiğimiz için satır eklenmesi üstteki döngüyü etkilemez.

👉 Senin senaryonda dinamik lastRow istiyorsan Do While daha uygun.
Ama eğer sadece aralara boş satır eklemek gibi bir iş yapıyorsan, tersten For döngüsü daha güvenli ve hızlı olur.
Bilgilendirme için çok Teşekkürler Volkan Hocam
 

Necdet

Moderatör
Yönetici
Katılım
4 Haziran 2005
Mesajlar
15,565
Excel Vers. ve Dili
Ofis 365 Türkçe
Döngü içindeki lastrow u tekrar hesaplamanın bir anlamı yok.
Silin ve tekrar deneyin.
 
Üst