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

एरर हैंडलिंग और Application.ScreenUpdating = False की स्पीड तरकीब

⏱ 12 min

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

  • एरर हैंडलिंग के बिना क्या होता है
  • मानक पैटर्न
  • On Error Resume Next — सावधानी से

समझिए

1. एरर हैंडलिंग के बिना क्या होता है

ग़ायब शीट, बंद फ़ाइल या नंबर की जगह टेक्स्ट — मैक्रो रनटाइम एरर और Debug बटन के साथ रुक जाता है। ग़ैर-तकनीकी यूज़र के लिए यह उलझन भरा है — और आपने जो सेटिंग बदली थीं (जैसे ScreenUpdating) वे बंद ही रह सकती हैं।

2. मानक पैटर्न

Sub SafeMacro()
    On Error GoTo ErrHandler

    ' ... your code ...

CleanExit:
    ' restore settings here
    Exit Sub

ErrHandler:
    MsgBox "Error " & Err.Number & ": " & Err.Description, vbExclamation
    Resume CleanExit
End Sub
  • On Error GoTo ErrHandler — कोई भी लाइन फ़ेल हो तो लेबल पर कूदो।
  • हैंडलर से पहले Exit Sub — ताकि सामान्य रन उसमें न गिरे।
  • Resume CleanExit — सफ़ाई वाले हिस्से में जाओ, ताकि सेटिंग हमेशा वापस हों।

3. On Error Resume Next — सावधानी से

यह फ़ेल होने वाली लाइनें चुपचाप छोड़ देता है। इसे सिर्फ़ एक लाइन के आसपास इस्तेमाल करें जिसके फ़ेल होने की उम्मीद हो, फिर सामान्य हैंडलिंग वापस चालू करें:

Dim sh As Worksheet
On Error Resume Next
Set sh = ThisWorkbook.Worksheets("Report")
On Error GoTo ErrHandler

If sh Is Nothing Then
    Set sh = ThisWorkbook.Worksheets.Add
    sh.Name = "Report"
End If

पूरे मैक्रो में Resume Next चालू छोड़ना असली बग छिपा देता है।

4. स्पीड वाली सेटिंग

सेटिंग क्यों
Application.ScreenUpdating = False Excel हर बदलाव पर स्क्रीन दोबारा नहीं बनाता
Application.Calculation = xlCalculationManual हर सेल लिखने के बाद फ़ॉर्मूले दोबारा नहीं चलते
Application.EnableEvents = False हर बदलाव पर event मैक्रो (जैसे Worksheet_Change) नहीं चलते
Application.DisplayAlerts = False "क्या आप बदलना चाहते हैं?" जैसे पॉप-अप नहीं (वापस चालू करें!)

5. पूरा टेम्पलेट — स्पीड + सुरक्षा

Option Explicit

Sub FastAndSafe()
    Dim calcMode As XlCalculation
    calcMode = Application.Calculation

    On Error GoTo ErrHandler
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual

    ' ===== your code here =====

CleanExit:
    Application.Calculation = calcMode
    Application.EnableEvents = True
    Application.ScreenUpdating = True
    Exit Sub

ErrHandler:
    MsgBox "Something went wrong:" & vbCrLf & Err.Description, vbExclamation
    Resume CleanExit
End Sub

हर गंभीर मैक्रो के लिए इसे शुरुआती टेम्पलेट के रूप में सेव कर लें।

6. सबसे बड़ी स्पीड बढ़ोतरी: arrays

एक-एक सेल पढ़ना और लिखना VBA का सबसे धीमा हिस्सा है। पूरी रेंज एक बार मेमोरी में पढ़ें, वहीं काम करें, एक बार में वापस लिखें:

Dim data As Variant, i As Long
data = ws.Range("A2:C" & lastRow).Value     ' 2D array, starts at (1, 1)

For i = 1 To UBound(data, 1)
    data(i, 3) = data(i, 1) * data(i, 2)    ' column 3 = col1 × col2
Next i

ws.Range("A2:C" & lastRow).Value = data     ' one write

50,000 रो पर यह मिनटों को एक-दो सेकंड में बदल सकता है।

7. शुरू करने से पहले जाँचें

कई एरर पहले से पता होते हैं। जाँचें और दोस्ताना मैसेज के साथ बाहर निकलें:

If lastRow < 2 Then
    MsgBox "No data found on the Data sheet.", vbInformation
    GoTo CleanExit
End If

आम गलतियाँ

ScreenUpdating या Events बंद करना और एरर आने पर वापस चालू न करना (तब Excel ख़राब लगता है)। पूरे मैक्रो के लिए On Error Resume Next। एरर हैंडलर से पहले Exit Sub भूल जाना।

अभ्यास

mediumलेसन 6 के StockStatus मैक्रो को FastAndSafe टेम्पलेट में लपेटें। जाँच जोड़ें कि "Data" शीट मौजूद है। फिर 20,000 रो का टेस्ट डेटा बनाएँ और Timer से दोनों वर्ज़न (सेल-दर-सेल बनाम array) का समय नापें: vba Dim t As Double: t = Timer ' ... code ... Debug.Print "Seconds: "; Timer - t
पहले Calculation, EnableEvents और ScreenUpdating बचाएँ और Data sheet जाँचें। सफलता तथा error दोनों पर पुराने settings लौटाएँ। 20,000 rows एक Variant array में पढ़ें, memory में हिसाब करें और एक बार लिखें। Timer से पहले दोनों versions की values और counts मिलाएँ। जानबूझकर error देकर restoration जाँचें।

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

टेम्पलेट CleanExit लेबल क्यों इस्तेमाल करता है?
ताकि एरर के बाद भी सेटिंग वापस हों
कौन-सी सेटिंग स्क्रीन दोबारा बनाना रोकती है?
Application.ScreenUpdating = False
50,000 रो प्रोसेस करने का सबसे तेज़ तरीका?
array में पढ़ें, प्रोसेस करें, एक बार में वापस लिखें
एरर हैंडलिंग और Application.ScreenUpdating = False की स्पीड तरकीब · हिंदी | ExcelWalaa