2012-04-04 15 views
8

Estoy tratando de escribir una macro simple para mostrar una ventana emergente (vbOKOnly) si el valor en una celda excede un cierto valor.Código VBA para mostrar la ventana emergente Message Box si la fórmula en la celda objetivo excede un cierto valor

Básicamente tengo una hoja de trabajo con productos y descuentos. Tengo una fórmula en una celda, digamos A1, que muestra el descuento como un descuento efectivo porcentual (50% o .5) de todas las entradas.

Lo que estoy buscando es un código para mostrar un cuadro de mensaje si el valor de la celda A1 excede el 50%, porque la entrada de otra celda empujó el descuento sobre el 50%.

Gracias!

+3

¿Conoce el formato condicional? ¿Hay alguna razón por la que prefiera un MsgBox al formato condicional? –

Respuesta

14

Se podría añadir el siguiente código VBA para su hoja:

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

Cada vez que se cambia una celda de la hoja, se comprobará el valor de la celda A1.

Notas:

  • si A1 también depende de los datos ubicados en otras hojas de cálculo, la macro no ser llamados si cambia los datos.
  • se llamará a la macro cada vez que algo cambie en su hoja. Si tiene mucha fórmula (como en 1000), podría ser lenta.

Widor utiliza un enfoque diferente (Worksheet_Calculate en lugar de Worksheet_Change):

  • Pros: su método funcionará si el valor de A1 está ligado a las células ubicadas en otras hojas.
  • Contras: si tiene muchos enlaces en su hoja que hacen referencia a otras hojas, su método se ejecutará un poco más lento.

Conclusión: utilizar Worksheet_Change si A1 solo depende de los datos situados en la misma hoja, utilice Worksheet_Calculate si no.

+0

Sí, tienes razón. Eliminé mi publicación. Parece que leí mal la pregunta :) +1 para hacerlo bien :) –

+0

@SiddharthRout para ser honesto, primero respondí con validación de datos, hasta que leí la tercera línea de la pregunta;) – assylias

+0

LOL @ assylias. Nos recuerda que todavía somos humanos;) –

1

No creo que un cuadro de mensaje sea la mejor manera de hacerlo ya que necesitaría que el código de VB se ejecute en un bucle para verificar el contenido de la celda, o a menos que planee ejecutar la macro manualmente. En este caso, creo que sería mejor agregar un formato condicional a la celda para cambiar el fondo a rojo (por ejemplo) si el valor excede el límite superior.

+2

No hay necesidad de un bucle. – assylias

+1

@assylias Estaba pensando en una secuencia de comandos localizada para centrarme en dicha celda, si utiliza el método que ha proporcionado, entonces no es necesario ningún ciclo, pero como dice que cuantos más datos haya en la hoja de cálculo, más tiempo llevará correr. –

+0

@assylias Encontrado esto mientras buscaba el tema. En realidad, Matt tiene razón. Mientras que un bucle no se utiliza en la sintaxis en VBa, un cambio de hoja de cálculo, en efecto, es una llamada constante de "bucle". En otras palabras, es una llamada interna a "¿Sucedió algo?" una y otra vez, cada milisegundo. – ejbytes

2

Esencialmente, desea agregar el código al evento Calculate de la hoja de trabajo correspondiente.

En la ventana Proyecto del editor VBA, haga doble clic en la hoja en la que desea agregar el código y desde los menús desplegables en la parte superior de la ventana del editor, elija 'Hoja de trabajo' y 'Calcular' a la izquierda y derecha respectivamente.

Alternativamente, copie el siguiente código en el editor de la hoja que desea utilizar:

Private Sub Worksheet_Calculate() 

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

End Sub 

De esta manera, cada vez que la hoja de cálculo calcula de nuevo se comprobará para ver si el valor es> 0,5 o 50% .

Cuestiones relacionadas