• DİKKAT

    DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
    Altın Üyelik Hakkında Bilgi

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

Katılım
29 Ocak 2024
Mesajlar
277
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.
 
Kodunuzun geri kalanı çalışıyor mu peki?
 
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.
 
Şö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
 
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
 
Döngü içindeki lastrow u tekrar hesaplamanın bir anlamı yok.
Silin ve tekrar deneyin.
 
Geri
Üst