2012-04-04 16 views
8

Sto tentando di scrivere una semplice macro per visualizzare un popup (vbOKOnly) se il valore in una cella supera un determinato valore.Codice VBA per mostrare popup della finestra di messaggio se la formula nella cella di destinazione supera un certo valore

Fondamentalmente ho un foglio di lavoro con prodotti e sconti. Ho una formula in una cella, ad esempio A1, che mostra lo sconto come percentuale (50% o 0,5) di sconto effettivo su tutte le voci.

Quello che sto cercando è codice per visualizzare una finestra di messaggio se il valore della cella A1 supera il 50%, perché l'input di un'altra cella ha spinto lo sconto oltre il 50%.

Grazie!

+3

Sei a conoscenza della formattazione condizionale? C'è una ragione per cui preferisci un MsgBox alla formattazione condizionale? –

risposta

14

Si potrebbe aggiungere il seguente codice VBA al foglio:

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

Ogni volta che una cellula si modifica sul foglio, sarà controllare il valore di cella A1.

Note:

  • se A1 dipende anche da dati che si trovano in altri fogli di calcolo, la macro non essere chiamato se si cambia i dati.
  • la macro verrà richiamata ogni volta che qualcosa cambia sul foglio. Se ha un sacco di formula (come in 1000) potrebbe essere lento.

Widor utilizza un approccio diverso (Worksheet_Calculate anziché Worksheet_Change):

  • Pro: il suo metodo funziona se il valore di A1 è legata alle cellule situate in altri fogli.
  • Contro: se sul foglio sono presenti molti collegamenti che fanno riferimento ad altri fogli, il suo metodo verrà eseguito un po 'più lentamente.

Conclusione: utilizzare Worksheet_Change se A1 dipende solo dati che si trovano sullo stesso foglio, utilizzare Worksheet_Calculate se non.

+0

Sì, hai ragione. Ho cancellato il mio post. Sembra che abbia interpretato erroneamente la domanda :) +1 per averlo capito correttamente :) –

+0

@SiddharthRout a dire il vero ho risposto per primo con la convalida dei dati, fino a quando ho letto la terza riga della domanda;) – assylias

+0

LOL @ assylias. Ci ricorda che siamo ancora umani;) –

1

Non penso che una finestra di messaggio sia il modo migliore per procedere con questo poiché è necessario che il codice VB sia in esecuzione in un ciclo per controllare il contenuto della cella o se non si prevede di eseguire manualmente la macro. In questo caso, penso che sarebbe meglio aggiungere la formattazione condizionale alla cella per cambiare lo sfondo in rosso (ad esempio) se il valore supera il limite superiore.

+2

Non è necessario un ciclo. – assylias

+1

@assylias Stavo pensando sulla falsariga di uno script localizzato su cui porre attenzione su detta cella, se si utilizza il metodo che hai fornito, allora è richiesto il vero ciclo no, ma come dici più dati sul foglio di calcolo più tempo ci vorrà per correre. –

+0

@assylias Trovato questo durante la ricerca dell'oggetto. In realtà, Matt ha ragione. Mentre un loop non viene utilizzato nella sintassi in VBa, un Worksheet_Change, in effetti è una chiamata "looping" costante. In altre parole, è una chiamata interna a "Qualcosa è successo ancora?" più e più volte, ogni millisecondo. – ejbytes

2

In sostanza si desidera aggiungere il codice all'evento Calculate del relativo foglio di lavoro.

Nella finestra Progetto dell'editor VBA, fare doppio clic sul foglio a cui si desidera aggiungere il codice e dai menu a discesa nella parte superiore della finestra dell'editor, scegliere "Foglio di lavoro" e "Calcola" a sinistra e giusto rispettivamente.

In alternativa, copiare il codice qui sotto nell'editor del foglio che si desidera utilizzare:

Private Sub Worksheet_Calculate() 

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

End Sub 

In questo modo, ogni volta che il foglio di lavoro ricalcola si verificherà se il valore è> 0,5 o 50% .