# 12.10 For, For Each आणि Do loops

Source: https://ravindrabagale.com/mr/excel/ch12-macros-and-vba/12-10-loops-for-for-each-and-do.html
Language: mr (Marathi with English technical terms)

एकच काम अनेक rowsवर करायला loop वापरतो. For counterवर, For Each objectsवर आणि Do conditionवर चालतो.

Sub LoopExamples()
    Dim ws As Worksheet
    Dim r As Long
    Dim cell As Range
    Dim total As Double

    Set ws = ThisWorkbook.Worksheets("Orders")

    ' 1) For...Next with a counter: mark late deliveries
    For r = 2 To 11
        If ws.Cells(r, 8).Value > 15 Then
            ws.Cells(r, 10).Value = "Late"
        Else
            ws.Cells(r, 10).Value = "On time"
        End If
    Next r

    ' 2) For Each over cells: add up delivered amounts
    For Each cell In ws.Range("G2:G11")
        If cell.Offset(0, 2).Value = "Delivered" Then total = total + cell.Value
    Next cell
    Debug.Print "Delivered sales: "; total

    ' 3) Do While: move down until an empty cell
    r = 2
    Do While ws.Cells(r, 1).Value <> ""
        r = r + 1
    Loop
    Debug.Print "First empty row: "; r
End Sub

Code समजून घेऊ

For r=2 To 11 प्रत्येक rowच्या Hमधले Mins पाहून Jमध्ये Late/On time लिहितो. J आधी reserved/रिकामा आहे का पाहा.

For Each G2:G11मधली Amount घेऊन दोन columns उजवीकडचा Status Delivered असेल तर total वाढवतो.

Do While A columnमध्ये पहिला blank येईपर्यंत r वाढवतो. हा first blank शोधतो; last data row नाही.

स्वच्छ mini sampleमध्ये rows 6,8,11 Late; Delivered sales 2215; first blank row 12. Invalid Mins, errors किंवा sourceमधल्या gapsसाठी हा छोटा example अतिरिक्त validationशिवाय वापरू नका.

इतर forms: For r = lastRow To 2 Step -1, Do Until ... Loop, Exit For, Exit Do. Do loopचा counter वाढला नाही तर infinite loop होऊ शकतो; Esc/Ctrl + Breakने interrupt करता येऊ शकतं.

Practice

Delivery-fee slabs वापरून नवीन reserved columnमध्ये fee लिहा. वेगळ्या disposable copyवर Cancelled rows delete करणारा backward loop करा; आधी expected deletion count दाखवा आणि नंतर remaining totals तपासा.

रवींद्र बागले यांची tip

Rows delete करताना खालून वर जा; वरून गेल्यास पुढची row वर येते आणि skip होऊ शकते. नियमित filteringसाठी delete न करता report output वेगळा बनवणंही उपयोगी आहे.
