hücre değişikliğinde otomatik olarak bir Excel makrosu yürütür


91

Belirli bir hücredeki bir değer her değiştiğinde otomatik olarak bir Excel makrosunu nasıl çalıştırabilirim?

Şu anda, çalışma kodum:

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

nerede "H5"izlenen belirli hücre Macrove makronun adı.

Daha iyi bir yol var mı?


FormulaDesk'teki RunMacroWhenValueChanges UDF gereksinimlerinizi karşılıyor mu? formuladesk.com
Gareth Hayter

Yanıtlar:


108

Kodunuz oldukça iyi görünüyor.

İçin çağrı için, ancak, dikkatli olun Range("H5")bir kısayol komut Application.Range("H5")eşdeğerdir, Application.ActiveSheet.Range("H5"). Bu iyi olabilir, eğer tek değişiklik kullanıcı değişiklikleri ise - ki bu en tipik olanıdır - ancak çalışma sayfasının hücre değerlerinin etkin sayfa olmadığında programatik değişiklikler yoluyla, örneğin VBA yoluyla değişmesi mümkündür.

Bunu aklımda tutarak Target.Worksheet.Range("H5")şunları kullanırdım :

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

Veya Me.Range("H5"), olay işleyicisi söz konusu çalışma sayfasının kod sayfasındaysa (genellikle öyledir) kullanabilirsiniz:

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

Bu yardımcı olur umarım...


4
Ya hücre H5başka bir sayfadan değiştirilirse, diyelim ki sheet2 yukarıdaki işlev çalışmıyor. plz bu konuda yardım.
dhpratik

2
Buraya bir google aramasından gelenler için, benim yaptığım gibi bir modül değil, bu kodu vba'daki sayfaya yapıştırdığınızdan emin olun. bakmak stackoverflow.com/questions/15337008/...
hammythepig

Application.ActiveSheet.Range ("H5"). ==> target.parent.range ("H5") daha da güvenli
Pierre

1
@WillEdiger Bir sayfa referansını ActiveSheetaçıkça belirtmediğinizde, Excel çalıştığınız kişinin Excel olduğunu açıkça belirtmediğinizde, Excel varsayar Application.
Scott Marcus

1
(A burada mevcut buluşa ait bir çalışma kod modülünde, Not Worksheet_Changeniteliksiz, olay bulunduğu olmalıdır) Rangeetmez değil varsayılan ActiveSheetyerine kodu içeren bir tabakayı ifade eder. Bu yanıttaki kod, bu nedenle, sorudaki kodla etkin bir şekilde aynıdır. (Not: 2009'da bu cevap yazıldığında farklı olabilirdi , ancak olmadığından oldukça eminim.)
YowE3K

7

Kulp Worksheet_Changeolayı veya Workbook_SheetChangeolay.

Olay işleyicileri, "Aralık Olarak Hedef" bağımsız değişkenini alır, böylece değişen aralığın ilgilendiğiniz hücreyi içerip içermediğini kontrol edebilirsiniz.


Teşekkürler, işe yarıyor. Mesela, ile aralığı kontrol ediyorum Target.Address = Range("H5").Address. Daha kolay bir yol var mı?
namin

Alternatif: Not (Intersect(Target, Range("H5")) Is Nothing) . Böyle mi yapardın?
namin

2
Hücreniz değiştirilen aralığın Target.Address = Range("H5").Addressyalnızca bir parçası olsaydı ilk yorum ( ) işe yaramazdı. İkinci yorum, hala Mike Rosenblum tarafından açıklanan sorunlardan muzdariptir.
Karınca

5

Olay tetikleyicilerini gerçekten karıştırdıktan sonra, bunu araştırmak ve nasıl çalıştığını öğrenmek için çok zaman harcadım. Çok fazla dağınık bilgi olduğu için, bulduğum şeyleri tek bir yerde, adım adım aşağıdaki gibi paylaşmaya karar verdim:

1) VBA Projesi (YourWorkBookName.xlsm) altında VBA Düzenleyicisini açın, Microsoft Excel Nesnesini açın ve değişiklik olayının ilgili olacağı Sayfayı seçin.

2) Varsayılan kod görünümü "Genel" dir. Ortadaki açılır listeden "Çalışma Sayfası" nı seçin.

3) Private Sub Worksheet_SelectionChange olması gerektiği gibi zaten orada, onu yalnız bırakın. Mike Rosenblum'un kodunu yukarıdan kopyalayın / yapıştırın ve .Range referansını değişiklik için izlediğiniz hücreye değiştirin (benim durumumda B3). Ancak Makronuzu henüz yerleştirmeyin ("Sonra" dan sonra "Makro" kelimesini kaldırdım):

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

veya sol üstteki açılır listeden "Değiştir" i seçin ve Özel Abone ile Son Abone arasındaki boşluğa yapıştırın If Not Intersect(Target, Me.Range("H5")) Is Nothing Then

4) "Sonra" dan sonraki satırda olayları kapatın, böylece makronuzu çağırdığınızda olayları tetiklemez ve bu Çalışma Sayfası_Değişini Excel'i çökerten ve / veya her şeyi karıştıran hiç bitmeyen bir döngüde tekrar çalıştırmayı deneyin:

Application.EnableEvents = False

5) Makronuzu arayın

Call YourMacroName

6) Olayları tekrar açın, böylece bir sonraki değişiklik (ve diğer tüm / diğer olaylar) tetiklenir:

Application.EnableEvents = True

7) If bloğunu ve Alt:

    End If
End Sub

Kodun tamamı:

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

Bu, modüllerdeki olayları açıp kapatarak sorun yaratır ve sadece değişikliğin tetiklenmesine izin verir, olayları kapatır, makronuzu çalıştırır ve olayları tekrar açar.


3

Bu yolu tercih ederim, hücreyi değil, aralığı kullanmayı

    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

Bir hücreyle aynıdır. Bir aralığı tek bir hücre, sürekli hücre aralığı veya hatta dağınık hücreler (tümü virgülle ayrılmış) olarak ayarlayabilirsiniz.
Shai Alon

0

Çevrimiçi stok veritabanına bağlı ve sık sık güncellenen bir hücrem var. Hücre değeri her güncellendiğinde bir makroyu tetiklemek istiyorum.

Bunun bir program veya herhangi bir harici veri güncellemesiyle hücre değeri değişikliğine benzer olduğuna inanıyorum, ancak yukarıdaki örnekler bir şekilde benim için çalışmıyor. Bence sorun excel'in dahili olaylarının tetiklenmemesi, ama benim tahminim bu.

Ben aşağıdakileri yaptım

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
Bunu nedense çalıştıramıyorum. Koda VBA'da çalışmasını söylediğimde, bir açılır menü açıyor ve makroyu otomatik olarak çalıştırmak yerine makroyu çalıştırmak isteyip istemediğimi soruyor.
David Van der Vieren
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.