Validar si no existe un dato y cargar formulario

Agradezco de antemano el esfuerzo el tiempo y la dedicación de los expertos; tengo un aplicativo VBA Excel que utilizo para radicación de documentos, para ello previamente debo crear cada uno de los terceros de los cuales se reciben documentos, este proceso y la radicación me funcionan perfectamente, lo que quiero es validar que en el formulario de radicación (Datos) cuando se ingrese un ID de un tercero que no exista en la base de datos, me lance una alerta y pregunte si se desea crear el tercero, si el usuario responde si, entonces lance el formulario Crear_Proveedor para proceder a la captura de los datos del tercero, esto de alguna manera lo he logrado, pero tengo una dificultad que no he podido solucionar y es que cuando la respuesta es SI, me lanza nuevamente el mensaje a lo que debo darle nuevamente SI y entonces si me carga el formulario Crear_Proveedor, al rellenar los datos solicitados en el formulario y dar click en el botón aceptar, me carga el formulario para radicación (Datos), que es lo que quiero lograr, pero el problema es que aquí al parecer se bloquea y creo que es porque la segunda instrucción generada por el segundo SI, esta activo y no se como cerrarla o en su defecto lograr que solo se lance la alerta una sola vez, agradezco a quien amablemente me pueda colaborar con esta situación, adjunto imágenes de los formularios y del mensaje de alerta.

El código que estoy utilizando es el siguiente:

'revisa si el proveedor existe
Private Sub comboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim datox As String
Set ho = Sheets("Proveedores")
datox = ComboBox1
Set busco = ho.Range("A:A").Find(datox, LookIn:=xlValues, LookAt:=xlWhole)
If busco Is Nothing Then
'solicito confirmación
    sino = MsgBox("EL PROVEEDOR INGRESADO NO EXISTE, DESEA CREARLO?", vbCritical + vbYesNo, "ALERTA")
    If sino = vbYes Then
'Cargo la variable Nit
Nit = Datos.ComboBox1
'Cierro el form
        Unload Datos
'Cargo el form para crear al tercero
        Load Crear_Proveedor
        Crear_Proveedor.TextBox1 = Nit
        Crear_Proveedor.Show
     Else
       ComboBox1 = ""
       ComboBox1.SetFocus
     End If
End If
End Sub
Respuesta
3

Te explico los pasos para que lo agregues a tu modelo.

Este es mi modelo, donde llamo a un 2do Userform cuando no se encuentra el producto. Mi código se encuentra en el objeto 'image' con el lápiz, y en tu caso sería en el valor SI del MsgBox:

Private Sub Image4_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
'se muestra el 2do UF SIN CERRAR el primero.
UF_Material.Show  'para crear nuevo producto
'al regresar selecciona el control que corresponda en el orden
TextBox3.SetFocus
End Sub

En el 2do formulario, al Guardar, se pasan los campos al primer formulario (opcional) y se cierra. Continuando tu tarea desde el primer formulario que no se cerró ni tampoco es necesario recargarlo:

Private Sub CommandButton2_Click()     'botón guardar
'instrucciones para control de contenidos
'..........................
'si debe mostrar en el primer formulario los campos del nuevo registro
    UF_Compras.ComboBox6.Value = Val(TextBox1.Value)
    UF_Compras.TextBox11.Text = TextBox3.Text
    UF_Compras.TextBox5 = TextBox4.Value
'cierra este formulario
Unload Me
End Sub

**Todo lo que necesitan para trabajar con Userforms y sus controles lo encontrarán aquí (con demo e índice de contenidos):

https://aplicaexcel.com/contenidomanuales/#man02 

Estimada Elsa, primero que todo muchísimas gracias por su respuesta, es un excelente aporte, solo que en mi caso los ID que se van adicionando los muestro mediante el evento Activate del formulario Datos con este código For j = 2 To Hoja3.Range("B" & Rows.Count).End(xlUp).Row, para posteriormente poderlos seleccionar y/o mostrar; con las instrucciones que me envía logré solucionar el tema de la alerta, pero ahora necesito actualizar el rango de la variable j incluyendo el nuevo ID o fila que se acaba de adicionar, es posible que me colabore con esta situación?.

Nuevamente muchas gracias por su respuesta

Te estoy devolviendo el libro. Comento las instrucciones agregadas:

1- En el módulo 1 declaré la variable 'llama'. Esto es para diferenciar los 2 procesos que llaman al formulario de registro de Proveedores. Si lo llama 'Datos' tienen que ejecutarse otras instrucciones.

Public llama as Byte

2- Al momento de ingresar un ID no registrado y optar por SI, se agregan estas instrucciones para llamar al UF (Crear_Proveedor).

  ' **** EM: se marca la variable pública
            llama = 1
            Crear_Proveedor.TextBox1 = Rut
            Crear_Proveedor.TextBox1.Enabled = False    'para que no se modifique
            Crear_Proveedor.Show
            'al regresar ya se mostrarán los campos del nuevo registro
            llama = 0
  ' *****************************

3- Y al Crear Proveedor, si fue llamado desde Datos se agregan los nuevos campos a los controles ComboBox y se los muestra. A continuación se cierra  Crear_Proveedor 

'******  EM:   antes de cerrar pasar a Datos los campos creados y volver a ese UF
    If llama = 1 Then
        'agregar los nuevos elementos a los combos de Datos
        With Datos
            .ComboBox1.AddItem TextBox1.Value
            .ComboBox2.AddItem TextBox2.Text
            .ComboBox1 = TextBox1.Value
            .ComboBox2 = TextBox2.Text
        End With
    End If
' ***********************************

Te invito a mirar el video Nº 11: Mejoras en Código... hay un par de detalles que podrías adoptar ;)

1 respuesta más de otro experto

Respuesta

Para solucionar este problema, puedes agregar una bandera booleana que controle si el formulario Crear_Proveedor ya se ha abierto o no. Aquí tienes una versión modificada de tu código que incorpora esta solución:

Dim abrirFormulario As Boolean ' Bandera para controlar si el formulario ya está abierto
'revisa si el proveedor existe
Private Sub comboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Dim datox As String
    Set ho = Sheets("Proveedores")
    datox = ComboBox1
    Set busco = ho.Range("A:A").Find(datox, LookIn:=xlValues, LookAt:=xlWhole)
    If busco Is Nothing Then
        ' Verificar si el formulario ya está abierto
        If Not abrirFormulario Then
            ' Solicitar confirmación
            sino = MsgBox("EL PROVEEDOR INGRESADO NO EXISTE, DESEA CREARLO?", vbCritical + vbYesNo, "ALERTA")
            If sino = vbYes Then
                ' Cargar la variable Nit
                Nit = Datos.ComboBox1
                ' Cerrar el formulario
                Unload Datos
                ' Abrir el formulario para crear al tercero
                abrirFormulario = True ' Establecer la bandera en Verdadero
                Load Crear_Proveedor
                Crear_Proveedor.TextBox1 = Nit
                Crear_Proveedor.Show
            Else
                ComboBox1 = ""
                ComboBox1.SetFocus
            End If
        End If
    End If
End Sub
' Evento para restablecer la bandera cuando se cierra el formulario
Private Sub UserForm_Terminate()
    abrirFormulario = False ' Restablecer la bandera a Falso
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas