2016-02-18 15 views
6

बीती रात मैं कुछ है कि मुझे एक अच्छा दस के लिए पागल कर दिया में भाग, पंद्रह मिनट इससे पहले कि मैं यह समझ से बाहर। लेकिन मुझे समझ में नहीं क्यों यह इस तरह से है, किसी को यहाँ तो मैं आशा करती हूं कि स्पष्ट कर सकते हैं।आउटपुट

VBA आईडीई में तत्काल खिड़की से:

?Format(0.5, "HH:MM AM/PM") 
12:00 PM 
?Format("0.5", "HH:MM AM/PM") 
12:05 AM 
?Format(CDbl("0.5"), "HH:MM AM/PM") 
12:00 PM 

this page से मुझे लगता है कि 0.5, 12:00 PM अनुरूप होना चाहिए के बाद से एक घंटे ०.०४१६६ है ... ((12 * (1/24) = 0.5))। और जैसा कि आप देख सकते हैं, यह तब होता है जब मैं Format() पर नंबर पास करता हूं लेकिन यदि मैं स्ट्रिंग के समान नंबर पास नहीं करता हूं।

एक ही पृष्ठ से जानकारी के अनुसार, 1 मिनट 0.०,००,६९,४४४ ((1/(24*60))) है ..., 12:05 अर्थ के रूप में 0.००,३४,७२,२२२ ((0 * (1/24)) + (5 * (1/(24*60)))) Excel में संग्रहित किया जाना चाहिए। और, वास्तव में:

?Format(0.003472222, "HH:MM AM/PM") 
12:05 AM 

कुछ और विषमताएं मुझे समझ नहीं आता:

?Format(2.5, "HH:MM AM/PM") 
12:00 PM 
?Format("2.5", "HH:MM AM/PM") 
02:05 AM 

लेकिन ...

?Format(2.523, "HH:MM AM/PM") 
12:33 PM 
?Format("2.523", "HH:MM AM/PM") 
12:33 PM 

सब कुछ मैं दस्तावेज में पा सकते हैं का कहना है कि "टाइम्स हैं वास्तविक संख्या के हिस्से के रूप में संग्रहीत। दशमलव के दाईं ओर मान समय का प्रतिनिधित्व करते हैं। उदाहरण के लिए, दोपहर (12:00 अपराह्न) 0.5 का प्रतिनिधित्व करता है। " (से Excel 2010 के अंतर्निहित VBE शब्दावली) तो 2.5 के बाद से दशमलव के दाईं ओर भाग 0.5 है और 2.5230.523 = (12 * (1/24)) + (33 * (1/(24*60))) के बाद से 12:33 में परिणाम चाहिए 12:00 PM एक समय में परिणाम चाहिए। लेकिन वीबीए केवल उनमें से एक के लिए सही परिणाम देता है।

तो क्या कोई समझा सकता है क्यों वीबीए प्रदर्शित करता है जो असंगत व्यवहार प्रतीत होता है? या क्या मैं कुछ झुर्रियों में लापता हूं?

यह Excel 2010 में परीक्षण किया गया था और 2013

+1

और यही कारण है कि स्पष्ट प्रकार महत्वपूर्ण हैं और वीबीए आपके लिए निहित रूपांतरण करने देता है, इस भाषा को इतने सारे लोगों के लिए एक हेडक्रैचर बनाता है। अच्छा लेख! –

उत्तर

4

आप एक डबल करने के लिए 0.5 बदलने की उम्मीद Format, लेकिन ऐसा नहीं है। https://msdn.microsoft.com/en-us/library/ee198964.aspx के अनुसार, दिनांक निहित देना रूपांतरण के लिए स्ट्रिंग चला जाता है

  • यदि यह एक तिथि/समय, समय, या तिथि (इसी क्रम में) है, एक तारीख को परिवर्तित।
  • यदि यह एक डबल की सीमा में है, तो इसे एक तिथि तक एक डबल में परिवर्तित करें।
  • यदि उनमें से कोई भी, एक त्रुटि लौटाता है।

चूंकि यह एक डबल में परिवर्तित नहीं हो रहा है, यह पहली बुलेट पर परिवर्तित होना चाहिए। और यह है। यह मान रहा है कि "0.5" एक समय है। https://msdn.microsoft.com/en-us/library/dn528865.aspx के अनुसार, एक दशमलव बिंदु एक वैध समय विभाजक है।

time-separator = *WSC (":"/".") *WSC 
+0

उत्कृष्ट लिंक जो मैंने जो व्यवहार देख रहे थे, पूरी तरह से समझाया, धन्यवाद! –

2

अंतर यह है कि आप एक Double और एक String फ़ॉर्मेट करने के लिए VBA पूछ रहे है। आप वीबीए को डबल वैल्यू के समान स्ट्रिंग वैल्यू की व्याख्या करने की उम्मीद कर रहे हैं।

यदि आपके पास मध्यरात्रि का प्रतिनिधित्व करने वाली स्ट्रिंग है, तो यह 12:00 AM या 00:00 (24 घंटे प्रारूप में) हो सकती है। VBA या तो : या एक ही तरीके से . के रूप में विभाजक की व्याख्या कर रहा है। इसलिए String मध्यरात्रि के बाद पांच मिनट का प्रतिनिधित्व करने के लिए स्वरूपित, आप 12:05 AM, 00.05, 0.5, 0:05, या 0:5 लिख सकते हैं। फ़ंक्शन CDATE पर भी देखें।

तार के सभी, जब Double करने के लिए परिवर्तित एक ही परिणाम दे:

?Cdbl(CDate("00.05")) 
3.472222222222222E-02