2012-09-14 15 views
5

इस सवाल के लिए, मैं पद का उल्लेख नीचे अपने आप को स्पष्ट करने के लिए:
Why is my conditional format offset when added by VBA?.Select, .Activesheet, .Activecell आदि ...

कई, कई पदों मैं इन दिनों देखने में, ओपी के चुपचाप अनुमति दी जाती है उपयोग करने के लिए। सक्रिय करें, चयन करें, ओफसेट, आदि ... जबकि वे संभावित बग के लिए खुले दरवाजे हैं (अक्सर अंत उपयोगकर्ताओं के कारण)।
कोड कभी-कभी भी समर्थित है।

मेरा प्रश्न: क्या कोई वैध स्थिति है जहां आप इनमें से किसी भी कथन का उपयोग सीधे उपलब्ध विकल्पों के बिना करेंगे जो इन stmts के परिणामस्वरूप सामान्य बग पकड़ते हैं?

मैं गतिशील समाधान मेरी राय में एक चाहिए हैं कि जब Excel के लिए विकसित करने की बात कर रहा हूँ। व्यक्तिगत रूप से, 6 से अधिक वर्षों में मुझे एक ऐसे मामले को याद नहीं किया जा सकता जहां मुझे इसकी आवश्यकता थी; यह हमेशा उपलब्ध सबसे खराब विकल्पों में से एक माना जाता है। मेरी पिछली कंपनी में, यह एक मूक नियम था जिसका उपयोग कभी नहीं किया गया था और यह केवल मेरे वीबीए जीवन (और अंतिम उपयोगकर्ता का) बेहतर बना दिया।

मैं यह प्रश्न क्यों बना रहा हूं क्योंकि मुझे लगता है कि इन कथनों का उपयोग करते समय वे जो जोखिम उठाते हैं, उनके बारे में जागरूक वीबीए में नए आने वालों के लिए लायक है (अंत उपयोगकर्ता जब अप्रत्याशित कुछ करते हैं तो सिद्ध जोखिम का अनुभव करते हैं - अंत में वे डॉन करते हैं वीबीए के साथ कोई स्नेह नहीं है) और प्रत्यक्ष विकल्पों का प्रस्ताव देने के लिए (मैं यह नहीं कहूंगा कि मैंने हमेशा अपने सामने ऐसा किया है, लेकिन मुझे लगता है कि पहले से ही बग राक्षसों पर त्वरित समाधान देने में कुछ गड़बड़ है)।

मेरा मानना ​​है कि जब चुपचाप अनुमति दी जाती है (जो इसे स्वचालित रूप से इस मामले में बढ़ाती है), वीबीए डेवलपर्स शुरू करने से गलत तरीके से उपकरण बढ़ रहे हैं (और इस प्रकार नए आने वाले भी व्यवहार का वारिस करेंगे - जिसे वे स्टैक से भी सीखेंगे ओवरफ्लो क्योंकि Google उन परिणामों को लौटाता है जो वे देखते हैं (!))।
यदि डेवलपर को पता नहीं है कि वह "चयन" का उपयोग क्यों कर सकता है और किस स्थितियों में यह एक संभावित बग है, तो उसे कभी भी इसका उपयोग नहीं करना चाहिए। व्यक्तिगत रूप से मैं गतिशील रेंज परिभाषा (बग मोड) पर कुछ त्वरित जांच करने के लिए तत्काल विंडो में चुनिंदा एसटीएम का उपयोग कर सकता हूं, लेकिन लिखित कोड में नहीं।

परिणाम अंत में वीबीए को और अधिक अलोकप्रिय बनाता है; परेशानी के मामले में भाषा पीड़ित बन जाएगी (फिर भी यह अभी भी "सर्वोत्तम" प्रोग्रामिंग समर्थन एक्सेल और एक्सेस अनुप्रयोगों के लिए उपलब्ध है)। मैंने देखा है कि यह एक बड़ी कंपनी में कई बार होता है जहां वीबीए हमेशा "बकवास" होता है।

यह केवल मेरा ही ईमानदार अनुभव है।
यह सही या गलत होने का सवाल नहीं है; मुझे प्रश्न पर आपके दृष्टिकोण को सुनने में दिलचस्पी है।

+0

प्रासंगिक: http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros –

उत्तर

2

एक्सेल में कुछ विधियां हैं जिन्हें सक्रिय या सक्रियशीट/सक्रिय वर्कबुक आदि की आवश्यकता होती है क्योंकि मुझे अवसर पर गॉथस के साथ पकड़ा गया है। इस समय मुझे याद रखने वाला एकमात्र ज़ूम संपत्ति है। ज़ूम केवल चादर है कि वर्तमान में विंडो में सक्रिय तो सभी पत्रक आप की तरह

Sub SetZoom() 
Dim ws As Worksheet 
    Application.screenupdating = false 

    For Each ws In Worksheets 
     ws.Select 
     ActiveWindow.Zoom = 80 
    Next ws 

    Application.screenupdating = true 
End Sub 
+0

ठीक है, यह मान्य प्रतीत होता है। इस मामले में आप सक्रिय रूप से ActiveWindow का उपयोग करेंगे क्योंकि इसका निष्क्रिय निष्क्रिय शीट पर ज़ूम करने का कोई उद्देश्य नहीं होगा। – Trace

3

कुछ मैं चुनें और सक्रिय करें, लेकिन नहीं ActiveWorkbook, ActiveSheet, और ActiveCell के बारे में सहमत आवश्यकता होगी ज़ूम करने के लिए (मैं मानता हूँ कि उनका दुरुपयोग किया जाए है को प्रभावित करता है , लेकिन यह नहीं कि उन्हें टालना चाहिए, प्रति से)। उन लोगों के लिए निश्चित रूप से वैध उपयोग हैं। मेरे पास एक ऐसा प्रोग्राम है जो "भरने वाली श्रृंखला" को स्वचालित करता है जो ActiveCell से ऐसा करता है। मेरा कार्यक्रम भविष्यवाणी नहीं कर सकता कि कौन सी कोशिकाओं का उपयोग किया जाएगा; यह उपयोगकर्ता इसे चुनने के लिए है। वह यूजर इंटरफेस का हिस्सा है।

हालांकि, तीन स्थितियां हैं जहां मुझे चयन का उपयोग करना पड़ता है (अब चार जो मैंने ज़ूम के बारे में पढ़ा है, लेकिन मैं इसका कभी भी उपयोग नहीं करता)।

  1. सशर्त स्वरूपण। एप्लिकेशन का उपयोग करने के आसपास एक काम है। कन्वर्टफॉर्मुला, लेकिन यह सिर्फ चयन को संग्रहित करने, सही सेल का चयन करने, कार्य करने और पिछले चयन को संशोधित करने से भी बदतर है।
  2. डेटा सत्यापन। इसी कारण से।
  3. आकार। काश मैं विवरण याद कर सकता था, लेकिन यह बहुत लंबा रहा है क्योंकि मैंने आकार के साथ काम किया है। ऐसा कुछ था जो मैं पहले आकार का चयन किए बिना नहीं कर सका।

चयन और सक्रियण का कोडिंग कोड एक महान लड़ाई है।

+0

मैं पूरी तरह से सहमत हूं, अगर उद्देश्य यह है कि उपयोगकर्ता को स्पष्ट रूप से एक सेल का चयन करने की आवश्यकता होती है जिस पर कार्रवाई की जाएगी। अन्य सभी मामलों में (जो कि मैं देखता हूं, उस समय के 99% प्रतिशत के मामले में यह मामला है), मैं श्रेणियों को एक गतिशील स्तर पर प्रारूपित/मान्य करने के लिए देखता हूं जिसे 'सक्रिय' होने की आवश्यकता नहीं होती है। यह क्यों होगा चयन के लिए, मुझे यह भी नहीं पता कि सशर्त स्वरूपण और डेटा सत्यापन को चुनने की आवश्यकता क्यों है ... आपको एक स्पष्ट वस्तु पहचान की आवश्यकता है, लेकिन अतिरिक्त आवश्यकता के रूप में क्यों चुना जा रहा है? श्रेणियों/सेल कंड स्वरूपण के लिए, यदि मैं फिर/चयन केस का उपयोग करता हूं; सब कुछ प्रोग्रामिंग के बाद। – Trace

+0

ठीक है, मैं इसे क्यों पोस्ट करता हूं क्योंकि यह मुझे बहुत परेशान करता है जब मैं चीजों को पढ़ता हूं: शीट्स (1)। सक्रिय करें -> ActiveSheet.range (x, y)। चयन करें आदि ... मैं इसे हाल ही में देखता हूं , मुझे बस इसका जवाब देना मुश्किल लगता है, भले ही मैं मदद करता हूं। लिंक में मैंने अपनी वर्तमान पोस्ट में उल्लेख किया है, उत्तर स्वीकार किया गया है: ActiveSheet.Range ("A1")। सक्रिय करें यह सिर्फ परेशानियों के लिए पूछ रहा है ... हालांकि, अगला व्यक्ति जो इसे पढ़ता है वही वही करेगा। और अंत में, वीबीए को एक ऐसी भाषा माना जाएगा जिसमें कई बग हैं। जो यह नहीं है। – Trace

+1

re # 3, चार्ट में श्रृंखला डेटा में स्वरूपण लागू करते समय मुझे कुछ उदाहरण मिले हैं, जहां 'चयन' कभी-कभी आवश्यक होता है। ऐसा लगता है कि आईएमओ एक्सेल के साथ एक बग होने के लिए और एक डिजाइन सुविधा नहीं है। शब्द एक अलग जानवर है, जो चयन ऑब्जेक्ट और पावरपॉइंट पर बहुत अधिक निर्भर करता है, कुछ प्रकार के ऑपरेशन भी होते हैं जिन्हें केवल तब किया जा सकता है जब एप्लिकेशन और स्लाइड/आकार दिखाई दे (जब इसका सख्ती से अर्थ नहीं होता है "सक्रिय ", यह कुछ अर्थों में समान है) –

1

आप .Select उपयोग यह निर्धारित करने के लिए क्या एक उपयोगकर्ता के दृश्य कोड चलाने के बाद है कर सकते हैं - उदाहरण के लिए यदि आप अपने कोड में एक नई कार्यपुस्तिका बनाने Activate या Select अपने उपयोगकर्ता का उपयोग कर पता नहीं हो सकता ऐसा होता है बिना।

मैं अक्सर एक नई कार्यपुस्तिका या

FinalViewWorkbook.FinalViewSheet.Range("A1").Select 

के साथ अन्य बड़े पैमाने पर डेटा जोड़तोड़ बनाने बस कुछ के बारे में अंत उपयोगकर्ता को सूचित करने के लिए एक लंबे आपरेशन खत्म - "ओह, इस रिपोर्ट का एक नया कार्यपुस्तिका बनाया!" आदि

+0

यह मेरे लिए भी वैध उपयोग लगता है। डेटा हेरफेर के लिए नहीं, बल्कि एक संकेत के रूप में। शायद इन बयानों के उपयोग के संबंध में नियमों का एक सेट स्थापित किया जाना चाहिए। – Trace

0

मुझे लगता है कि यह कुछ अलग करने के लिए इस मामले में महत्वपूर्ण है:

  • Active -something: इसका उपयोग तभी अगर यह पता है कि उपयोगकर्ता अभी से निपटने है बिल्कुल जरूरी है। मेरे अनुभव में, यह आमतौर पर डेटा सत्यापन या सक्रिय शीट डिटेक्शन होता है (उदाहरण के लिए "शीट अपडेट करें जहां उपयोगकर्ता ने केवल एक बटन दबाया")।
  • Selection: कुछ हद तक Active के समान, केवल पढ़ने के लिए उपयोग करें। डेटा सत्यापन के लिए या तो उपयोगकर्ता के लिए "सेल वैल्यू को पथ के रूप में व्याख्या करें और इसे एक नई एक्सप्लोरर विंडो में खोलें" के लिए उपयोगी।
  • Select, Activate: IMHO Selection से अलग है, क्योंकि यह वास्तव में, शीट आदि चयनित सेल में परिवर्तन कभी कभी उपयोग इस डेटा पढ़ने या लिखने के बाद से यह सिर्फ क्लिक करके गंदगी अपने कार्यक्रम के लिए एक उपयोगकर्ता सक्षम बनाता है। उपयोगकर्ता क्लिक करना पसंद करते हैं। केवल ज़ूम करने के लिए इसका उपयोग करें (@ user3357963 द्वारा उत्तर देखें) या अपने कोड को समाप्त करने के बाद एक दृश्य साफ़ करें (@endland द्वारा उत्तर देखें)। (मुझे यकीन नहीं है, लेकिन मुझे लगता है कि पेज व्यू को संभालने के लिए एक्टिवशीट की भी आवश्यकता है)।
  • Select, Activate 2: पहले Range("A5").Select, तो Selection.Value="NewValue": यदि आप VBA लिए नए हैं और मैक्रो रिकॉर्डर के माध्यम से सीख रहे हैं, तो आप कोड का एक बहुत कुछ इस तरह उत्पन्न मिल जाएगा। Range("A5").Value="NewValue" पर इसमें शामिल हों।
  • Offset: व्यक्तिगत रूप से, मुझे .Offset() का उपयोग करने में कोई समस्या नहीं है - मुझे इस आदेश के साथ कभी भी समस्याएं नहीं आईं। इसके बजाए, मुझे लगता है कि यह "इस सेल की पंक्ति में इस सेल की शीट और कॉलम + 1" पर जाने के बिना "इसके आगे वाला सेल" कहने का एक आसान तरीका है।

कई, कई पदों मैं इन दिनों देखने में, ओपी के चुपचाप .Activate, .Select, .Offset, आदि का उपयोग करने की अनुमति है ...

मैं इससे सहमत हूं। भले ही कोड काम का एक टुकड़ा बनाने के लिए जरूरी उत्तर देना आसान हो, ActiveCell.Value का उपयोग और इसे निराश किया जाना चाहिए। यह बहुत आसान होगा अगर लिंक करने के लिए एक अच्छी तरह से समझाया गया थ्रेड है, क्योंकि यह उम्मीद है कि :-)

0

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

Dim myRange as Range 
Set myRange = Application.InputBox("Select your range", Type:=8) 

लेकिन यदि आप उन संकेत करने के लिए की जरूरत है:

उदाहरण के लिए, मैं इसे आम तौर पर सलाह दी जाती Selection पर भरोसा करने के लिए जब इस विधि कोड के भीतर निष्पादन रहता उपयोगकर्ता एक रेंज वस्तु को परिभाषित करने देने के लिए नहीं है कहेंगे वर्कशीट पर किसी विशेष आकार या ऑब्जेक्ट का चयन करने के लिए, शायद उन्हें Selection बनाने के लिए बेहतर है (हालांकि, यह अवांछित उपयोगकर्ता कार्रवाइयों को रोकने के लिए अच्छी त्रुटि-हैंडलिंग और तर्क के बिना पैंडोरा के समस्याओं का बॉक्स खोल सकता है ...)।

यहां ऐसे एक अपवाद का एक उदाहरण है जो मेरे पास PowerPoint में है। मेरे पास कुछ रिबन यूआई एक्सएमएल और वीबीए है जो Shapes पर बटन जोड़ता है PowerPoint में संदर्भ मेनू राइट-क्लिक करें, और रिबन में समान बटन जोड़ता है। ये निर्बाध यूआई हैं जो अंत उपयोगकर्ता को एप्लिकेशन के साथ एक "मूल" अनुभव प्रदान करते हैं - उपयोगकर्ता चार्ट पर राइट-क्लिक करने में सक्षम होना चाहते हैं और फिर उस चयनित चार्ट या तालिका आदि के खिलाफ कुछ मैक्रो प्रक्रियाएं चला सकते हैं। वे ' टी उपयोगकर्ता नाम खोलने के लिए बटन दबाएं और सामान्य आकार के नाम या GUID के सूची बॉक्स के माध्यम से स्क्रॉल करें।

प्रक्रिया संहिता है ताकि इसे ठीक से संभाल तो मैं नीचे की तरह कुछ का उपयोग कर सकते में Selection, जहां

Sub UpdateOrEditSelection(update As Boolean) 
'This procedure invoked when user edits/updates a chart. 
Dim uid As Variant 
Dim sel As Selection 
Dim s As Integer 
Dim chartsToUpdate As Object 
Dim multipleShapes As Boolean 
Dim sld As Slide 
Set sel = ppPres.Windows(1).Selection 

If update Then 
    Set chartsToUpdate = CreateObject("Scripting.Dictionary") 
    Select Case sel.Type 
     Case ppSelectionShapes 
      For s = 1 To sel.ShapeRange.count 
       uid = sel.ShapeRange(s).Name 
       '.... 
       '... 
       '.. 
       '. 
      Next 
     Case ppSelectionSlides 
      For Each sld In sel.SlideRange 
       For s = 1 To sld.Shapes.count 
        uid = sld.Shapes(s).Name 
        '.... 
        '... 
        '.. 
        '. 

       Next 
      Next 
     Case ppSelectionText 
      s = 1 
      If sel.ShapeRange(s).HasTable Or sel.ShapeRange(s).HasChart Then 
       uid = sel.ShapeRange(s).Name 
       '.... 
       '... 
       '.. 
       '. 

      End If 
    End Select 
'.... 
'... 
'.. 
'. 

यह कहाँ से आता है की जांच करने की जरूरत है?

मैक्रो रिकॉर्डर। अनिवार्य रूप से, यह सुविधा प्रत्येक शाब्दिक उपयोगकर्ता इनपुट रिकॉर्ड करती है: ओवरकिल के बिंदु पर स्क्रॉलिंग, चयन, देखने, सक्रिय करने, डिफ़ॉल्ट गुण इत्यादि। हालांकि यह कभी कभी उपयोगी है, यह लोग हैं, जो पता नहीं है कि यह बुरा है द्वारा लिखित बुरा कोड को प्रोत्साहित करता है, लेकिन मुझे लगता है कि बिंदु जो यहाँ किया गया है बुरी तरह पीटना नहीं होगा:

How to avoid using Select in Excel VBA macros

क्या बेहतर है, धारणात्मक?

सीधे ऑब्जेक्ट्स पर प्रोग्राम। यदि आप केवल कीस्ट्रोक और माउसक्लिक की नकल करने के लिए वीबीए का उपयोग कर रहे हैं, तो आप इसे गलत कर रहे हैं।

अपवाद:

मैं जब चार्ट में श्रृंखला डेटा, जहां Select कभी कभी आवश्यक है करने के लिए स्वरूपण लागू करने के पाया है। ऐसा लगता है कि आईएमओ एक्सेल के साथ एक बग होने के लिए और एक डिजाइन सुविधा नहीं है।

अन्य अनुप्रयोगों (क्योंकि VBA नहीं है केवल एक्सेल):

  • पद एक अलग जानवर है, जो चुनाव वस्तु के बारे में अधिक एक बहुत निर्भर करता है
  • PowerPoint में वहाँ के संचालन में किसी प्रकार का कर रहे हैं जो कर सकते हैं केवल तभी किया जाए जब आवेदन और स्लाइड/आकार दृश्यमान हो या अन्यथा दिखाई दे। जबकि आपको आमतौर पर कुछ भी "चुनने" की आवश्यकता नहीं होती है, इसके लिए अधिक बोझिल कोड की आवश्यकता होती है।

    Set tb = cht.Shapes.AddTextbox(msoTextOrientationHorizontal, ptLeft, tBoxTop, ptWidth, ptHeight) 
        tb.Select '<--- KEEP THIS LINE OTHERWISE TEXTBOX ALIGNMENT WILL NOT WORK ## ## ## 
    

    और यह:

मैं अपने अनुप्रयोग में इस स्निपेट नहीं मिली

'PPT requires selecting the slide in order to export an image preview/jpg 
sld.Select 
ppPres.Windows(1).View.GotoSlide sld.SlideIndex 
sld.Shapes(1).Chart.Export imgPath, ppShapeFormatJPG 

और यह अलग-अलग Point वस्तुओं के साथ काम:

 pt.Select 
     pt.format.Line.Visible = msoTrue 
     pt.format.Line.Visible = msoFalse 
     pt.MarkerSize = pt.MarkerSize + 2 

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

  • आउटलुक: मैं आउटलुक के साथ ज्यादा कुछ नहीं है, यह वर्ड की तरह एक बहुत कुछ है और वास्तव में निरीक्षक में वर्ड ऑब्जेक्ट मॉडल का उपयोग करता है, लेकिन थोड़ी मैं आउटलुक के साथ क्या ActiveInspector, आदि जैसी चीजों पर निर्भर करता है

न तो Word या PowerPoint एक "मैक्रो रिकॉर्डर" अब और है (वास्तव में, मुझे लगता है कि हो सकता है, लेकिन यह वचन के रूप में बेकार हो के लिए इतना लानत नपुंसक है) और समय के अनुसार ज्यादातर लोगों अन्य अनुप्रयोगों में किसी भी विकास करते हैं, वे है पहले से ही इस बारे में अधिक पता लगाया।