2014-11-01 5 views
5

सेटअप: मैं कई UserForms के साथ कई परियोजनाओं है, और जब एक दोहरी मॉनिटर सिस्टम पर इन खोलने, डिफ़ॉल्ट StartUpPosition 1 है = CenterOwner और यह प्राथमिक प्रदर्शन (विंडोज़ डेस्कटॉप का केंद्र) के दाईं ओर आता है। मैं कोड का एक छोटा सा टुकड़ा लिखने की कोशिश कर रहा हूं जो परियोजना में प्रत्येक उपयोगकर्ता प्रपत्र के लिए एक संपत्ति को बदलता है। इस मामले में, विशेष रूप से, .StartUpPosition = 2 (CenterScreen)एवी UserForm की StartUpPosition परियोजना त्रुटि में बदलें: ऑब्जेक्ट का समर्थन नहीं करता संपत्ति

माइक्रोसॉफ्ट Office Professional प्लस 2010

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

जब मैं इस कोड को चलाता हूं, तो उपयोगकर्ताफॉर्म खोलने पर, यह अपेक्षित कार्य करता है, StartUpPosition = 1 (CenterOwner) के डिफ़ॉल्ट को ओवरराइड करता है और यह स्क्रीन के केंद्र में फ़ॉर्म प्रदर्शित करता है।

Sub UserForm_Initialize() 
    With UserFormName 
     .StartUpPosition = 2 'CenterScreen' 
    End With 
End Sub 

हालांकि, जब मैं इसे इस पाश है कि एक मॉड्यूल से इस परियोजना के नियंत्रण के माध्यम से चक्र, की कोशिश में एक बार में सभी रूपों में से चूक बदलने के लिए में एम्बेडेड चलाने के लिए, मैं निम्नलिखित त्रुटि मिलती है।

त्रुटि: रन-टाइम त्रुटि '438': वस्तु इस संपत्ति या विधि का समर्थन नहीं करता।

Sub UserFormStartUp_Center() 
    Dim VBComp As Object 
    'For each control in project' 
    For Each VBComp In Application.VBE.ActiveVBProject.VBComponents 
     'Check to see if control is a UserForm' 
     If VBComp.Type = 3 Then   '3 = vbext_ct_MSForm' 

      'Change Property - StartUpPosition - SAME AS ABOVE' 
      With VBComp 
       .StartUpPosition = 2 'CenterScreen' 
      End With 

     End If 
    'Loop through controls' 
    Next 
End Sub 

प्रश्न: मैं संपत्ति के लिए प्रपत्र प्रत्येक UserForm में जाने के अलावा रन-समय में एक उदाहरण में न सिर्फ डिफ़ॉल्ट के रूप में संग्रहीत करने के लिए, और करने के लिए नीचे स्क्रॉल करके मैन्युअल रूप से इसे बदल कैसे सेट कर सकते संपत्ति और उस पर क्लिक करके, और फिर फॉर्म को बंद करना और दोहराने के लिए आगे बढ़ना। (हाँ, मैं अब तक करूँगा, लेकिन मेरे पास बहुत सारी परियोजनाएं हैं जिन्हें उपयोगकर्ता तकनीकों में बदलाव की आवश्यकता होगी क्योंकि मैं नई तकनीकों को सीखता हूं, मुझे ग्राहकों के लिए अन्य परियोजनाओं को पैच करने की आवश्यकता है)

मुझे लगता है कि यह कुछ है रन-टाइम के बारे में जो मुझे समझ में नहीं आता है। मुझे विश्वास करना है कि आप इस संपत्ति को प्रोग्रामेटिक रूप से सेट कर सकते हैं क्योंकि यह इसे अन्य गुणों के साथ संग्रहीत करता है।

अनुसंधान:
MSDN: StartUp Object Property MSDN के अनुसार, केवल रनटाइम पर वस्तुओं स्टार्टअप वस्तुओं हो सकता है।

MSDN: StartUpPosition Property

इस पर किसी भी मदद के लिए अग्रिम धन्यवाद। यह मुझे क्लिक करने के कई घंटे बचाएगा।

संपादित करें: पढ़ने जवाब के बाद, निम्नलिखित जोड़ना:

अद्यतन: जब मैं सुझाव आपको जवाब में बताया गया से प्रत्येक के साथ कोड चलाने के लिए, मैं अभी भी एक त्रुटि हो रही है। रन-टाइम त्रुटि: '-2147467259 (80004005) ऑब्जेक्ट' _VBComponent 'की विधि' गुण 'विफल रही।

तो मैं संपत्ति मद .. मूल्य, नाम के एक MsgBox मुद्रण, आदि

For Each VBComp In ActiveWorkbook.VBProject.VBComponents 
    '~~> Check to see if control is a UserForm' 
    If VBComp.Type = 3 Then 
     With VBComp 
     MsgBox (VBComp.Properties.Item(50).Value) 
     End With 
    End If 
Next 

जब मैं ऐसा करते हैं, यह दिलचस्प है की तरह, बाहर कुछ बातें की कोशिश करने का फैसला किया। संदेश बॉक्स प्रकट होता है, सही जानकारी के साथ जो उस आइटम के लिए स्थानीय विंडो से मेल खाता है .. फिर, msgstr "संदेश के बाद, यह ऑब्जेक्ट त्रुटि देता है। अगर यह एक त्रुटि है, तो संदेश बॉक्स सही तरीके से प्रिंट क्यों करता है? ऐसा लगता है जैसे उपयोगकर्ताफॉर्म एक ऑब्जेक्ट है, लेकिन प्रॉपर्टी.इटम नहीं है। फिर भी, यह पैरामीटर कि इस तरह के नाम, मूल्य, आदि के रूप

स्क्रीनशॉट है कि संपत्ति मद जहां ऑब्जेक्ट प्रकार = कुछ भी नहीं

Locals Info

+0

आप लगभग सही रास्ते पर हैं। मुझे एक उत्तर पोस्ट करने दें :) –

उत्तर

6

हर UserForm/नियंत्रण पर स्थानीय लोगों की जानकारी के शामिल परिभाषित किया जा सकता है एक संपत्ति जो पहुँचा जा सकता है यह .Properties.Item

उदाहरण के लिए है से है

Sub GetPropertiesDetails() 
    Dim VBComp As Object 
    Dim i As Long, j As Long 

    i = 1 

    For Each VBComp In ActiveWorkbook.VBProject.VBComponents 
     '~~> Check to see if control is a UserForm' 
     If VBComp.Type = 3 Then 
      With VBComp 
       For j = 1 To .Properties.Count 
        Debug.Print i & ". "; .Properties.Item(j).Name 
        i = i + 1 
       Next j 
      End With     
      Exit For '<~~ Just want to check for one userform 
     End If 
    Next 
End Sub 

जब आप ऊपर दिए गए कोड को चलाने आप तत्काल खिड़की

1. ActiveControl 
2. BackColor 
3. BorderColor 
4. BorderStyle 
5. CanPaste 
6. CanRedo 
7. CanUndo 
8. Controls 
9. Cycle 
10. _Font_Reserved 
11. Font 
12. ForeColor 
13. InsideHeight 
14. InsideWidth 
15. KeepScrollBarsVisible 
16. MouseIcon 
17. MousePointer 
18. PictureAlignment 
19. Picture 
20. PictureSizeMode 
21. PictureTiling 
22. ScrollBars 
23. ScrollHeight 
24. ScrollLeft 
25. ScrollTop 
26. ScrollWidth 
27. Selected 
28. SpecialEffect 
29. VerticalScrollBarSide 
30. Zoom 
31. DesignMode 
32. ShowToolbox 
33. ShowGridDots 
34. SnapToGrid 
35. GridX 
36. GridY 
37. DrawBuffer 
38. Name 
39. Caption 
40. Left 
41. Top 
42. Width 
43. Height 
44. Enabled 
45. Tag 
46. HelpContextID 
47. WhatsThisButton 
48. WhatsThisHelp 
49. RightToLeft 
50. StartUpPosition 
51. ShowModal 
इस से

तो हम देखते हैं कि संपत्ति है कि हम के बाद कर रहे हैं 50 पर है में इस मिल जाएगा। अब हमें बस इतना करना है कि .StartUpPosition = 2 की बजाय आपने किया था। क्रिस Neilsen की

Sub SetUserformStartUp() 
    Dim VBComp As Object 

    For Each VBComp In ActiveWorkbook.VBProject.VBComponents 
     '~~> Check to see if control is a UserForm' 
     If VBComp.Type = 3 Then VBComp.Properties.Item(50).Value = 2 
    Next 
End Sub 

सौजन्य (टिप्पणी से)

तुम भी उपयोग कर सकते हैं:

VBComp.Properties.Item("StartUpPosition") = 2 
+1

+1 शीर्ष गन होने के लिए - महान उत्तर। – barryleajo

+3

या बेहतर अभी तक 'VBComp.Properties.Item (" StartUpPosition ") = 2' –

+2

@chrisneilsen: मैंने इसे अपनी पोस्ट में जोड़ा है। टिप्पणियां अस्थायी हैं और मैं नहीं चाहता कि भविष्य में यह मूल्यवान जानकारी खो जाए :) –

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

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