একটি ঘর পরিবর্তনে স্বয়ংক্রিয়ভাবে একটি এক্সেল ম্যাক্রো চালিত করে


91

আমি কীভাবে প্রতিবার কোনও নির্দিষ্ট কক্ষের পরিবর্তনের মান হিসাবে স্বয়ংক্রিয়ভাবে একটি এক্সেল ম্যাক্রো কার্যকর করতে পারি?

এখনই, আমার কাজের কোডটি হ'ল:

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

"H5"নির্দিষ্ট কক্ষটি কোথায় পর্যবেক্ষণ করা হচ্ছে এবং Macroতা ম্যাক্রোর নাম।

একটি ভাল উপায় আছে কি?


ফর্মুলাডেস্কে রানম্যাক্রোভেনভ্যালিউচেনিজ ইউডিএফ আপনার প্রয়োজনীয়তা পূরণ করে? ফর্মুলাডেস.কম
গ্যারেথ

উত্তর:


108

আপনার কোডটি বেশ ভাল দেখাচ্ছে।

তবে সাবধান থাকুন আপনার কলটির জন্য Range("H5")শর্টকাট কমান্ড Application.Range("H5")যা সমান Application.ActiveSheet.Range("H5")। এটি সূক্ষ্ম হতে পারে, যদি কেবল পরিবর্তনগুলি ব্যবহারকারীর পরিবর্তন হয় - যা সর্বাধিক সাধারণ - তবে কর্মশক্তির সেল মানগুলি পরিবর্তন করা সম্ভব যখন প্রোগ্রামিক পরিবর্তনের মাধ্যমে সক্রিয় শীট না হয়, যেমন ভিবিএ।

এটি মাথায় রেখে, আমি এটি ব্যবহার করব 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

4
গুগল অনুসন্ধান থেকে যে কেউ এখানে আসছেন, আপনি এই কোডটি vba এর শিটে পেস্ট করেছেন তা নিশ্চিত করুন, আমার মতো মডিউল নয়। তাকান stackoverflow.com/questions/15337008/...
hammythepig

অ্যাপ্লিকেশন.একটিভশিট.রেঞ্জ ("এইচ 5")। ==> টার্গেট.প্যারেন্ট.রেঞ্জ ("এইচ 5") আরও নিরাপদ
পিয়েরে

4
@ উইলইডিগার যখনই আপনি স্পষ্টভাবে কোনও শিটের উল্লেখ উল্লেখ করবেন না, এক্সেল ধরে নেয় the ActiveSheet এবং যখনই আপনি স্পষ্টভাবে নির্দিষ্ট করে না যে এটি আপনার সাথে কাজ করছেন এটি এক্সেল, এক্সেল ধরে নেয় Application
স্কট মার্কাস

4
মনে রাখবেন যে, একটি ওয়ার্কশিট কোড মডিউলটিতে (এটি যেখানে একটি Worksheet_Changeইভেন্ট অবশ্যই থাকা উচিত) কোনও অযোগ্য তাকে ডিফল্ট Rangeকরে নাActiveSheet বরং পরিবর্তে কোডযুক্ত শীটকে বোঝায়। এই উত্তরের কোডটি কার্যকরভাবে প্রশ্নের কোডের মতোই। (দ্রষ্টব্য: ২০০৯ সালে যখন এই উত্তরটি লেখা হয়েছিল তখন এটি অন্যরকম হতে পারে তবে আমি এটি সম্পর্কে নিশ্চিত যে এটি ছিল না))
YowE3K

7

হ্যান্ডেল Worksheet_Changeঘটনা বা Workbook_SheetChangeইভেন্ট।

ইভেন্ট হ্যান্ডলাররা "টার্গেট হিসাবে রেঞ্জ" হিসাবে একটি আর্গুমেন্ট গ্রহণ করে, তাই আপনি এটি পরীক্ষা করতে পারেন যে পরিবর্তিত পরিসীমাটি আপনার আগ্রহী ঘরটি অন্তর্ভুক্ত করছে কিনা।


ধন্যবাদ, এটি কাজ করে। আমি বলুন, এর সাথে পরিসীমাটি পরীক্ষা করি Target.Address = Range("H5").Address। কোন সহজ উপায় আছে?
নামিন

একটি বিকল্প: Not (Intersect(Target, Range("H5")) Is Nothing) । আপনি কি এটা এইভাবে করবেন?
নামিন

4
প্রথম মন্তব্য ( Target.Address = Range("H5").Address) কাজ করবে না যদি আপনার ঘরটি পরিবর্তিত সীমার অংশ হয়। দ্বিতীয় মন্তব্যটি এখনও মাইক রোজেনব্লুম দ্বারা বর্ণিত সমস্যাগুলি ভুগছে।
পিপীলিকা

5

আমি সত্যিই ইভেন্টটি উত্তেজিত করার পরে এই গবেষণা এবং এটি কীভাবে কাজ করে তা শিখতে অনেক সময় ব্যয় করেছি। যেহেতু প্রচুর পরিমাণে বিক্ষিপ্ত তথ্য ছিল আমি যেহেতু সব জায়গায় এক জায়গায় কাজ করতে পেয়েছি তা ভাগ করে নেওয়ার সিদ্ধান্ত নিয়েছি, ধাপে ধাপে:

1) ভিবিএ প্রকল্পের অধীনে ওপেন ভিবিএ সম্পাদক (আপনার ওয়ার্কবুকনাম.এক্সএলএসএম) মাইক্রোসফ্ট এক্সেল অবজেক্টটি খুলুন এবং সেই শীটটি নির্বাচন করুন যাতে পরিবর্তনের ইভেন্টটি সম্পর্কিত হবে।

2) ডিফল্ট কোড ভিউটি হল "জেনারেল" " উপরের মাঝের ড্রপ-ডাউন তালিকা থেকে "ওয়ার্কশিট" নির্বাচন করুন।

3) প্রাইভেট সাব ওয়ার্কশিট_স্লেশনচেনশন যেমনটি হওয়া উচিত ইতিমধ্যে রয়েছে, একে একে ছেড়ে যান। উপরের থেকে মাইক রোজেনব্লুমের কোড অনুলিপি করুন / আটকান এবং পরিবর্তন করুন যার জন্য আপনি যে সেলটি দেখছেন তার জন্য রেফারেন্স রেঞ্জ করুন (বি 3, আমার ক্ষেত্রে)। আপনার ম্যাক্রোটি এখনও রাখুন না (তবে "তারপর" এর পরে আমি "ম্যাক্রো" শব্দটি সরিয়ে ফেলেছি):

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

৪) "তারপরে" এর পরে লাইনে ইভেন্টগুলি বন্ধ করে দিন যাতে আপনি যখন আপনার ম্যাক্রো কল করেন, এটি ইভেন্টগুলিকে ট্রিগার না করে এবং এই ওয়ার্কশিট_চেন্জটিকে আবার কখনও শেষ না হওয়া চক্রের সাথে চালানোর চেষ্টা করবে যা এক্সেল ক্র্যাশ করে এবং / অথবা অন্যথায় সমস্ত কিছু মিস করে:

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

এটি একটি ঘরের মতোই। আপনি একটি কক্ষ হিসাবে ধারাবাহিকতা নির্ধারণ করতে পারেন, ধারাবাহিক কোষের পরিসীমা বা এমনকি ছড়িয়ে ছিটিয়ে থাকা সেলগুলি (সমস্ত কমা দ্বারা পৃথক করা)।
শাই অ্যালন

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

4
আমি কোনও কারণে এটি কাজ করতে পারি না। আমি যখন ভিবিএতে চালানোর কোডটি বলি তখন এটি একটি পপ আপ মেনু টানছে এবং আমাকে জিজ্ঞাসা করছে যে আমি ম্যাক্রো অটোমেটিক্যালি চালানোর পরিবর্তে ম্যাক্রো চালাতে চাইছি?
ডেভিড ভ্যান ডের ভিয়ারেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.