fx Macro Recorder & VBA Basics
ENहिन्दी

For / For Each लूप, If, With ब्लॉक

⏱ 13 min

आप क्या सीखेंगे

  • अभ्यास शीट "Data"
  • For … Next — गिनती वाला लूप
  • If … ElseIf … Else

समझिए

1. अभ्यास शीट "Data"

A B C D
1 Product Qty Rate Status
2 Laptop 12 55000
3 Mobile 3 18000
4 Chair 0 4500
5 Desk 8 12000

2. For … Next — गिनती वाला लूप

Dim i As Long
For i = 2 To lastRow
    ws.Cells(i, 5).Value = ws.Cells(i, 2).Value * ws.Cells(i, 3).Value
Next i

i की वैल्यू 2, 3, 4 … lastRow होती जाती है। अंदर Cells(i, …) मौजूदा रो की ओर इशारा करता है।

Step छलांग बदलता है: For i = 2 To 100 Step 2 (एक छोड़कर एक रो), For i = lastRow To 2 Step -1 (उल्टा)।

3. If … ElseIf … Else

If ws.Cells(i, 2).Value = 0 Then
    ws.Cells(i, 4).Value = "Out of stock"
ElseIf ws.Cells(i, 2).Value < 5 Then
    ws.Cells(i, 4).Value = "Reorder"
Else
    ws.Cells(i, 4).Value = "OK"
End If

शर्तें And, Or, Not से जोड़ें — Excel के AND/OR की तरह।

4. पूरा उदाहरण

Option Explicit

Sub StockStatus()
    Dim ws As Worksheet, lastRow As Long, i As Long, qty As Long
    Set ws = ThisWorkbook.Worksheets("Data")
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    For i = 2 To lastRow
        qty = ws.Cells(i, 2).Value
        If qty = 0 Then
            ws.Cells(i, 4).Value = "Out of stock"
            ws.Cells(i, 4).Interior.Color = RGB(255, 199, 206)
        ElseIf qty < 5 Then
            ws.Cells(i, 4).Value = "Reorder"
            ws.Cells(i, 4).Interior.Color = RGB(255, 235, 156)
        Else
            ws.Cells(i, 4).Value = "OK"
            ws.Cells(i, 4).Interior.ColorIndex = xlNone
        End If
    Next i
End Sub

नतीजा: OK, Reorder, Out of stock, OK।

5. For Each — ऑब्जेक्ट पर लूप

गिनती की ज़रूरत नहीं; रेंज के हर सेल या हर शीट पर लूप:

Dim c As Range
For Each c In ws.Range("B2:B" & lastRow)
    If c.Value < 5 Then c.Font.Color = vbRed
Next c

Dim sh As Worksheet
For Each sh In ThisWorkbook.Worksheets
    Debug.Print sh.Name
Next sh

c.Offset(0, 2) उसी रो के दूसरे कॉलम तक पहुँचता है।

6. रो डिलीट करना — उल्टा लूप चलाएँ

रो 4 डिलीट करने पर रो 5 ऊपर रो 4 में आ जाती है, इसलिए सीधा लूप उसे छोड़ देता है। हमेशा नीचे से ऊपर डिलीट करें:

For i = lastRow To 2 Step -1
    If ws.Cells(i, 2).Value = 0 Then ws.Rows(i).Delete
Next i

7. Exit For

जो चाहिए वह मिल जाए तो जल्दी रुकें:

For i = 2 To lastRow
    If ws.Cells(i, 1).Value = "Desk" Then
        MsgBox "Desk found in row " & i
        Exit For
    End If
Next i

8. With — ऑब्जेक्ट दोहराना बंद करें

With ws.Range("A1:D1")
    .Font.Bold = True
    .Font.Size = 12
    .Interior.Color = RGB(31, 78, 120)
    .Font.Color = vbWhite
    .HorizontalAlignment = xlCenter
End With

. से शुरू होने वाली हर लाइन With वाले ऑब्जेक्ट की बात करती है। छोटा और थोड़ा तेज़।

आम गलतियाँ

रो डिलीट करते समय सीधा लूप। Next i या End If भूल जाना (compile error)। बहुत बड़ी रेंज पर सेल-दर-सेल लूप — कुछ हज़ार रो तक ठीक; उससे ज़्यादा के लिए लेसन 7 की array तरकीब देखें।

अभ्यास

mediumStockStatus को आगे बढ़ाएँ: कॉलम E में Amount (Qty × Rate) भी लिखें, गिनें कि कितने आइटम को reorder चाहिए, और आख़िर में MsgBox में गिनती दिखाएँ। फिर उल्टे लूप से सारी "Out of stock" रो डिलीट करने वाला दूसरा मैक्रो लिखें।
हर data row में E = B*C लिखें और Qty < 5 पर reorderCount बढ़ाएँ। Loop के बाद एक MsgBox दिखाएँ। Out of stock rows हटाने में For i = lastRow To 2 Step -1 लें ताकि अगली row न छूटे। Starter Data में Qty < 5 वाली 15 और zero-stock वाली 3 rows हैं।

प्रश्नोत्तरी

रो डिलीट करने के लिए लूप की दिशा?
नीचे से ऊपर, Step -1
हर शीट पर जाने के लिए कौन-सा लूप?
For Each
With के अंदर . से शुरू होने वाली लाइन किसकी बात करती है?
With वाले ऑब्जेक्ट की
For / For Each लूप, If, With ब्लॉक · हिंदी | ExcelWalaa