ভিবিএ intersect পরিসীমা শুধুমাত্র সংজ্ঞায়িত লক্ষ্য পরিসীমা হচ্ছে শীট কাজ কিন্তু যে অনুরোধ বাইপাস করা উচিত


1

একটি শিশুর ড্রপ ডাউন পুনরায় আরম্ভ করতে (ড্রপ ডাউন 1 এ ড্রপ করা পছন্দ অনুসারে 2 ড্রপ ডাউন), আমার "এই ওয়ার্কবুক" তে নীচের কোড আছে।

যদি কোনও নির্দিষ্ট পরিসর থেকে একটি কোষ (যেখানে ড্রপ ডাউন 1) পরিবর্তন হয় তবে এটি শিশুর ড্রপ ডাউন করতে হবে। এই শিট নামটি বিদ্যমান যেখানে শীটের উপর জরিমানা কাজ করে (পরিসীমা নাম "RSTcabFINISHING")।

সমস্যা

যে কোনও শীটে (= শীট যেখানে এই পরিসরের নাম বিদ্যমান নেই), এই কোডটি যে কোনও কক্ষের বিষয়বস্তুটি আমি যে উপাদানটি পরিবর্তন করি তার ঠিক পাশে 3 টি কক্ষের বিষয়বস্তু সাফ করছি।

সমাধানটি কেবলমাত্র শীটের কোডটি রাখতে হবে যা আমি মনে করি। কিন্তু (আমাকে বলুন যদি আমি ভুল বলি) এটি "এই ওয়ার্কবুক" তে কোডটিকে আরো অর্থবহ করে তুলছে বলে মনে হচ্ছে যে উপরে বর্ণিত পরিসীমাটির শিটটি গুণিত করা (= কপি) সাপেক্ষে ...

এই সব কিছুই বুঝতে পারছি না ... আমি অনুমান করছি যে "আমি যেখানেই চাই তা চেয়ে অন্য কোথাও এই ক্লিয়ারিং সামগ্রীটি এড়াতে আমার কী করা উচিত?"।

ধন্যবাদ!

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Initialize cabinet finishing board
On Error Resume Next
If Not Intersect(Target, Range("RSTcabFINISHING")) Is Nothing Then
    Application.EnableEvents = False
    Target.Offset(0, 1).Resize(, 3).ClearContents
End If

Exit Sub
End Sub

উত্তর:


0

ঠিক আছে, আপনার সমস্যা (গুলি) বেশিরভাগ ব্যবহার থেকে stem On Error Resume Next

  1. পরিসীমা বিদ্যমান না হলে আপনার যদি বিবৃতি একটি ত্রুটি নিক্ষেপ করা হবে। এর মানে এটি মূল্যায়ন করা হবে না এবং এর পরিবর্তে, পরবর্তী রেজিউমে যাওয়ার কারণে আপনি পরবর্তী লাইনে চলে যান।

  2. এখন এটি ইভেন্ট নিষ্ক্রিয় করব। যেমন, আপনার ইভেন্ট শুধুমাত্র একবার ট্রিগার হবে, আপনি এটি পুনরায় সক্ষম করার মতো মনে করেন না।

  3. আপনার ইন্টারেষ্টেকটি কখনও যাচাই না করেই এটি সমস্ত সামগ্রী সাফ করবে।

সুতরাং, আমাদের দুটি জিনিস করতে হবে:

  1. মূল্যায়ন ঠিক করুন
  2. অ্যাপ্লিকেশনটি ডেক করুন। EnableEvents = false, অথবা অন্তত এটি ঠিক করুন। বেশিরভাগ ইভেন্ট শুধুমাত্র ব্যবহারকারীর দ্বারা VBA স্ক্রিপ্ট পরিবর্তে পরিবর্তনগুলি বাড়াতে পারে, সুতরাং আপনি সম্ভবত এটি সম্পূর্ণরূপে উপেক্ষা করতে পারেন।

এইটিকে ঠিক করার সর্বোত্তম উপায়টি এমন একটি নিরাপদ ফাংশন কল করতে হবে যা পরিসর যাচাই করে এবং সেই ফলাফলের উপর নির্ভর করে সত্য বা মিথ্যা প্রদান করে।

এই মত কিছু আপনার জন্য আরো দরকারী হতে পারে:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    'Initialize cabinet finishing board
    If RangeExists("RSTcabFINISHING") Then          'See below for what this does. We only progress if we get true.
        If Not Intersect(Target, Range("RSTcabFINISHING")) Is Nothing Then
            Target.Offset(0, 1).Resize(, 3).ClearContents
        End If
    End If
End Sub

Function RangeExists(RangeName As String)
    On Error GoTo NotValid:             'If we fail, jump to "NotValid"
    If Range(RangeName).Rows >= 0 Then  'Test if the range exists - if it doesn't we'll get an error, if it does it
                                        'will have 0 or more rows
        RangeExists = True              'We didn't error and we do have 0 or more rows, so the function is true
    End If
    Exit Function                       'Break out of the function before we hit our error handler
NotValid:                               'We only get this far if an error was thrown (Range doesn't exist)
    RangeExists = False                 'Flag the function as false before returning
End Function

Thx @Jonno সমাধান সম্পূর্ণরূপে ইন্দ্রিয় তোলে, তবে আমি এটা কাজ করতে পারে না। নিশ্চিত না যে 1 লাইনটি কীভাবে ফাংশনে কাজ করে: যদি বিন্যাস (রেঞ্জনাম)। রাইজ> = 0 তাহলে ... আমি কি "পরিসীমা নাম" আসলে ঘোষণা করব না?
Adrien de Harlez

@ এড্রেন্ডেহ্যারলেজ এটি ঘোষণা করা হয় Function RangeExists(RangeName As String), এটি কল করে এটি মধ্যে পাস করা হয় RangeExists("RSTcabFINISHING")
Jonno
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.