खोज…
वाक्य - विन्यास
स्रोत मॉड्यूल :
[Public] Event [identifier]([argument_list])
हैंडलर मॉड्यूल :
Dim|Private|Public WithEvents [identifier] As [type]
टिप्पणियों
एक घटना केवल
Public
हो सकती है। संशोधक वैकल्पिक है क्योंकि वर्ग मॉड्यूल सदस्य (घटनाओं सहित) डिफ़ॉल्ट रूप सेPublic
रूप से होते हैं।एक
WithEvents
चरPrivate
याPublic
हो सकता है, लेकिनFriend
नहीं। संशोधक अनिवार्य है क्योंकिWithEvents
एक ऐसा कीवर्ड नहीं है जो एक चर घोषित करता है, लेकिन एक परिवर्तनीय कीवर्ड चर चर घोषणा सिंटैक्स का हिस्सा है। यदि कोई पहुँच संशोधक मौजूद नहीं है, तोDim
खोजशब्द का उपयोग किया जाना चाहिए।
स्रोत और हैंडलर
घटनाएँ क्या हैं?
VBA ईवेंट-चालित है : VBA कोड होस्ट एप्लिकेशन या होस्ट डॉक्यूमेंट द्वारा उठाए गए ईवेंट के जवाब में चलता है - ईबीए समझने के लिए ईवेंट समझना मूलभूत है।
एपीआई अक्सर उन वस्तुओं को उजागर करते हैं जो विभिन्न राज्यों के जवाब में कई घटनाओं को बढ़ाते हैं। उदाहरण के लिए एक Excel.Application
ऑब्जेक्ट एक घटना को उठाती है जब भी एक नई कार्यपुस्तिका बनाई जाती है, खोली जाती है, सक्रिय होती है, या बंद होती है। या जब भी किसी कार्यपत्रक की गणना की जाती है। या फ़ाइल सहेजने से पहले। या तुरंत बाद। प्रपत्र पर एक बटन एक Click
घटना उठाता है जब उपयोगकर्ता इसे क्लिक करता है, उपयोगकर्ता प्रपत्र सक्रिय होने के ठीक बाद एक घटना उठाता है, और इसके बंद होने से ठीक पहले एक और।
एपीआई परिप्रेक्ष्य से, घटनाओं के विस्तार बिंदु हैं : ग्राहक कोड को इन घटनाओं को संभालने वाले कोड को लागू करने के लिए चुना जा सकता है, और जब भी इन घटनाओं को निकाल दिया जाता है तो कस्टम कोड को निष्पादित करें: यही कारण है कि आप किसी भी कार्यपत्रक पर चयन परिवर्तन हर बार स्वचालित रूप से अपने कस्टम कोड को निष्पादित कर सकते हैं। - किसी भी कार्यपत्रक पर चयन बदलने पर उस घटना को संभालना जो निकाल दिया जाता है।
एक वस्तु जो घटनाओं को उजागर करती है वह एक घटना स्रोत है । एक विधि जो एक घटना को संभालती है वह एक हैंडलर है ।
हैंडलर
VBA डॉक्यूमेंट मॉड्यूल (जैसे कि ThisDocument
, ThisWorkbook
, Sheet1
, आदि) और UserForm
मॉड्यूल क्लास मॉड्यूल हैं जो विशेष इंटरफेस को लागू करते हैं जो कई घटनाओं को उजागर करते हैं । आप कोड फलक के शीर्ष पर बाईं ओर ड्रॉपडाउन में इन इंटरफेस को ब्राउज़ कर सकते हैं:
दाईं ओर ड्रॉपडाउन बाईं ओर ड्रॉपडाउन में चयनित इंटरफ़ेस के सदस्यों को सूचीबद्ध करता है:
VBE स्वचालित रूप से एक इवेंट हैंडलर स्टब उत्पन्न करता है जब कोई आइटम राइट-साइड सूची में चुना जाता है, या हैंडलर मौजूद होने पर वहां नेविगेट करता है।
आप किसी भी मॉड्यूल में एक मॉड्यूल-स्कोप्ड WithEvents
चर को परिभाषित कर सकते हैं:
Private WithEvents Foo As Workbook
Private WithEvents Bar As Worksheet
प्रत्येक WithEvents
घोषणा बाईं ओर ड्रॉपडाउन से चयन करने के लिए उपलब्ध हो जाती है। जब किसी घटना को राइट-साइड ड्रॉपडाउन में चुना जाता है, तो VBE एक इवेंट हैंडलर स्टब बनाता है जिसका नाम WithEvents
ऑब्जेक्ट और इवेंट का नाम, अंडरस्कोर के साथ जोड़ा जाता है:
Private WithEvents Foo As Workbook
Private WithEvents Bar As Worksheet
Private Sub Foo_Open()
End Sub
Private Sub Bar_SelectionChange(ByVal Target As Range)
End Sub
केवल प्रकार जो कम से कम एक घटना को उजागर WithEvents
, उन्हें WithEvents
साथ उपयोग किया जा सकता है, और WithEvents
घोषणाओं को New
कीवर्ड के साथ ऑन-द-स्पॉट का संदर्भ नहीं सौंपा जा सकता है। यह कोड अवैध है:
Private WithEvents Foo As New Workbook 'illegal
ऑब्जेक्ट संदर्भ स्पष्ट रूप से Set
किया जाना चाहिए; क्लास मॉड्यूल में, ऐसा करने के लिए एक अच्छी जगह है जो अक्सर Class_Initialize
हैंडलर में होती है, क्योंकि तब क्लास उस ऑब्जेक्ट की घटनाओं को तब तक संभालती है जब तक उसका उदाहरण मौजूद है।
सूत्रों का कहना है
कोई भी वर्ग मॉड्यूल (या दस्तावेज़ मॉड्यूल, या उपयोगकर्ता प्रपत्र) एक घटना स्रोत हो सकता है। मॉड्यूल के घोषणा खंड में, घटना के लिए हस्ताक्षर को परिभाषित करने के लिए Event
कीवर्ड का उपयोग करें:
Public Event SomethingHappened(ByVal something As String)
ईवेंट का हस्ताक्षर निर्धारित करता है कि ईवेंट कैसे उठाया जाता है, और ईवेंट हैंडलर कैसा दिखेगा।
ईवेंट केवल उस वर्ग के भीतर उठाए जा सकते हैं जिन्हें वे परिभाषित करते हैं - क्लाइंट कोड केवल उन्हें संभाल सकता है। इवेंट्स को RaiseEvent
कीवर्ड के साथ उठाया जाता है; घटना के तर्क उस बिंदु पर दिए गए हैं:
Public Sub DoSomething()
RaiseEvent SomethingHappened("hello")
End Sub
SomethingHappened
कोड के बिना जो DoSomething
ईवेंट को हैंडल करता है, DoSomething
प्रक्रिया को चलाने पर अभी भी ईवेंट को उठाया जाएगा, लेकिन कुछ भी नहीं होगा। घटना स्रोत एक वर्ग नामित में उपरोक्त कोड मानते हुए है Something
, में इस कोड ThisWorkbook
कह "हैलो" जब भी कोई संदेश बॉक्स में दिखाई देगा test.DoSomething
कहा जाता हो जाता है:
Private WithEvents test As Something
Private Sub Workbook_Open()
Set test = New Something
test.DoSomething
End Sub
Private Sub test_SomethingHappened(ByVal bar As String)
'this procedure runs whenever 'test' raises the 'SomethingHappened' event
MsgBox bar
End Sub
इवेंट स्रोत पर डेटा वापस भेजना
संदर्भ द्वारा पारित मापदंडों का उपयोग करना
एक घटना एक ByRef
पैरामीटर को परिभाषित कर सकती है जिसका अर्थ कॉलर को वापस किया जाना है:
Public Event BeforeSomething(ByRef cancel As Boolean)
Public Event AfterSomething()
Public Sub DoSomething()
Dim cancel As Boolean
RaiseEvent BeforeSomething(cancel)
If cancel Then Exit Sub
'todo: actually do something
RaiseEvent AfterSomething
End Sub
यदि BeforeSomething
घटना है कि सेट अपने हैंडलर है cancel
करने के लिए पैरामीटर True
, तो जब निष्पादन रिटर्न हैंडलर से, cancel
हो जाएगा True
और AfterSomething
उठाया जाना कभी नहीं होगा।
Private WithEvents foo As Something
Private Sub foo_BeforeSomething(ByRef cancel As Boolean)
cancel = MsgBox("Cancel?", vbYesNo) = vbYes
End Sub
Private Sub foo_AfterSomething()
MsgBox "Didn't cancel!"
End Sub
foo
ऑब्जेक्ट रेफ़रेंस को मानते हुए, जब foo.DoSomething
रन होता है, तो कहीं न कहीं असाइन किया जाता है, एक संदेश बॉक्स रद्द करने के लिए संकेत देता है, और दूसरा संदेश बॉक्स कहता है कि "रद्द नहीं किया गया" केवल जब कोई चयन नहीं किया गया था।
परस्पर वस्तुओं का उपयोग करना
आप एक उत्परिवर्तनीय वस्तु ByVal
की एक प्रति भी पास कर सकते हैं, और हैंडलर उस वस्तु के गुणों को संशोधित कर सकते हैं; कॉलर फिर संशोधित संपत्ति मूल्यों को पढ़ सकता है और तदनुसार कार्य कर सकता है।
'class module ReturnBoolean
Option Explicit
Private encapsulated As Boolean
Public Property Get ReturnValue() As Boolean
'Attribute ReturnValue.VB_UserMemId = 0
ReturnValue = encapsulated
End Property
Public Property Let ReturnValue(ByVal value As Boolean)
encapsulated = value
End Property
Variant
प्रकार के साथ संयुक्त, इसका उपयोग कॉलर को मान वापस करने के लिए गैर-स्पष्ट तरीके बनाने के लिए किया जा सकता है:
Public Event SomeEvent(ByVal foo As Variant)
Public Sub DoSomething()
Dim result As ReturnBoolean
result = New ReturnBoolean
RaiseEvent SomeEvent(result)
If result Then ' If result.ReturnValue Then
'handler changed the value to True
Else
'handler didn't modify the value
End If
End Sub
हैंडलर इस तरह दिखेगा:
Private Sub source_SomeEvent(ByVal foo As Variant) 'foo is actually a ReturnBoolean object
foo = True 'True is actually assigned to foo.ReturnValue, the class' default member
End Sub