2016-03-23 8 views
11

आप Module1 नामक एक मॉड्यूल में इस कोड है कहते हैं:क्या वीबीए में टूटा हुआ है?

Option Explicit 

Private Type TSomething 
    Foo As Integer 
    Bar As Integer 
End Type 

Public Something As TSomething 

बराबर सी # कोड में यदि आप Something क्षेत्र public, कोड अब संकलन होता हो पाता है क्योंकि की असंगत पहुंच, - प्रकार क्षेत्र के क्षेत्र से कम पहुंच योग्य क्षेत्र का। जो समझ में आता है।

VBA में हालांकि आप Module2 में इस कोड को हो सकता है:

Sub DoSomething() 
    Module1.Something.Bar = 42 
    Debug.Print Module1.Something.Bar 
End Sub 

और तुम IntelliSense मिलता है जबकि उसे लिखने, और यह संकलित, और यह चलता है, और यह 42 आउटपुट।

क्यों? COM स्टैंडपॉइंट से यह कैसे काम करता है? क्या यह भाषा चश्मे का हिस्सा है?

+0

Module2 में, आप प्रकार का एक चर 'Module1.TSomething' को परिभाषित करने और' Module1.Something' है कि प्रदान कर सकते हैं ? –

+0

@ सिमॉनफोर्सबर्ग संकलन त्रुटि (अपेक्षित के रूप में) - "उपयोगकर्ता-डिफिंट किए गए प्रकार को परिभाषित नहीं किया गया" ... दूसरे शब्दों में, प्रकार * उपयोग करने के लिए * दृश्यमान है, लेकिन नहीं * घोषणाओं के लिए * ... –

+1

जावा काम करता है exaclty लगता है, यह सवाल जावा के बारे में नहीं है, लेकिन वैसे भी। यह मुझे समझ में आता है, लेकिन फिर ... मैं जावा-लड़का हूं। –

उत्तर

3

मेरी टिप्पणी के अनुसार, वीबीए एक निजी प्रकार का खुलासा करता है, जैसे कि यह एक निजी एनम का खुलासा करता है।

वीबीए मानता है कि आप उपभोक्ता संदर्भ में TypeInfo का उपयोग कर सकते हैं, लेकिन यह आपको उन प्रकारों या enums के उदाहरण घोषित करने या बनाने की अनुमति नहीं देगा।

यह C++ answer आंशिक रूप से जानकारीपूर्ण है:

अभिगम नियंत्रण नाम लिए आवेदन किया है

नाम के लिए पहुँच विनिर्देशक यह से कोई लेना देना

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

लेकिन वीबीए सार्वजनिक कक्षा मॉड्यूल में टाइप होने पर चीजों को अलग-अलग संभालता है!

यहाँ अपने Module1 विस्तार:

Option Explicit 

Private Type TSomething 
    Foo As Integer 
    Bar As Integer 
End Type 

Public Type TOtherThing 
    Foo As Integer 
    Bar As Integer 
End Type 

Public Type TWrapperThing 
    Something As TSomething 
End Type 

Public Something As TSomething 
Public Otherthing As TOtherThing 
Public Wrapperthing As TWrapperThing 

Public Function GetSomething() As TSomething 
    GetSomething.Foo = 1 
End Function 

Public Function GetOtherthing() As TOtherThing 
    GetOtherthing.Foo = 1 
End Function 

और Module2 विस्तार:

Option Explicit 

Sub DoThings() 

'Compile Error: User-defined type not defined 
    'Dim oSomething As TSomething 
    Dim vSomething As Variant 

    Dim oOtherthing As Module1.TOtherThing 
    Dim vOtherthing As Variant 
    Dim oWrapperthing As Module1.TWrapperThing 

    Module1.Something.Foo = 42 
    Module1.Otherthing.Foo = 42 
    Module1.Wrapperthing.Something.Foo = 42 

    'Compile Error: Only user-defined types defined in public object modules can be coerced to or from a variant or passed to late-bound functions 
    'vSomething = Module1.Something 
    'vOtherthing = Module1.Otherthing 

    oOtherthing = Module1.Otherthing 
    oOtherthing.Foo = 43 

    'Is 43 > 42? 
    Debug.Assert oOtherthing.Foo > Module1.Otherthing.Foo 

'Compile Errors: "GetSomething" User-defined type not defined 
    'Module1.GetSomething.Foo = 42 
    'Module1.GetSomething().Foo = 42 

    Module1.GetOtherthing.Foo = 42 
    Module1.GetOtherthing().Foo = 42 

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