स्वचालित रूप से एक सेल परिवर्तन पर एक एक्सेल मैक्रो निष्पादित


91

किसी विशेष सेल परिवर्तन में हर बार एक एक्सेल मैक्रो को स्वचालित रूप से कैसे निष्पादित कर सकता हूं?

अभी, मेरा काम कोड है:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("H5")) Is Nothing Then Macro
End Sub

जहां "H5"विशेष सेल पर नजर रखी जा रही है और Macroमैक्रो का नाम है।

क्या कोई बेहतर तरीका है?


क्या FormMDesk में RunMacroWhenValueChanges UDF आपकी आवश्यकताओं को पूरा करता है? formuladesk.com
गैरेथ

जवाबों:


106

आपका कोड बहुत अच्छा लग रहा है।

हालांकि, सावधान रहें, क्योंकि आपकी कॉल के लिए Range("H5")एक शॉर्टकट कमांड है Application.Range("H5"), जो इसके बराबर है Application.ActiveSheet.Range("H5")। यह ठीक हो सकता है, यदि केवल परिवर्तन उपयोगकर्ता-परिवर्तन हैं - जो कि सबसे विशिष्ट है - लेकिन वर्कशीट के सेल मूल्यों के लिए यह संभव है कि जब यह प्रोग्रामेटिक परिवर्तनों जैसे VBA के माध्यम से सक्रिय शीट न हो, तो बदल जाए।

इसे ध्यान में रखते हुए, मैं उपयोग करूंगा Target.Worksheet.Range("H5"):

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Target.Worksheet.Range("H5")) Is Nothing Then Macro
End Sub

या आप उपयोग कर सकते हैं Me.Range("H5"), अगर इवेंट हैंडलर प्रश्न में वर्कशीट के कोड पृष्ठ पर है (यह आमतौर पर है):

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("H5")) Is Nothing Then Macro
End Sub

उम्मीद है की यह मदद करेगा...


4
क्या होगा यदि सेल H5को दूसरी शीट से बदला जाता है, sheet2 तो कहें कि उपरोक्त फ़ंक्शन काम नहीं करता है। plz इसमें मदद करें।
dhpratik

2
Google खोज से यहां आने वाले किसी भी व्यक्ति के लिए, सुनिश्चित करें कि आपने इस कोड को vba में शीट में पेस्ट किया है, जैसे कि मैंने किया नहीं था। देखो stackoverflow.com/questions/15337008/...
hammythepig

Application.ActiveSheet.Range ( "H5")। ==> target.parent.range ("H5") और भी सुरक्षित है
पियरे

1
@WillEdiger जब भी आप स्पष्ट रूप से एक शीट संदर्भ निर्दिष्ट नहीं करते हैं, तो एक्सेल मान लेता है ActiveSheetऔर जब भी आप स्पष्ट रूप से यह निर्दिष्ट नहीं करते हैं कि यह एक्सेल है जिसके साथ आप काम कर रहे हैं, एक्सेल मानता है Application
स्कॉट मार्कस

1
ध्यान दें कि, एक वर्कशीट कोड मॉड्यूल में (जो कि एक Worksheet_Changeईवेंट कहां स्थित होना चाहिए), एक अयोग्य डिफॉल्ट नहींRange होता है , बल्कि कोड वाली शीट को संदर्भित करता है। इस उत्तर में कोड इसलिए प्रभावी रूप से प्रश्न में कोड के समान है। (नोट: 2009 में वापस जब यह उत्तर लिखा गया था, तो यह अलग हो सकता था , लेकिन मुझे पूरा यकीन है कि यह नहीं था।)ActiveSheet
YowE3K

7

Worksheet_Changeघटना या घटना को संभालना Workbook_SheetChange

ईवेंट हैंडलर एक तर्क "टारगेट अस रेंज" लेते हैं, इसलिए आप जांच सकते हैं कि जो रेंज बदल रही है उसमें वह सेल भी शामिल है जिसमें आप रुचि रखते हैं।


धन्यवाद, यह काम करता है। मैं, के साथ, कहते हैं सीमा की जांच Target.Address = Range("H5").Address। क्या कोई आसान तरीका है?
दोपहर

एक विकल्प Not (Intersect(Target, Range("H5")) Is Nothing) :। क्या यह है कि आप इसे कैसे करेंगे?
दोपहर

2
पहली टिप्पणी ( Target.Address = Range("H5").Address) काम नहीं करेगा यदि आपका सेल केवल परिवर्तित रेंज का हिस्सा था । दूसरी टिप्पणी अभी भी माइक रोसेनब्लम द्वारा वर्णित समस्याओं से ग्रस्त है।
चींटी

5

मैंने इस पर शोध करने और यह जानने के लिए बहुत समय बिताया कि यह कैसे काम करता है, वास्तव में इस घटना को ट्रिगर करने के बाद। चूंकि बहुत बिखरी हुई जानकारी थी, इसलिए मैंने यह तय करने का फैसला किया कि मैंने सभी को एक ही स्थान पर काम करने के लिए क्या मिला, इस प्रकार चरण दर चरण इस प्रकार है:

1) वीबीए प्रोजेक्ट (YourWorkBookName.xlsm) के तहत ओपन वीबीए एडिटर, माइक्रोसॉफ्ट एक्सेल ऑब्जेक्ट खोलें और उस शीट का चयन करें जिससे परिवर्तन ईवेंट संबंधित होगा।

2) डिफ़ॉल्ट कोड दृश्य "सामान्य" है। शीर्ष मध्य में ड्रॉप-डाउन सूची से, "वर्कशीट" चुनें।

3) निजी सब वर्कशीट_सेलेक्शन चेंज पहले से ही है जैसा कि होना चाहिए, इसे अकेला छोड़ दें। ऊपर से माइक रोसेनब्लम का कोड कॉपी / पेस्ट करें। उस सेल के लिए .Range संदर्भ बदलें, जिसके लिए आप एक परिवर्तन (B3, मेरे मामले में) देख रहे हैं। अपने मैक्रो को अभी तक जगह न दें, हालांकि (मैंने "मैक्रो" शब्द को "तब" के बाद हटा दिया):

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("H5")) Is Nothing Then
End Sub

या बाईं ओर स्थित ड्रॉप-डाउन सूची से, "बदलें" चुनें और निजी सब एंड एंड सब के बीच की जगह में पेस्ट करें If Not Intersect(Target, Me.Range("H5")) Is Nothing Then

4) "तब" के बाद लाइन पर घटनाओं को बंद कर दें ताकि जब आप अपने मैक्रो को कॉल करें, तो यह घटनाओं को ट्रिगर न करे और इस वर्कशीट_चेंज को फिर से कभी न खत्म होने वाले चक्र में चलाने की कोशिश करें जो एक्सेल को क्रैश करता है और / या अन्यथा सब कुछ गड़बड़ कर देता है:

Application.EnableEvents = False

5) अपने मैक्रो को कॉल करें

Call YourMacroName

6) अगले बदलाव पर घटनाओं को फिर से चालू करें (और किसी भी / सभी अन्य घटनाओं) ट्रिगर:

Application.EnableEvents = True

7) यदि ब्लॉक और उप को समाप्त करें:

    End If
End Sub

संपूर्ण कोड:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("B3")) Is Nothing Then
        Application.EnableEvents = False
        Call UpdateAndViewOnly
        Application.EnableEvents = True
    End If
End Sub

यह मॉड्यूल से बाहर / चालू घटनाओं को लेता है जो समस्याएं पैदा करता है और बस परिवर्तन को ट्रिगर करता है, घटनाओं को बंद करता है, आपके मैक्रो को चलाता है और घटनाओं को वापस चालू करता है।


3

मैं इस तरह से पसंद करता हूं, सेल का उपयोग नहीं बल्कि एक सीमा

    Dim cell_to_test As Range, cells_changed As Range

    Set cells_changed = Target(1, 1)
    Set cell_to_test = Range( RANGE_OF_CELLS_TO_DETECT )

    If Not Intersect(cells_changed, cell_to_test) Is Nothing Then 
       Macro
    End If

यह एक सेल के समान है। आप या तो एक सेल के रूप में एक सीमा निर्धारित कर सकते हैं, कंटीनोस कोशिकाओं की श्रेणी, या यहां तक ​​कि बिखरी हुई कोशिकाएं (सभी अल्पविराम द्वारा अलग)।
Shai Alon

0

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

मेरा मानना ​​है कि यह एक प्रोग्राम या किसी बाहरी डेटा अपडेट द्वारा सेल वैल्यू में बदलाव के समान है लेकिन उपरोक्त उदाहरण किसी तरह मेरे लिए काम नहीं करते हैं। मुझे लगता है कि समस्या यह है क्योंकि एक्सेल आंतरिक घटनाओं को ट्रिगर नहीं किया जाता है, लेकिन मेरा अनुमान है।

मैंने निम्नलिखित कार्य किया,

Private Sub Worksheet_Change(ByVal Target As Range) 
  If Not Intersect(Target, Target.Worksheets("Symbols").Range("$C$3")) Is Nothing Then
   'Run Macro
End Sub

1
मुझे यह किसी कारण से काम करने के लिए नहीं मिल सकता है। जब मैं VBA में चलाने के लिए कोड बताता हूं तो यह एक पॉप मेन्यू को खींच रहा है और मुझसे पूछ रहा है कि क्या मुझे मैक्रो ऑटोमैटिकली चलाने के बजाय मैक्रो को चलाना है?
डेविड वान डेर विरेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.