समझिए
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 भूल जाना।