Visual Basic para Aplicaciones - Sale dos veces un msgbox

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil
Val: 286
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Sale dos veces un msgbox

Publicado por fjpg (135 intervenciones) el 27/08/2019 18:13:27
hola buenas.

Tengo este codigo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub txt_beneficio_Change()
    Dim venta As Double
 
    If txt_compra = "" Then
            txt_beneficio = ""
            txt_compra.SetFocus
            MsgBox "Añade un PRECIO de COMPRA", vbInformation, "CONTROL DE ALMACÉN"
        Exit Sub
    End If
 
    If txt_beneficio = "" Then
        txt_venta = ""
        Else
        venta = (txt_compra * txt_beneficio / 100) + txt_compra
        txt_venta = venta
    End If
End Sub

Me funciona perfecto, pero el msgbox aparece dos veces cuando inserto un % de beneficio antes del precio de compra. Acepto el primer msgbox, y al aceptar me vuelve a salir.

Alguna ayuda??
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de MIGUEL
Val: 424
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Sale dos veces un msgbox

Publicado por MIGUEL (121 intervenciones) el 27/08/2019 19:32:36
Buenas fjpg

Sale dos veces el msgbox porque si escribes por ejemplo el 1 sale el primer msgbox y como le dices que si txt_compra esta vació pues que borre el uno, esto desencadena nuevamente el evento change del txt_beneficio y como se cumple el if vuelve a salir el segundo msgbox, para que no salga puedes omitir borrar el valor de txt_beneficio o pasar el codigo al evento Exit del txt_beneficio.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de alfredo lara
Val: 121
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Sale dos veces un msgbox

Publicado por alfredo lara (40 intervenciones) el 27/08/2019 19:36:06
Saludos fjpg

Es porque estas duplicando el evento con tu código

1
2
3
4
5
6
If txt_compra = "" Then
txt_beneficio = ""   ' OJO
txt_compra.SetFocus
MsgBox "Añade un PRECIO de COMPRA", vbInformation, "CONTROL DE ALMACÉN"
Exit Sub
End If

El primer MsgBox aparece porque tecleaste algo, el segundo porque tu código lanza el evento Change desde la linea que te marque en negritas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Alfredo
Val: 121
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Sale dos veces un msgbox

Publicado por Alfredo (40 intervenciones) el 27/08/2019 19:57:00
Se me olvido comentarte

Tratándose de validar contenidos, mejor usa el evento AfterUpdate

1
2
3
4
5
6
7
8
9
10
Private Sub txt_beneficio_AfterUpdate()
 
If txt_compra = "" Then
txt_beneficio = ""
txt_compra.SetFocus
MsgBox "Añade un PRECIO de COMPRA", vbInformation, "CONTROL DE ALMACÉN"
Exit Sub
End If
 
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 286
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Sale dos veces un msgbox

Publicado por fjpg (135 intervenciones) el 28/08/2019 12:06:27
Hola. Gracias por todas las respuetsas.

Si muevo el codigo al evento txt_beneficio_AfterPrivate , me sale error en la linea que indico

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub txt_beneficio_Change()
    Dim venta As Double
        If txt_compra = "" Then
                txt_beneficio = ""
                txt_compra.SetFocus
                MsgBox "Añade un PRECIO de COMPRA", vbInformation, "CONTROL DE ALMACÉN"
            Exit Sub
        End If
 
    If txt_beneficio = "" Then
        txt_venta = ""
    Else
        venta = (txt_compra * txt_beneficio / 100) + txt_compra 'AQUI ME DA ERROR.
        txt_venta = venta
    End If
End SuB


el codigo funciona de la siguiente manera_
3 textbox_
txt_compra 10€
txt_beneficio 50%
txt_venta 15€

Ahora bien. si coloco el porcentaje de beneficio primero, necesito que salga el msgbox indicando que añada un precio de compra y se vacie el txt_beneficio. Una vez añadido el precio de compra, relleno el % de beneficio, y automaticamente se rellena el precio de venta.

UNA AYUDITA A UN NOVATILLO !!! XD XD XD



P.D:

Dejando el codigo asi, y sin vaciar el txt_beneficio consigo que solo salga una vez el msgbox, pero no me vacia la caja de texto, pero si no lo vacio , me da error en la misma fila del codigo, si coloco primero el porcentaje y luego lo borro.
A ver si me ayudais a que vacie el textbo.

1
2
3
4
5
6
7
8
9
Dim venta As Double
If txt_compra = "" Then
'       txt_beneficio = ""
        txt_compra.SetFocus
        MsgBox "Añade un PRECIO de COMPRA", vbInformation, "CONTROL DE ALMACÉN"
    Else
        venta = (txt_compra * txt_beneficio / 100) + txt_compra
        txt_venta = venta
End If
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 286
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Sale dos veces un msgbox

Publicado por fjpg (135 intervenciones) el 28/08/2019 12:28:49
Solucionado....

Hasta que no añades el precio de compra, el % de beneficio no se activa..
Es lo unico que se me ocurrio.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub txt_compra_Change()
    If txt_compra = "" Then
        txt_beneficio.Enabled = False
    Else
        txt_beneficio.Enabled = True
    End If
End Sub
 
 
Private Sub txt_beneficio_Change()
    If txt_beneficio = "" Then
        txt_venta = ""
    Else
        venta = (txt_compra * txt_beneficio / 100) + txt_compra
        txt_venta = venta
    End If
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de alfredo lara
Val: 121
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Sale dos veces un msgbox

Publicado por alfredo lara (40 intervenciones) el 28/08/2019 16:03:59
Hola fjpg

Claro que te da un error, solo tenias que poner la validación de datos en el evento AfterUpdate, las demás lineas quedarían en el evento Change,

Pero veo mensajes abajo que lo solucionaste, felicidades. todos empezamos así.

Sigue así y te veremos en un futuro dándonos clases.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar
sin imagen de perfil
Val: 10
Ha aumentado su posición en 4 puestos en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Sale dos veces un msgbox

Publicado por Raúl Mejía (5 intervenciones) el 27/08/2019 20:52:08
Hola fjpg, buenas tardes, probé tu código y efectivamente no se porque razón entra dos veces en el evento change, tal vez será porque le mueves "" a txt_beneficio si el txt_compra es "", yo lo hice de la siguiente manera y si funcionó correctamente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub txt_beneficio_TextChanged(sender As Object, e As EventArgs) Handles txt_beneficio.TextChanged
    Dim venta As Double
 
    If txt_compra.Text = "" Then
        MsgBox("Añade un PRECIO de COMPRA", vbInformation, "CONTROL DE ALMACÉN")
        txt_compra.Focus()
        txt_compra.Select()
        Exit Sub
    End If
 
    If txt_beneficio.Text = "" Then
        txt_venta.Text = ""
    Else
        venta = (txt_compra.Text * txt_beneficio.Text / 100) + txt_compra.Text
        txt_venta.Text = venta
    End If
End Sub


Le quite la línea donde le mueves "" a txt_beneficio si txt_compra es "" y solo llamó una vez al msgbox, me supongo que estás programando en VB6, yo lo hice en visual studio 2017, entonces sólo quítale esa línea.

Saludos desde México.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Hector Madriz
Val: 131
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Sale dos veces un msgbox

Publicado por Hector Madriz (29 intervenciones) el 28/08/2019 18:28:05
Buen día, este comportamiento recursivo se puede controlar simulando un Application.EnableEvents True/False ejemplo:

1
2
3
4
5
6
7
8
9
Public Sw As Boolean ' Variable del modulo para ignorar código del evento
 
Private Sub TextBox1_Change()
  If Sw Then Exit Sub ' Salir si ignorar codigo es verdad
  Sw = True   ' Activa ignorar código del evento
  TextBox1 = "Valor Nuevo"
  Sw = False  ' Desactiva ignorar código del evento
  MsgBox "Valor cambiado", vbInformation, "Lea"
End Sub


Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de JOSE
Val: 3
Ha aumentado su posición en 26 puestos en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Sale dos veces un msgbox

Publicado por JOSE (1 intervención) el 18/02/2021 10:26:15
Hola a mi me pasa lo mismo alguna solucion si esta con foto no hay problema pero si no tiene o esta vacia me sale el error 2 veces , perdonar por sacar el tema de nuevo ...


Private Sub Label31_Click()
Check1 = 1 - Unchecked
Image1.Picture = LoadPicture(foto2) 'estamos en la foto 2
If Image1.Picture = LoadPicture("") Then 'delo contrario si no hay o esta vacia
MsgBox "No hay foto N2", vbExclamation, "Aviso" 'msgbos de aviso
Image1.Picture = LoadPicture("c:\componentes\fotos\nofoto.jpg") 'pues pasamos a la 1
end if


solucionado este estaba bien en otro procedimiento se estaba repitiendo .....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar