मैजिक नंबर से बचें
नीचे दी गई तालिका को VBA में संचालित करते समय, आप क्या करेंगे?
नंबर | नाम | पता | फोन नंबर | उत्पाद | विकल्प |
---|---|---|---|---|---|
1 | सतो | होक्काइडो | 090-0000-000 | खिलौना | विकल्प 1 |
2 | तनाका | आओमोरी | 090-1111-111 | मिठाई | विकल्प 2 |
3 | होंडा | अकिता | 090-2222-222 | खेल | विकल्प 3 |
4 | ओकामोटो | निइगाता | 090-3333-333 | खेल | विकल्प 4 |
5 | यामादा | यामागुची | 090-4444-444 | जूते | विकल्प 5 |
प्रोग्रामिंग में, मैजिक नंबर से बचना चाहिए।
VBA के अलावा अन्य भाषाओं में, थोड़ा सीखने के बाद मैजिक नंबर का उपयोग शायद ही होता है, लेकिन VBA में इसे टालना मुश्किल हो सकता है।
कारण व्यक्तिगत हो सकते हैं, लेकिन मुख्य रूप से निम्नलिखित कारण हो सकते हैं:
- अधिकांश डेटा शीट या CSV में होता है
- मेमोरी प्रबंधन जटिल है, और मेमोरी उपयोग और पठनीयता अक्सर विपरीत होते हैं
- वर्तमान प्रमुख भाषाओं से अलग व्यवहार (कौशल का मुद्दा)
डेटा की प्रकृति के कारण, बिना सोचे-समझे कोडिंग करने पर मैजिक नंबर स्वाभाविक रूप से उत्पन्न हो जाते हैं। इस लेख में, मैं अपने पसंदीदा समाधान कोड के साथ साझा करूंगा।
समाधान
व्यक्तिगत रूप से अनुशंसित, Collection और Dictionary
व्यक्तिगत रूप से सबसे अनुशंसित तरीका है, Collection ऑब्जेक्ट और Dictionary ऑब्जेक्ट का उपयोग करके, एसोसिएटिव एरे पैटर्न। जो लोग जावास्क्रिप्ट जैसी भाषाओं में json फाइलों के साथ काम करते हैं, उनके लिए यह तरीका परिचित हो सकता है।
________________________________
'
' निर्दिष्ट Range को एसोसिएटिव एरे में बदलता है
'
' @param r बदलने के लिए Range ऑब्जेक्ट
' @return एसोसिएटिव एरे
'
________________________________
Public Function GetCollection(ByRef r As Range) As Collection
Dim items As Collection, item As Object
Set items = New Collection
Dim row As Long, col As Long
For row = 2 To r.Rows.Count
Set item = CreateObject("Scripting.Dictionary")
For col = 1 To r.Columns.Count
item.Add r(1, col).Value, r(row, col).Value
Next col
items.Add item
Next row
Set GetCollection = items
End Function
2D एरे की तरह उपयोग किए जा सकने वाले Range ऑब्जेक्ट को एसोसिएटिव एरे में बदलना अतिरेक लग सकता है, लेकिन पठनीयता के मामले में यह तरीका सबसे अच्छा है।
बदलने के बाद का Range ऑब्जेक्ट json फाइल की तरह दिखेगा:
{
"1": {
"नंबर": "1",
"नाम": "सतो",
"पता": "होक्काइडो"
"फोन नंबर": "090-0000-000",
"उत्पाद": "खिलौना",
"विकल्प": "विकल्प 1"
},
"2": {
"नंबर": "2",
"नाम": "तनाका",
"पता": "आओमोरी"
"फोन नंबर": "090-1111-111",
"उत्पाद": "मिठाई",
"विकल्प": "विकल्प 2"
},
"3": {...},
"4": {...},
"5": {...}
}
डेटा निकालते समय, निम्नलिखित तरीके से करें:
Dim items as Collection
Set items = GetCollection(Range)
items(1)("नाम") ' → "सतो"
इटरेटर (for each) का उपयोग करने पर यह और भी स्पष्ट हो जाता है:
Dim items as Collection, item as Object
Set items = GetCollection(Range)
For Each item in items
item("नाम") ' → "सतो", "तनाका"...
next
इस समाधान के कुछ नुकसान हैं, जैसे गति। डेटा को दो बार लूप करने के कारण (एरे निर्माण और वास्तविक प्रक्रिया), गति कम हो जाती है। दूसरा, हेडर पंक्ति के मानों में कोई डुप्लिकेट नहीं होना चाहिए। यदि डुप्लिकेट हैं, तो अन्य विधियों का उपयोग करें।
अधिकांश के लिए Enum
मैजिक नंबर से बचने का सबसे सामान्य तरीका है Enum का उपयोग। यह Collection और Dictionary से अधिक सरल और मेंटेनेंस में आसान है।
Enum TableColumn
नंबर = 1
नाम = 2
पता = 3
फोन नंबर = 4
उत्पाद = 5
विकल्प = 6
End Enum
यह केवल स्थिरांक समूह को परिभाषित करता है, इसलिए इसे कॉल करना आसान है। पहले से बने प्रोग्राम में मैजिक नंबर को हटाना भी आसान है।
Range(1, TableColumn.नाम).value ' → "सतो"
लूप करने के लिए निम्नलिखित तरीके का उपयोग करें:
Dim i as Long
For i = 1 to Range.Rows.Count
Range(i, TableColumn.नाम).value ' → "सतो", "तनाका"...
Next
इस विधि के कोई विशेष नुकसान नहीं हैं। यदि संदेह हो, तो इस विधि का उपयोग करें।
सबसे सरल, स्थिरांक
यह विधि सबसे तेज़ है, लेकिन इसे सभी जानते हैं, इसलिए इसे शामिल करने में संकोच हुआ। हेडर कॉलम को एक-एक करके परिभाषित करना सबसे तेज़ है।
Private Const TABLE_COLUMN_नंबर As Long = 1
Private Const TABLE_COLUMN_नाम As Long = 2
Private Const TABLE_COLUMN_पता As Long = 3
Private Const TABLE_COLUMN_फोन_नंबर As Long = 4
Private Const TABLE_COLUMN_उत्पाद As Long = 5
Private Const TABLE_COLUMN_विकल्प As Long = 6
स्कोप और प्रकार को सक्रिय रूप से निर्दिष्ट करने के कारण, यह सबसे तेज़ है। हालांकि, सबसे भारी हिस्सा लूपिंग है, इसलिए Enum के साथ कोई बड़ा अंतर नहीं है। यदि कोई कोडिंग नियम नहीं है, तो Enum का उपयोग करें।