Foros del Web » Soporte técnico » Ofimática »

Msgbox y excel

Estas en el tema de Msgbox y excel en el foro de Ofimática en Foros del Web. Quiero que cuando se introduzca un valor inferior a 2 en a1 me salga un msgbox, mi código es el siguiente: Private Sub hola() If ...
  #1 (permalink)  
Antiguo 01/03/2006, 08:46
Avatar de niconico  
Fecha de Ingreso: enero-2006
Mensajes: 166
Antigüedad: 18 años, 3 meses
Puntos: 0
Msgbox y excel

Quiero que cuando se introduzca un valor inferior a 2 en a1 me salga un msgbox, mi código es el siguiente:
Private Sub hola()
If Range("a1").Value < 2 Then
MsgBox ("hola a todos")
End If
End Sub
Introduzco el código en el editor de visual pero no pasa nada, cual puede ser el error? muchas gracias
  #2 (permalink)  
Antiguo 01/03/2006, 09:32
Avatar de 3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 20 años, 4 meses
Puntos: 144
Para hacer lo que pretendes, puedes utilizar la opción de validar datos. Sitúate en la celda A1, y selecciona dentro del menú Datos, la opción Validación.... En la pestaña Configuración puedes determinar el tipo de dato que aceptas para esa celda (o rango de celdas). Puedes mostrar un mensaje informativo, al situarte encima de la celda, y otro en el caso de que el usuario introduzca un dato no permitido, utilizando las otras dos petañas (Mensaje entrante, y Mensaje de error).
  #3 (permalink)  
Antiguo 01/03/2006, 09:39
Avatar de niconico  
Fecha de Ingreso: enero-2006
Mensajes: 166
Antigüedad: 18 años, 3 meses
Puntos: 0
Gracias pero prefiero poner otro símbolo que no sea el de error
  #4 (permalink)  
Antiguo 01/03/2006, 09:41
Avatar de 3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 20 años, 4 meses
Puntos: 144
También puedes poner el de advertencia o el de información.
  #5 (permalink)  
Antiguo 01/03/2006, 09:48
Avatar de dogduck  
Fecha de Ingreso: enero-2006
Ubicación: ¿Atlantida, Hesperides, Islas afortunadas?
Mensajes: 2.231
Antigüedad: 18 años, 3 meses
Puntos: 19
Vete al editor de vba y en hoja1 :

Código:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Range("a1").Value < 2 Then
MsgBox ("hola a todos")
End If


End Sub
  #6 (permalink)  
Antiguo 01/03/2006, 10:03
Avatar de 3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 20 años, 4 meses
Puntos: 144
Con el mismo código de dogduck, quizás mejor llamar a Worksheet_Change, para que al movernos por la hoja, no salte el Msgbox
  #7 (permalink)  
Antiguo 01/03/2006, 10:20
Avatar de niconico  
Fecha de Ingreso: enero-2006
Mensajes: 166
Antigüedad: 18 años, 3 meses
Puntos: 0
Muchas gracias ya lo he solucionado
  #8 (permalink)  
Antiguo 02/03/2006, 13:48
Colaborador
 
Fecha de Ingreso: agosto-2004
Mensajes: 1.611
Antigüedad: 19 años, 8 meses
Puntos: 47
¿Cómo lo solucionaste?
  #9 (permalink)  
Antiguo 03/03/2006, 02:50
Avatar de niconico  
Fecha de Ingreso: enero-2006
Mensajes: 166
Antigüedad: 18 años, 3 meses
Puntos: 0
Introduje el código Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Range("a1").Value < 2 Then
MsgBox ("hola a todos")
End If


End Sub

en el editor de visual (herramientas/macro/editor de visual basic y en la hoja que quería que me saliera el msgbox pegué el código, y ya está. Dada vez que el valor de a1 es inferior a 2 salta el msgbox. Después cambié Worksheet_SelectionChange por Worksheet_Change para que no estuviera saltando el msgbox todo el tiempo.
Saludos
  #10 (permalink)  
Antiguo 03/03/2006, 04:21
 
Fecha de Ingreso: noviembre-2005
Mensajes: 170
Antigüedad: 18 años, 5 meses
Puntos: 1
Esta bien lo que dices, pero ese código tiene un problema. Si tú escribes un valor en la celda a1 que sea <2 y haces un cambio en una celda cualquiera aunque no sea la celda en cuestión te saltará el msgbox. Si quieres que en cualquier cambio en cualquier celda te salga el mensaje dejalo así. Si lo que quieres es que cuando hagas algún cambio en alguna celda específica el código cambia un poco. Si deseas esta 2ª idea comentame y te lo mando.
__________________
El sabio no dice nunca todo lo que piensa,
pero siempre piensa todo lo que dice.
Aristóteles :pensando:
  #11 (permalink)  
Antiguo 03/03/2006, 04:41
Avatar de 3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 20 años, 4 meses
Puntos: 144
Creo que potypoty se refiere a esto:
Código:
Private Sub Worksheet_Change(ByVal Target As Range)
'Definimos el rango para que se ejecute el Change (fila 1, y columna 1)
If Target.Row = 1 And Target.Column = 1 Then
    If Range("a1").Value < 2 Then
        MsgBox ("hola a todos")
    End If
End If
End Sub
  #12 (permalink)  
Antiguo 03/03/2006, 05:06
 
Fecha de Ingreso: noviembre-2005
Mensajes: 170
Antigüedad: 18 años, 5 meses
Puntos: 1
Efectivamente me refería a eso 3pies, aunque yo lo hago de otra forma. Según la aplicación que utilices te puede venir bien una u otra forma.
Veo que tú también trabajas con excel,eh? Ya te comentaré alguna cosilla que me ronda la cabeza.
__________________
El sabio no dice nunca todo lo que piensa,
pero siempre piensa todo lo que dice.
Aristóteles :pensando:
  #13 (permalink)  
Antiguo 03/03/2006, 05:14
Avatar de 3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 20 años, 4 meses
Puntos: 144
¿Cómo lo haces tú?. Compartamos conocimientos...
  #14 (permalink)  
Antiguo 03/03/2006, 05:41
 
Fecha de Ingreso: noviembre-2005
Mensajes: 170
Antigüedad: 18 años, 5 meses
Puntos: 1
Lo mio es diferente idea que la de niconico. Yo necesito que si se cambia una celda (G5) me copie ese valor en otras (D15,D28 y P22), pero si se cambia (D15,D28 o P22) también me actualice (G5) y esto para cualquier cambio en cualquiera de ellas. Se me ocurrió esto:
Dim Direccion As String
Private Sub Worksheet_Change(ByVal Target As Range)
Select Case Direccion
Case "$G$5"
Range("D15").Value = Range("G5").Value
Range("D28").Value = Range("G5").Value
Range("P22").Value = Range("G5").Value
Case "$D$15"
Range("G5").Value = Range("D15").Value
Range("D28").Value = Range("D15").Value
Range("P22").Value = Range("D15").Value
Case "$D$28"
Range("G5").Value = Range("D28").Value
Range("D15").Value = Range("D28").Value
Range("P22").Value = Range("D28").Value
Case "$P$22"
Range("G5").Value = Range("P22").Value
Range("D15").Value = Range("P22").Value
Range("D28").Value = Range("P22").Value
End Select
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Direccion = ActiveCell.Address
End Sub

Esto tiene la ventaja que si algún dia necesitas ampliarlo sólo necesitas meter unos "case"s más con las direcciones en cuestión. No sé si será la mejor opción, pero me funciona de madre. Tu código también creo que me pudiera servir y si tengo oportunidad lo probaré.
Creo que tu código podría ser más eficiente que el mio, pero puede que desde el punto de vista visual, de comprensión y de proximas ampliaciones, el mio me parece más cómodo. Me gustaría saber tu opinión.
__________________
El sabio no dice nunca todo lo que piensa,
pero siempre piensa todo lo que dice.
Aristóteles :pensando:
  #15 (permalink)  
Antiguo 03/03/2006, 05:54
 
Fecha de Ingreso: noviembre-2005
Mensajes: 170
Antigüedad: 18 años, 5 meses
Puntos: 1
Me he cargado sin querer una varible llamada Cambiar que utilizo para evitar que se meta en un bucle infinito. Te mando el código correcto.
Dim Direccion As String
Private Sub Worksheet_Change(ByVal Target As Range)
If Cambiar Then
Select Case Direccion
Case "$G$5"
Range("D15").Value = Range("G5").Value
Range("D28").Value = Range("G5").Value
Range("P22").Value = Range("G5").Value
Case "$D$15"
Range("G5").Value = Range("D15").Value
Range("D28").Value = Range("D15").Value
Range("P22").Value = Range("D15").Value
Case "$D$28"
Range("G5").Value = Range("D28").Value
Range("D15").Value = Range("D28").Value
Range("P22").Value = Range("D28").Value
Case "$P$22"
Range("G5").Value = Range("P22").Value
Range("D15").Value = Range("P22").Value
Range("D28").Value = Range("P22").Value
End Select
Cambiar=False
End If
End Sub


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Direccion = ActiveCell.Address
Cambiar = True
End Sub

Creo que esta vez está todo. El problema que mi código es mucho más extenso que esto y lo he acortado para que sea más cómodo verlo y entenderlo.
__________________
El sabio no dice nunca todo lo que piensa,
pero siempre piensa todo lo que dice.
Aristóteles :pensando:
  #16 (permalink)  
Antiguo 03/03/2006, 06:02
 
Fecha de Ingreso: noviembre-2005
Mensajes: 170
Antigüedad: 18 años, 5 meses
Puntos: 1
Soy un DESASTRE no te he copiado debajo de Dim Direccion as String la declaración de Cambiar Dim Cambiar As Boolean, pero me imagino que esto ya te lo hubieras supuesto . Ahora seguro que está todo.
__________________
El sabio no dice nunca todo lo que piensa,
pero siempre piensa todo lo que dice.
Aristóteles :pensando:
  #17 (permalink)  
Antiguo 03/03/2006, 06:27
Avatar de 3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 20 años, 4 meses
Puntos: 144
Yo porque lo ví en un ejemplo, que sino, no te creas que doy con eso, jajajajaja. Tu código debe ser tan eficiente como ese otro que puse (al que no llamaré "mío", jajajaja). Uno simplemente tiene un condicional para mirar el rango de datos que cambia, y ejecutar el procedimiento, y el otro tiene un select case (aunque este último necesia llamar a 2 eventos, ...cosa que no he probado con el otro código, si quisiera cambiar un dato de una celda, al cambiar otra, y cambiar esta última, al cambiar la de origen).
  #18 (permalink)  
Antiguo 03/03/2006, 06:40
 
Fecha de Ingreso: noviembre-2005
Mensajes: 170
Antigüedad: 18 años, 5 meses
Puntos: 1
Vas a necesitar una variable extra que impida que la macro se te meta en un bucle INFINITO, debido a que cuando pones el valor de la primera en la segunda es un cambio de página y salta de nuevo la función para cambiar otra vez el mismo valor y así hasta el infinito.
Yo utilizo las dos funciones porque la de seleccionar lo único que me hace a parte de conseguir la dirección es asegurarme que el segundo cambio no active de nuevo el proceso.
__________________
El sabio no dice nunca todo lo que piensa,
pero siempre piensa todo lo que dice.
Aristóteles :pensando:
  #19 (permalink)  
Antiguo 03/03/2006, 08:40
Avatar de 3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 20 años, 4 meses
Puntos: 144
Pues en principio creía que tenías razón (yo pensaba lo mismo), pero ejecuta esto y verás:
Código:
Private Sub Worksheet_Change(ByVal Target As Range)
'Si ponemos un dato en A1, nos pone el mismo dato en A2
If Target.Row = 1 And Target.Column = 1 Then
    If Range("a1").Value <> "" Then
        Range("a2").Value = Range("a1").Value
    End If
End If
'Si ponemos un dato en A2, nos pone el mismo dato en A1
If Target.Row = 2 And Target.Column = 1 Then
    If Range("a2").Value <> "" Then
        Range("a1").Value = Range("a2").Value
    End If
End If
End Sub
Funciona, y tiene su lógica, porque la celda que cambia, es solo una, y por tanto solo puede ejecutarse un condicional de los dos que se incluyen en el procedimiento que llama al evento Change.
  #20 (permalink)  
Antiguo 03/03/2006, 09:27
 
Fecha de Ingreso: noviembre-2005
Mensajes: 170
Antigüedad: 18 años, 5 meses
Puntos: 1
Si con dos ya sé que funciona , pero prueba esto:

Private Sub Worksheet_Change(ByVal Target As Range)
'Si ponemos un dato en A1, nos pone el mismo dato en A2 y A3
If Target.Row = 1 And Target.Column = 1 Then
If Range("a1").Value <> "" Then
Range("a2").Value = Range("a1").Value
Range("a3").Value = Range("a1").Value
End If
End If
'Si ponemos un dato en A2, nos pone el mismo dato en A1 y A3
If Target.Row = 2 And Target.Column = 1 Then
If Range("a2").Value <> "" Then
Range("a1").Value = Range("a2").Value
Range("a3").Value = Range("a2").Value
End If
End If
'Si ponemos un dato en A3, nos pone el mismo dato en A1 y A2
If Target.Row = 3 And Target.Column = 1 Then
If Range("a3").Value <> "" Then
Range("a1").Value = Range("a3").Value
Range("a2").Value = Range("a3").Value
End If
End If
End Sub

Esto, pero a mayor medida necesito para mi curro. Cuando vi tu código lo probé con mis cambios y no sé por qué exactamente no funciona. Bueno, en realidad lo que no entendía era por qué con dos cambios si funciona. Tu al escribir en la celda A2 estás haciendo un cambio y eso debería hacer saltar el proceso.
Igual estoy haciendo algo mal y no lo veo. Si lo pruebas y te funciona me gustaría saber qué has cambiado.
Ya me dirás.
__________________
El sabio no dice nunca todo lo que piensa,
pero siempre piensa todo lo que dice.
Aristóteles :pensando:
  #21 (permalink)  
Antiguo 03/03/2006, 09:57
Avatar de 3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 20 años, 4 meses
Puntos: 144
Pues con 3 no funciona, pero con 2 sí. Voy a estudiar este fin de semana el motivo (ahora voy pilladísimo de tiempo). Igual no saco nada en claro, pero con 3 no funciona y con 2 sí.

Al principio pensé que entraría en un bucle infinito, pero luego, al ver que funcionaba, me dije "claro, es como si tienes un rango de datos que sumas, y cambias un valor del rango. Al cambiar ese valor, la suma cambia, pero no necesariamente hace saltar el evento change, para entrar de nuevo en el bucle".

No tengo ni idea de porqué de una forma funciona, y de la otra no. Igual es por una chorrada, pero así a bote pronto, no lo veo.
  #22 (permalink)  
Antiguo 04/03/2006, 11:15
 
Fecha de Ingreso: agosto-2003
Mensajes: 272
Antigüedad: 20 años, 7 meses
Puntos: 0
que tal esta:
Range("A1").select
dim i as integer
i = val(activeCell.formulaR1C1)
Private Sub hola()
If i < 2 Then
MsgBox ("hola a todos")
End If
End Sub
  #23 (permalink)  
Antiguo 06/03/2006, 03:12
Avatar de 3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 20 años, 4 meses
Puntos: 144
No he encontrado ninguna explicación del porqué funciona cambiando 2 celdas, y no funciona con tres. Para mi es un expediente X. A ver si alguien está menos espeso, y nos saca de dudas.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:25.