2015-01-19 15 views
7

Görsel temel ile ilgili bir sorunum var. 3 ile girdiğim bir sayıyı çarpacak ve aynı hücreye bir sonuç verecek bir makro/işlev yapmak istiyorum. Böyle bir şey denedik:VBA'da sonlu "değişiklik" döngüsü nasıl sonlanır

Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Address = "$Q$21" Then 
     Target.Value = Target.Value * 3 
    End If 
End Sub 

ama çalışmıyor - bu çarpılarak tutar çünkü "xE25" gibi sonuçlar alıyorum.

İlk yinelemeden sonra durmasını isterim ya da yalnızca hücrede her değişiklik yapıldığında "enter" a bastığımda çalışırım.
Farklı bir hücreye sonuç eklemek oldukça kolay, ama benim amacım değil.


----- Düzenleme: bu yüzden bana yetiyor hücreleri üzerinde çalışacak
If (Target.Column = 5 Or Target.Column = 11 Or Target.Column = 17 Or Target.Column = 23) And (Target.Row >= 19 And Target.Row <= 24) And Target.Value <> "" Then
: Satır "Eğer"
Ben düzenlenebilir. Bundan sonra, en iyi çözüm @ Chrismas007 tarafından verilen yoldur, çünkü bir kerede birkaç hücrede veriyi silmeye çalışırken bir hata bildirmez. Bir Worksheet_Change olay makro bir değer değiştirdiğinde

+1

Gerçek – Plutonix

+0

Üzgünüm, bu dile yeni vermedi değilim Ne seçeceğinizi bilin: P – Pawel

cevap

5

True kadar uzanan: IsVBA Veya IsExcel-vba Sonra IsNot (vb.net) = eğer

Sub Worksheet_Change(ByVal Target As Range) 
    On Error GoTo CleanExit 
    If Target.Address = "$Q$21" Then 
     Application.EnableEvents = False 
     Target.Value = Target.Value * 3 
    End If 
CleanExit: 
    Application.EnableEvents = True 
    On Error GoTo 0 
End Sub 
6

, sen riski başka olay tetikleyici ve kendi üzerine makro çalıştırmak sahip Application.EnableEvents yanlış veya ayarlamanız gerekir.

Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Address = "$Q$21" Then 
     Application.EnableEvents = False 
     Target.Value = Target.Value * 3 
     Application.EnableEvents = True 
    End If 
End Sub 

Ben genellikle .EnableEvents hep gerçek için sıfırlandı bu sırayla bazı hata kontrolünü içerecektir ederken, yukarıda başlamak gerekir.

Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Address = "$Q$21" Then 
     application.enableevents = false 
     Target.Value = Target.Value * 3 
     application.enableevents = true 
    End If 
End Sub 

Sadece alternatif olarak, aynı zamanda sizin kod iki kez bile etmiyor olsa tepki anlamına gelecektir olmasına rağmen daha çok EnableEvents ile müdahalesi yerine kendi değişkeni kullanabilirsiniz:

2

Sen tekrarlama önlemek için olayları devre dışı bırakmanız gerekir 't aslında yuvarlak için herşeyi ikinci kez yapın:

Dim bSkipEvents as Boolean 
    Sub Worksheet_Change(ByVal Target As Range) 
     If bSkipEvents then exit sub 
     If Target.Address = "$Q$21" Then 
      bSkipEvents = True 
      Target.Value = Target.Value * 3 
      bSkipEvents = False 
     End If 
    End Sub 

Bu aynı zamanda kullanıcı formları ve çalışma sayfaları üzerinde activeX denetimleri için en olaylarla ihtiyaç yaklaşımın tür. .EnableEvents sağlamak için hata işleme ile

+0

Birkaç saniye çok yavaş @Rory ... – Chrismas007

+1

@ Chrismas007 Görebildiğim kadarıyla, ilk ben ...;) – Rory

+0

nope: http://imgur.com/fEfwg41 – Chrismas007

İlgili konular