2012-04-04 14 views
8

Próbuję napisać proste makro, aby wyświetlić wyskakujące okienko (vbOKOnly), jeśli wartość w komórce przekracza określoną wartość.Kod VBA, aby wyświetlić okno komunikatu, jeśli formuła w komórce docelowej przekracza określoną wartość

Zasadniczo mam arkusz roboczy z produktami i rabatami. Mam formułę w jednej komórce, powiedzmy A1, która pokazuje zniżkę jako procent (50% lub .5) efektywnej zniżki wszystkich wpisów.

Czego szukam to kod wyświetlający okno komunikatu, jeśli wartość komórki A1 przekracza 50%, ponieważ wejście innej komórki spowodowało obniżenie o ponad 50%.

Dzięki!

+3

Czy znasz formatowanie warunkowe? Czy istnieje powód, dla którego wolisz MsgBox do formatowania warunkowego? –

Odpowiedz

14

Można dodać następujący kod VBA do arkusza:

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Range("A1") > 0.5 Then 
     MsgBox "Discount too high" 
    End If 
End Sub 

każdym razem, gdy komórka ulega zmianie na arkuszu, to sprawdzić wartość komórki A1.

Uwagi:

  • jeśli A1 zależy także od danych znajdujących się w innych arkuszach kalkulacyjnych, makro będzie nie nazwać po zmianie tych danych.
  • makro zostanie wywołane zostanie wywołane za każdym razem, gdy coś zmieni się na twoim arkuszu. Jeśli ma dużo formuły (jak w tysiącach), może być wolny.

Widor używa innego podejścia (Worksheet_Calculate zamiast Worksheet_Change):

  • Plusy: jego metoda zadziała, jeśli wartość A1 jest związana z komórek znajdujących się w innych arkuszach.
  • Minusy: jeśli masz wiele linków na arkuszu, które odwołują się do innych arkuszy, jego metoda będzie działać nieco wolniej.

Wnioski: użyj Worksheet_Change jeśli A1 zależy tylko od danych znajdujących się na tym samym arkuszu, jeśli nie używać Worksheet_Calculate.

+0

Tak, masz rację. Usunąłem mój post. Wygląda na to, że źle odczytałem pytanie :) +1 za poprawne wykonanie :) –

+0

@SiddharthRout szczerze mówiąc Najpierw odpowiedziałem sprawdzaniem poprawności danych, dopóki nie przeczytałem trzeciej linijki pytania;) – assylias

+0

LOL @ assylias. Przypomina nam, że wciąż jesteśmy ludźmi;) –

1

Nie sądzę, że skrzynka z wiadomościami jest najlepszym sposobem, aby to zrobić, ponieważ potrzebujesz kodu VB działającego w pętli, aby sprawdzić zawartość komórki, lub jeśli planujesz uruchomić makro ręcznie. W tym przypadku lepiej byłoby dodać formatowanie warunkowe do komórki, aby zmienić tło na czerwone (na przykład), jeśli wartość przekracza górny limit.

+2

Nie ma potrzeby tworzenia pętli. – assylias

+1

@assylias Miałem na myśli lokalny skrypt skupiający się na wspomnianej komórce, jeśli przy użyciu podanej metody to prawda, nie jest wymagana żadna pętla, ale jak już mówisz, im więcej danych w arkuszu kalkulacyjnym tym dłużej zajmie to biegać. –

+0

@assylias Odszukaj to podczas wyszukiwania tematu. Właściwie Matt ma rację. Podczas gdy pętla nie jest używana w składni w VBa, zmienna Worksheet_Change jest ciągłym wywołaniem "loopowania". Innymi słowy, jest to wewnętrzne wezwanie do "Coś jeszcze się stało?" w kółko, co milisekundę. – ejbytes

2

Zasadniczo chcesz dodać kod do zdarzenia Calculate odpowiedniego Arkuszu.

W oknie projektu edytora VBA, kliknij dwukrotnie arkusz, do którego chcesz dodać kod, i z list rozwijanych u góry okna edytora, wybierz "Arkusz roboczy" i "Oblicz" po lewej i odpowiednio odpowiednio.

Alternatywnie, skopiuj poniższy kod do edytora arkusza chcesz użyć:

Private Sub Worksheet_Calculate() 

If Sheets("MySheet").Range("A1").Value > 0.5 Then 
    MsgBox "Over 50%!", vbOKOnly 
End If 

End Sub 

W ten sposób, za każdym razem, gdy arkusz przelicza to sprawdzić, jeśli wartość wynosi> 0,5 lub 50% .

Powiązane problemy