मैजिक नंबर से बचें

नीचे दी गई तालिका को 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 का उपयोग करें।

#VBA