इटली से रेनाटो ने पूछा:
मैं एक सूची से चुनने के लिए VBA में एक कार्यपुस्तिका कैसे खोल सकता हूं? जब मैं मैक्रो रिकॉर्ड करता हूं, तो यह मैक्रो में चयनित फ़ाइल का नाम हार्ड-कोड करता है।
वीबीए में एक कमांड है जिसे गेटऑनफाइलनेम कहा जाता है। यह फ़ाइल ओपन बॉक्स प्रदर्शित करता है। आप एक निर्देशिका में नेविगेट कर सकते हैं, फ़ाइल का चयन करें और फिर खोलें पर क्लिक करें। इस बिंदु पर, कमांड फ़ाइल को नहीं खोलता है, यह केवल आपके प्रोग्राम में नाम वापस करता है। यहाँ उपयोग में कोड का एक उदाहरण है:
Sub TestIt() NewFN = Application.GetOpenFilename(FileFilter:="Excel Files (*.xls), *.xls", Title:="Please select a file") If NewFN = False Then ' They pressed Cancel MsgBox "Stopping because you did not select a file" Exit Sub Else Workbooks.Open Filename:=NewFN End If End Sub
रोजर पूछता है:
किसी फ़ाइल के बंद होने या सहेजे जाने से पहले उसे चलाने के लिए मैक्रो कैसे मिल सकता है?
मैक्रो को "ThisWorkbook" से जुड़े कोड फलक पर दर्ज करना होगा। सही ड्रॉपडाउन से, या तो पहले क्लिक करें या पहले से चुनें।
केन लिखते हैं:
मेरे पास एक वर्कशीट इवेंट हैंडलर है जो कम से कम 16 बार लूप करता है। क्या हो रहा है?
केन का हैंडलर सरल था - यदि प्रविष्टि गैर-संख्यात्मक थी तो यह प्रविष्टि को ऊपरी स्थिति में बदल देगी। यहाँ समस्या है। जब उन्होंने प्रवेश के मूल्य को ऊपरी मामले में बदल दिया, तो यह एक और कार्यपत्रक परिवर्तन है और घटना फिर से आग लग जाएगी। जब भी परिवर्तन ईवेंट में आग लगेगी, केन कार्यपत्रक को बदल देगा और मैक्रो को पुनरावर्ती कहा जा रहा था, जब तक कि कॉल स्टैक स्मृति से बाहर नहीं निकल जाता।
जब आप ऊपरी मामले में मान बदलते हैं तो समाधान अस्थायी रूप से घटनाओं को चलाने से रोकता है। आप Application.EnableEvents के मान को गलत में बदलकर ऐसा कर सकते हैं। यहाँ सही मैक्रो है:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range) If Not IsNumeric(Target.Value) Then Application.EnableEvents = False Target.Value = UCase(Target.Value) Application.EnableEvents = True End If End Sub
ब्रिटेन से एंडी आज का सबसे दिलचस्प सवाल पूछता है।
मेरे पास एक वर्कबुक में एक VBA रूटीन है जो कई अन्य वर्कबुक बनाता है। मैं प्रत्येक नई कार्यपुस्तिका में एक हाइपरलिंक को गतिशील रूप से जोड़ने में सक्षम होना चाहूंगा जो नई कार्यपुस्तिकाओं को बनाने वाली कार्यपुस्तिका पर वापस इंगित करेगा।
एंडी - यह एक अच्छा विचार है। आपके कोड को देखने के लाभ के बिना, मैं कुछ इस तरह की कल्पना कर सकता हूं:
Sub Testit() Creator = ActiveWorkbook.FullName '… . Andy's code to create the new workbook… . ActiveSheet.Hyperlinks.Add Anchor:=Range("A1"), Address:= _ Creator, TextToDisplay:="Click Here to Return to " & Creator End Sub