2012-01-09 12 views
8

मैं कोई एक्सेस विशेषज्ञ नहीं हूं, और मेरे पास एक (मुझे उम्मीद है!) सरल सवाल है ...माइक्रोसॉफ्ट एक्सेस में अभिव्यक्ति में वर्तमान फॉर्म का संदर्भ कैसे लगा सकता हूं?

मेरे पास कई रिकॉर्ड हैं। कुछ टेक्स्टबॉक्स में मैं केवल अंतर्निहित तालिका से मान प्रस्तुत करता हूं - इसलिए वे संबंधित फ़ील्ड से बंधे होते हैं।

लेकिन कुछ टेक्स्टबॉक्स में गणना मूल्य होना चाहिए। कुछ गणना जटिल हैं और तालिका से कई फ़ील्ड शामिल हैं। मैं गणना को वीबीए फ़ंक्शन के रूप में लिखता हूं। मैं के रूप में "नियंत्रण स्रोत" कुछ इस तरह प्रवेश कर सकता है:

=MyFunction([Field1], [Field2], [Field3] ...) 

लेकिन मैं समारोह कॉल में क्षेत्रों के दर्जनों को सूचीबद्ध नहीं करना चाहते हैं। इसके बजाय, मैं पैरामीटर के रूप में पूरा फॉर्म (या वर्तमान रिकॉर्ड) भेजना चाहता हूं, और फ़ंक्शन को आवश्यक फ़ील्ड को संदर्भित करने दें। मैं इसे इस तरह कर सकता हूं:

=MyFunction([Forms]![MyForm]) 

लेकिन मुझे कॉल में फॉर्म का नाम नहीं देना पसंद है। फ़ंक्शन तर्क के रूप में "वर्तमान फ़ॉर्म" भेजने का कोई तरीका नहीं है? वीबीए में, आप "मी! [फ़ील्ड 1]" exampel के लिए बस "मुझे" कीवर्ड का उपयोग करें। लेकिन ऐसा लगता है कि "मी" अभिव्यक्ति में स्वीकार नहीं किया गया है।

क्या अभिव्यक्ति में वर्तमान फ़ॉर्म को संदर्भित करने का कोई और तरीका है?

(यह एक कॉस्मेटिक सवाल है, मुझे पता है। लेकिन यह "[फॉर्म]! [माईफॉर्म]" का उपयोग करने के लिए अच्छा प्रोग्रामिंग नहीं है। बाद में आप नियंत्रण को किसी अन्य रूप में कॉपी करते हैं और अभिव्यक्ति में नाम बदलना भूल जाते हैं .. ।)

आपकी मदद के लिए आभारी! :-)

/ऐन्डर्स

उत्तर

9

आप उपयोग कर सकते हैं:

=MyFunction([Form]) 

कोड होगा:

Function MyFunction(frm As Form) 
MsgBox frm.Name 
End Function 
3

'मैं' केवल इसी रूप वस्तु के भीतर से कहा जा सकता है (यानी वस्तु की प्रक्रियाओं, कार्यों और घटनाओं में)।

मेरा पसंदीदा मौजूदा फार्म का उल्लेख करने के रास्ते screen.activeForm वस्तु कॉल करने के लिए है ...

screen.activeForm.recordset.fields(myFieldname).value 
screen.activeForm.controls(myControl).value 
screen.activeForm.name 
.... 
बेशक

आप एक कस्टम समारोह

my Result = myCustomFunction(screen.activeForm) 

के रूप वस्तु भेज सकते हैं या आप उपयोगकर्ता द्वारा परिभाषित वस्तु बना सकते हैं। इसके बाद आवश्यक फ़ील्ड को संबंधित गुणों के Class_Initialize उप में सेट आंतरिक गुणों के रूप में माना जा सकता है।

+0

'Screen.ActiveForm.Name' एक वैश्विक समारोह में इस्तेमाल किया जा सकता है! उसके लिए धन्यवाद! – bgmCoder

+0

मुझे लगता है कि इसे उत्तर के रूप में चिह्नित किया जाना चाहिए क्योंकि यह फॉर्म नाम को पैरामीटर के रूप में पास करने से कहीं अधिक परिस्थितियों में लक्ष्य को पूरा करने के लिए काम करेगा और पैरामीटर को पार करने की आवश्यकता को खत्म कर देगा - यहां तक ​​कि तटस्थ, कम भ्रमित कोड भी। फिलिप ग्रॉन्डर के लिए कुडोस! इसने एक समस्या हल की जिसे मैं बहुत अच्छी तरह से संबोधित कर रहा था। – DRC

2

यदि आप फॉर्म में कोड का उपयोग कर रहे हैं, तो "मुझे" वर्तमान रूप में संदर्भकर्ता हैं। तो

Call SomeFunction(me) 

हालांकि, "मुझे" टेक्स्ट बॉक्स से जुड़ी अभिव्यक्ति के संदर्भ में उपयोग नहीं किया जा सकता है।

उस स्थिति में आप या तो स्क्रीन के साथ नियमित रूप से स्क्रीन पर सक्रिय स्क्रीन उठा सकते हैं।

मैं अक्सर जाना:

Dim f  as form 
Set f = screen.ActiveForm 
+1

नियंत्रण के लिए प्रॉपर्टी शीट का उपयोग करके किसी ऑब्जेक्ट का ऑब्जेक्ट या यहां तक ​​कि ऑब्जेक्ट का नियंत्रण स्रोत भी सेट करना संभव है, क्योंकि मुझे यकीन है कि आप जानते हैं, और उस स्थिति में '= अनुबंध ([फॉर्म]) 'हो सकता है बहुत उपयोगी। यह विशेष रूप से उपयोगी होता है यदि आप कई रूपों पर नियंत्रण काट-पेस्ट करना चाहते हैं। मेरा मानना ​​है कि यह कार्यक्षमता है कि ओपी विचार कर रहा था। – Fionnuala

+3

गॉली, मुझे नहीं पता था कि [फॉर्म] कीवर्ड [मुझे] के स्थान पर अभिव्यक्ति में इस्तेमाल किया जा सकता है। यह वास्तव में काम करता है और फॉर्म नाम पास करता है और हार्ड कोडिंग के बिना ऐसा करता है। यह टिप निश्चित रूप से कुछ संभावनाएं खुलती है जिन्हें मुझे पता नहीं था। –

+0

हाँ, मुझे नहीं पता था कि अभिव्यक्ति में "फॉर्म" वीबीए में "मी" कीवर्ड के समान था। बेहद सुविधाजनक। मुझे इस तकनीक के दस्तावेज नहीं मिल रहे हैं, लेकिन यह काम करता है! –

1
Screen.ActiveControl.Parent 
' or 
someControlVariable.Parent 

मैं इस का उपयोग करता है, तो मैं वर्तमान उप-प्रपत्र चाहते हैं (या यदि वर्तमान में नहीं एक उप-प्रपत्र में फार्म) क्योंकि Screen.ActiveForm का उपयोग कर मौजूदा उप-प्रपत्र प्रदान नहीं करता है, लेकिन केवल उस सबफॉर्म युक्त फॉर्म। अपने संदर्भ से अवगत रहें, अगर नियंत्रण टैब नियंत्रण में है तो उसके माता-पिता उस टैब नियंत्रण हैं और फॉर्म नहीं हैं।

0

ACC2013 में मैं fionnuala के उत्तर का उपयोग नहीं कर सका। संपत्ति-विंडो में

ईवेंट हैंडलर: तो मैं करने के लिए बदल

=MyFunction() 

मेरे कोड होगा:

Function MyFunction() 
    Dim frm As Form 
    Set frm = Screen.ActiveForm 
    MsgBox frm.Name 
End Function 
+0

जैसा कि ध्यान दिया गया है, आप "मुझे" या [फॉर्म] पास कर सकते हैं, ubt आपको फ़ॉर्म के वास्तविक नाम के साथ "[form]" को प्रतिस्थापित करना होगा। तो fionnuala जवाब काम करेगा, लेकिन आप कभी भी [फॉर्म] का उपयोग नहीं करते हैं, लेकिन फ़ॉर्म नाम के साथ फ़ॉर्म को प्रतिस्थापित करें जैसे FORMS! SomeFormName। मुझे लगता है कि दिनचर्या में "मुझे" पास करना सबसे अच्छा है क्योंकि कोड किसी अन्य फॉर्म को लॉन्च करने या फोकस प्राप्त करने के बाद किसी फॉर्म से सही ढंग से चलाया जा सकता है, तो आपका कोड गलत नहीं उठाएगा। हालांकि आप स्क्रीन का उपयोग करते हैं। एक्टिवफॉर्म ठीक है। –

+0

अभिव्यक्ति बिल्डर में [फॉर्म] का उपयोग करने में समस्या क्यों है? ActiveForm इस उदाहरण में भी एक विकल्प है? मैं स्पष्ट रूप से फ़ॉर्म के नाम का उपयोग करने के लिए नकारात्मक पक्ष देखता हूं क्योंकि ये नाम बदल सकते हैं, या आप किसी फ़ॉर्म के अभिव्यक्ति या कोड को चुरा लेना चाहते हैं, लेकिन फ़ॉर्म के लिए एक अलग नाम का उपयोग करें। –

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