vba - क्यों कोशिकाएं(1,1)=500 * 100 अतिप्रवाह का कारण बनती हैं लेकिन 50000 * 100 नहीं है?





excel-vba (5)


विचार करें:

Sub add()
    'This works:
    Cells(1, 1) = CLng(500) * 100
    'as does this:
    Cells(2, 2) = 50000 * 100
End Sub

जाहिर है कि Integer पहली अभिव्यक्ति के लिए एक डिफ़ॉल्ट प्रकार का Integer चुन रहा था क्योंकि उस प्रकार के दाहिने हाथ पर शाब्दिक धारण करने के लिए वह प्रकार काफी बड़ा है। 50000 एक Integer लिए बहुत बड़ा है, इसलिए यह इसे Long व्याख्या करता है। CLng स्पष्ट रूप से Long पदोन्नति को ट्रिगर करता है।

खैर, मैंने अभी एक सरल सब बनाया है और यह अतिप्रवाह की त्रुटि देता है। हालांकि, मुझे कोड के साथ कुछ भी गलत नहीं दिख रहा है, और यह वास्तव में अजीब है क्योंकि 50000 * 100 500 * 100 से काफी बड़ा है।

sub add()
    'This will cause an overflow error
    cells(1,1) = 500 * 100
    'But this won't
    cells(2,2) = 50000 * 100
end sub



Integer लिए अधिकतम मूल्य 32767 और 50000 से अधिक इसे Long प्रकार के रूप में डाला जाता है। इस प्रकार परिणाम Long ठीक से फिट बैठते हैं। लेकिन पहले मामले में सब कुछ Integer प्रकारों के साथ किया जाता है और यह बहती है।

(Integer=500) * (Integer=100) = (Integer=50000)  'Overflow
(Long=50000) * (Integer=100) = (Long=5000000)    'Ok



यह इसलिए है कि वीबीए गणितीय अभिव्यक्तियों का मूल्यांकन कैसे करता है। अभिव्यक्ति का रिटर्न प्रकार अभिव्यक्ति या उसके निकटतम संख्यात्मक प्रकार समकक्ष में पहले ऑपरेंड का प्रकार होगा। हालांकि, अंतिम परिणाम उस रिटर्न प्रकार में फिट नहीं हो सकता है और अतिप्रवाह त्रुटि फेंक सकता है।

जब आप 500 * 100 करते हैं, तो वापसी प्रकार पूर्णांक होता है। जबकि जब आप 50000 * 100 करते हैं तो इस अभिव्यक्ति का रिटर्न प्रकार लंबा होता है।

अतिप्रवाह त्रुटि से बचने के लिए आप अपने इरादों को जानने के लिए एक स्पष्ट कलाकार कर सकते हैं

CLng(500) * 100




मुझे निम्न लिंक से जवाब मिला: माइक्रोसॉफ्ट से लिंक

ऐसा लगता है कि मैंने संख्या को एक प्रकार भी असाइन नहीं किया है, एक्सेल स्वचालित रूप से इसकी लंबाई के आधार पर इसे असाइन करता है। इस प्रकार, 500 को पूर्णांक के रूप में परिभाषित किया गया है और परिणाम 50,000 प्रकार पूर्णांक के लिए बहुत बड़ा है। इसीलिए।




सहायता से:
यदि वैरिएबल अनियमित है, या स्पष्ट रूप से खाली पर सेट किया गया है, तो क्या यह सही होता है; अन्यथा, यह झूठा रिटर्न देता है। यदि अभिव्यक्ति में एक से अधिक चर शामिल हैं तो झूठी हमेशा वापस आती है।
IsEmpty केवल वेरिएंट के लिए सार्थक जानकारी देता है

यह जांचने के लिए कि कोई सेल खाली है या नहीं, आप cell(x,y) = "" उपयोग कर सकते हैं।
आप अंततः Range("X:Y").SpecialCells(xlCellTypeBlanks) का उपयोग कर समय बचा सकते हैं Range("X:Y").SpecialCells(xlCellTypeBlanks) या xlCellTypeConstants या xlCellTypeFormulas





vba excel-vba