سؤال

وكيف يمكنني تلقائيا تنفيذ ماكرو Excel في كل مرة قيمة في التغييرات خلية معينة؟

والآن، رمز عملي هو:

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

وحيث "H5" هو خلية معينة يجري رصدها وMacro هو اسم الماكرو.

هل هناك طريقة أفضل؟

هل كانت مفيدة؟

المحلول

والتعليمات البرمجية الخاصة بك تبدو جيدة.

كن حذرا، ولكن لدعوتكم ل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

ويساعد هذا الأمل ...

نصائح أخرى

والتعامل مع الحدث Worksheet_Change أو الحدث Workbook_SheetChange.

ومعالجات الحدث تأخذ حجة "الهدف باسم المدى"، حتى تتمكن من معرفة ما اذا كان مدى هذا التغير يشمل الخلية كنت مهتما.

وأنا أفضل هذه الطريقة، لا تستخدم الخلية ولكن مجموعة

    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

وقضيت الكثير من الوقت في البحث هذا وتعلم كيف تعمل، بعد العبث حقا حتى يؤدي هذا الحدث. منذ هناك المنتشرة كثيرا من المعلومات قررت لتبادل ما وجدت للعمل في مكان واحد، وخطوة خطوة كما يلي:

1) توسيع VBA محرر، في إطار مشروع VBA (YourWorkBookName.xlsm) مفتوحة كائنات Microsoft Excel و تحديد ورقة التي سوف تتعلق الحدث التغيير.

2) طريقة عرض التعليمات البرمجية الافتراضي هو "الجنرال". من القائمة المنسدلة في أعلى الوسط حدد "ورقة عمل".

و3) الخاص الفرعية Worksheet_SelectionChange هناك بالفعل كما ينبغي أن يكون، وترك ذلك وحدها. نسخ / لصق كود مايك روزنبلوم من فوق وتغيير إشارة .Range إلى الخلية التي كنت أشاهد لتغيير (B3، في حالتي). لا تضع بك ماكرو بعد، ولكن (I إزالة كلمة "ماكرو" بعد "ثم"):

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

وأو من القائمة المنسدلة في أعلى اليسار، حدد "التغيير" وفي الفضاء بين الفرعية الخاصة و End Sub، معجون If Not Intersect(Target, Me.Range("H5")) Is Nothing Then

و4) على السطر بعد "ثم" إيقاف الأحداث بحيث عند استدعاء الماكرو الخاص بك، فإنه لا يؤدي الأحداث ومحاولة تشغيل هذا Worksheet_Change مرة أخرى في دورة لا تنتهي التي تعطل Excel و / أو عبث كل شيء :

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

وهذا يستغرق تحول الأحداث على / قبالة من الوحدات التي تخلق المشاكل وببساطة يتيح الزناد التغيير، إيقاف الأحداث، ويدير الماكرو ويتحول الأحداث مرة أخرى.

ولدي الخلية الذي يرتبط قاعدة بيانات المخزون على الانترنت ويتم تحديثها باستمرار. أريد أن يؤدي ماكرو كلما يتم تحديث قيمة الخلية.

وأعتقد أن هذا هو مماثل لتغيير قيمة الخلية باستخدام برنامج أو أي تحديث البيانات الخارجية ولكن قبل الأمثلة بطريقة أو بأخرى لا تعمل بالنسبة لي. أعتقد أن المشكلة هي أنه لا يتم تشغيل الأحداث الداخلية التفوق، لكن thats تخميني.

وفعلت ما يلي،

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top