बृहदान्त्र के बिना समय दर्ज करें - एक्सेल टिप्स

इस हफ्ते का एक्सेल सवाल ओकिनावा में तैनात जॉन से आया है।

मैं प्रस्थान और आगमन को प्रतिबिंबित करने के लिए एक एक्सेल स्प्रेडशीट का निर्माण कर रहा हूं। मूल रूप से तीन कोशिकाएँ होंगी: वास्तविक समय प्रस्थान, अनुमानित समय गणना और आगमन का अनुमानित समय। मैं चाहूंगा कि व्यक्ति केवल 2345 में प्रवेश कर सके (उदाहरण के लिए) और स्वचालित रूप से सेल को 23:45 दिखाने के लिए डिस्प्ले को प्रारूपित करेगा। सूत्र या स्वरूपण की परवाह किए बिना मुझे 0:00 मिल रहा है। और, यदि उपयोगकर्ता कुंजी और कोलन को शिफ्ट करने में विफल रहता है, तो गणना कुछ भी प्रदर्शित नहीं करेगी, लेकिन 0:00। मुझे पता है कि ऐसा करना सरल लगता है, हालांकि, हर थोड़ी-थोड़ी बची हुई दूसरी गणनाएँ, खासकर जब एक्सेल में बार-बार समान डेटा दर्ज करते हैं।

इस काम को करने के लिए, आपको एक इवेंट हैंडलर का उपयोग करना होगा। एक्सेल 97 में इवेंट हैंडलर नए थे और एक्सेल में रन अ मैक्रो एवरी टाइम सेल वैल्यू चेंजेस पर चर्चा की गई। हालांकि, उस टिप में वापस, घटना हैंडलर कुछ कोशिकाओं के लिए एक अलग प्रारूप लागू कर रहा था। यह एप्लिकेशन थोड़ा अलग है, इसलिए आइए इवेंट हैंडलर को फिर से देखें।

ईवेंट हैंडलर मैक्रो कोड का एक छोटा सा हिस्सा होता है जो हर बार एक निश्चित घटना को अंजाम देता है। इस मामले में, हम चाहते हैं कि जब भी आप सेल बदलें तो मैक्रो चले। ईवेंट हैंडलर सेट करने के लिए, इन चरणों का पालन करें:

  • एक इवेंट हैंडलर सिर्फ एक वर्कशीट से जुड़ा है। उस वर्कशीट से शुरू करें और VB एडिटर खोलने के लिए alt-F11 हिट करें।
  • ऊपरी बाएँ विंडो में (प्रोजेक्ट - VBA प्रोजेक्ट) अपनी वर्कशीट के नाम पर डबल क्लिक करें।
  • दाएँ फलक में, बाएँ ड्रॉप डाउन पर क्लिक करें और सामान्य रूप से वर्कशीट में बदलें।
  • राइट ड्रॉप डाउन में, Change चुनें।

इससे एक्सेल आपके लिए निम्नलिखित मैक्रो शेल को पूर्व-दर्ज करेगा:

Private Sub Worksheet_Change(ByVal Target As Range) UserInput = Target.Value If UserInput> 1 Then NewInput = Left(UserInput, Len(UserInput) - 2) & ":" & Right(UserInput, 2) Application.EnableEvents = False Target = NewInput Application.EnableEvents = True End If End Sub

किसी भी समय एक सेल को बदल दिया जाता है, जिस सेल को बदल दिया गया था उसे "लक्ष्य" नामक वैरिएबल में इस प्रोग्राम में पास किया जाता है। जब कोई कार्यपत्रक में एक बृहदान्त्र के साथ एक समय में प्रवेश करता है, तो यह एक से कम संख्या का मूल्यांकन करेगा। यदि ब्लॉक केवल कोशिकाओं को बदलना सुनिश्चित करता है यदि वे एक से अधिक हैं। मैं उपयोगकर्ता इनपुट को घंटों और मिनटों में तोड़ने के लिए बाएं () और दाएं () फ़ंक्शन का उपयोग करता हूं और बीच में एक कॉलन सम्मिलित करता हूं।

जब भी उपयोगकर्ता "2345" में प्रवेश करेगा, प्रोग्राम इस प्रविष्टि को 23:45 में बदल देगा।

संभव संवर्द्धन

यदि आप प्रोग्राम को केवल A & B पर काम करने के लिए सीमित करना चाहते हैं, तो आप Target.Cumn के मान की जांच कर सकते हैं और केवल तभी कोड ब्लॉक निष्पादित कर सकते हैं जब आप पहले दो कॉलम में हैं:

Private Sub Worksheet_Change(ByVal Target As Range) ThisColumn = Target.Column If ThisColumn 1 Then NewInput = Left(UserInput, Len(UserInput) - 2) & ":" & Right(UserInput, 2) Application.EnableEvents = False Target = NewInput Application.EnableEvents = True End If End If End Sub

यदि आप कभी भी कॉलन के बिना वर्कशीट में बदलाव करना चाहते हैं (उदाहरण के लिए आपको फॉर्मूले जोड़ने या शीर्ष लेख बदलने आदि की आवश्यकता है) तो आप इस छोटे मैक्रो के साथ ईवेंट हैंडलर को बदल सकते हैं:

Sub TurnEventHanderOff() Application.EnableEvents = False End Sub You can turn event handlers back on with this macro: Sub TurnEventHanderOff() Application.EnableEvents = True End Sub

यदि आप इस अवधारणा को लेते हैं और इसे बदलते हैं, तो इसके बारे में जागरूक होना एक महत्वपूर्ण अवधारणा है। जब ईवेंट हैंडलर मैक्रो लक्ष्य द्वारा संदर्भित सेल को एक नया मान प्रदान करता है, तो Excel इसे एक वर्कशीट परिवर्तन के रूप में गिनता है। यदि आप ईवेंट हैंडलर की संक्षेप में बारी नहीं करते हैं, तो एक्सेल पुन: ईवेंट हैंडलर को कॉल करना शुरू कर देगा और आपको अप्रत्याशित परिणाम प्राप्त होंगे। किसी परिवर्तन ईवेंट हैंडलर में किसी वर्कशीट में बदलाव करने से पहले, एप्लिकेशन के साथ ईवेंट हैंडलिंग को अस्थायी रूप से निलंबित करना सुनिश्चित करें।

दिलचस्प लेख...