2016-06-06 5 views
5

यह एक समस्या है जिसे मैंने खोजा, फिर हल किया, खुद और चूंकि मुझे इस विषय पर कोई सवाल नहीं मिला, मुझे लगा कि मैं भविष्य के संदर्भ के लिए एक बनाउंगा।दिन() अमान्य इनपुट पर 30 क्यों लौटाता है?

debug.Print day(ow) 
30 

क्यों नहीं करता है ':

मैंने गलती

debug.Print day(ow) 

के बजाय

debug.Print day(now) 

लिखा था मेरे आश्चर्य करने के लिए, बल्कि एक त्रुटि फेंक से, मैं बजाय निम्नलिखित परिणाम मिला इनपुट के रूप में एक अन-प्रारंभिक चर दिए जाने पर यह एक त्रुटि फेंकता है?

+0

शायद यह समझाएगा? https://social.msdn.microsoft.com/Forums/office/en-US/f1eef5fe-ef5e-4ab6-9d92-0998d3fa6e14/what-is-story-behind-december-30-1899-as-base-date? फोरम = accessdev – tjb1

उत्तर

6

सरल उत्तर डिफ़ॉल्ट मान है।

निम्नलिखित परिणाम निदर्शी है:

debug.Print day(0) 
30 

क्यों? क्योंकि वीबीए कैलेंडर में Day(0) दिनांक 30/12/1899 है। निम्नलिखित द्वारा प्रदर्शन:

debug.Print format(Cdate(0), "dd/mm/yyyy") 
30/12/1899 

जब तक आप अपने मॉड्यूल के शीर्ष पर Option Explicit लिखते हैं, VBA आप अनायास चर बनाने का प्रयोग के पहले बिंदु पर अनुमति देता है (Variant प्रकार के रूप में)।

जब एक चर बनाया गया है (लेकिन सेट नहीं है) यह अपने 'डिफ़ॉल्ट मान पर सेट है। नमूना डिफ़ॉल्ट मान:

Long --- 0 (Date, Integer, सहित अन्य numerics, के लिए एक ही Byte, Double आदि)
Boolean --- False (जो, VBA के अनुमोदक प्रकार प्रणाली में, 0 लिए मजबूर किया जा सकता है)
Variant --- Empty (जो भी 0 लिए मजबूर किया जा सकता है)
String --- Zero-Length-String ("") (जो , वास्तव में, 0 लिए मजबूर नहीं किया जा सकता, और यदि आप Day("") मुद्रित करने के लिए) की कोशिश में एक त्रुटि फेंक होगा
Any Object --- Nothing

,210

इसलिए, यदि आप लिखना Debug.Print Day(Var) और Var किसी भी संख्यात्मक डेटा प्रकार, या एक बूलियन, या एक संस्करण (या कभी नहीं पहली जगह में घोषित) तो यह Day(0) जो 30 के उत्पादन में जैसा कि ऊपर देखा देता है मजबूर हो जाएगा।


प्रश्न में विशिष्ट स्थिति में:

VBA ow एक अघोषित चर के रूप में पहचानता है, तो यह यह बनाता है (और एक Variant डेटा प्रकार के लिए यह initialises) और Day() को पास कर देता। चूंकि यह एक संस्करण है, इसकी प्रारंभिक मान Empty है जिसे उसके बाद 0 पर ले जाया गया है, जिसके परिणामस्वरूप Day(0) है जो 30 देता है।

+4

इसमें एक व्यापक उत्तर होने की संभावना है (मेरे विपरीत जो यातायात रोशनी के एक सेट पर आईफोन पर टैप किया जा सकता था), खासकर अगर आप 'विकल्प स्पष्टीकरण' का उल्लेख करते हैं। कृपया मेरे उत्तर से इसे लेने में संकोच न करें। – Bathsheba

+0

कभी-कभी मैं स्टैक ओवरफ़्लो की FGITW वास्तविकता ^^ भूल जाता हूं। करूँगा। – Kaz

7

जब तक आप अपने मॉड्यूल के शीर्ष पर Option Explicit लिखते हैं, तो वीबीए आपको उपयोग के पहले बिंदु पर स्वचालित रूप से चर (जैसे Variant प्रकार) बनाने की अनुमति देता है।

ऐसे चर प्रभावी ढंग से शून्य-प्रारंभिक होते हैं।

तो day(ow)day(0) के बराबर है जो 30 का मूल्यांकन करता है। (30-दिसंबर -18 99 के अनुरूप)।

संबंधित मुद्दे