Estoy creando un formulario de entrada para usar con una 'tableta' en Excel para que nuestros muchachos lo completen cuando estén en el campo. Como las entradas como los menús desplegables y similares son bastante complicadas, deseo usar un formulario de entrada básico con grandes botones de comando Pasa/Falla. En lugar de usar CommandBoxes individuales para llamar al formulario, elegí usar el siguiente código (dentro del objeto/hoja) para llamar el formulario cuando se seleccionan ciertas celdas:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Selection.Count = 2 Then
If Not Intersect(Target, Me.Range("W16:W46,W74:W143")) Is Nothing Then
PFInputForm.Show
End If
End If
End Sub
El formulario de entrada solicita información relativa a ActiveCell para completar el número de artículo, la descripción y los comentarios utilizando el siguiente código en el FORMULARIO.
Private Sub UserForm_Initialize()
PFInputForm.INPUTCOMMENT.Text = CStr(ActiveCell.Offset(0, 1).Value)
PFInputForm.ITEMNO = "Item " & ActiveCell.Offset(0, -2)
PFInputForm.ITEMDESCR = ActiveCell.Offset(0, -1)
End Sub
La intención es que el usuario ingrese un comentario (si corresponde) y luego haga clic en uno de los cuatro botones "Aprobar", "Reprobar", "Aprobar y continuar" y "Reprobar y continuar".
Si hacen clic en "Aprobado" o "Reprobado", tengo un código en el formulario que devuelve el texto del cuadro Comentario a la celda adyacente (usando Desplazamiento), ingresa "P" o "F" respectivamente en la celda activa y cierra el formulario de usuario sin problemas (usando el siguiente código en el FORMULARIO).
Private Sub PASSButton_Click()
PFInputForm.Hide
ActiveCell = "P"
ActiveCell.Offset(0, 1) = PFInputForm.INPUTCOMMENT
End Sub
El problema que tengo es cuando quiero que el usuario haga clic en "Aprobar y continuar" o "Fallar y continuar", donde se supone que sucede lo anterior, pero la celda activa luego baja una celda y abre un nuevo formulario específico. para esa fila.
El código que ejecuto actualmente desde el FORMULARIO para "Pasar y continuar" se encuentra a continuación. El problema que tengo es que cuando se abre el nuevo formulario, puedo ver que la nueva celda activa está seleccionada en la hoja, pero el formulario aún solicita la información de la ActiveCell anterior.
Private Sub PCONTButton_Click()
PFInputForm.Hide
ActiveCell = "P"
ActiveCell.Offset(0, 1) = PFInputForm.INPUTCOMMENT
ActiveCell.Offset(1, 0).Select
End Sub
He probado sin éxito algunas variantes, incluyendo ocultar el formulario de usuario (tanto en el código FORM como en el código Sheet), pero después de unas horas de rastrear este (y otros) foros, siento que ahora estoy apuñalando el ¡oscuro!
Respuesta1
Encontré una solución gracias a otro usuario. Agregué una declaración IF THEN adicional a la función que llama al formulario, que busca una bandera (ya sea 1 o 0) en la celda AI14 (que comienza como 1):
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Range("AI14") Then
If Selection.Count = 2 Then
If Not Intersect(Target, Me.Range("W16:W46,W74:W143")) Is Nothing Then
Range("AI14") = 0
PFInputForm.Show
End If
End If
End If
End Sub
Luego agregué un cambio de indicador a 1 para los botones PASA y FALLA:
Private Sub PASSButton_Click()
Range("AI14") = 1
ActiveCell = "P"
ActiveCell.Offset(0, 1) = PFInputForm.INPUTCOMMENT
PFInputForm.Hide
End Sub
Omito el cambio de bandera en los botones "Continuar" para mantener la bandera en cero, de modo que el código superior no continúe. Luego agregué contenido adicional al código del botón Continuar para que extraiga la información relacionada del nuevo ActiveCell:
Private Sub PCONTButton_Click()
ActiveCell = "P"
ActiveCell.Offset(0, 1) = PFInputForm.INPUTCOMMENT
ActiveCell.Offset(1, 0).Select
PFInputForm.INPUTCOMMENT.Text = CStr(ActiveCell.Offset(0, 1).Value)
PFInputForm.ITEMNO = "Item " & ActiveCell.Offset(0, -2)
PFInputForm.ITEMDESCR = ActiveCell.Offset(0, -1)
End Sub
Este código utiliza la misma fuente de información que el código para inicializar el formulario (ver publicación original)
Solo necesito ordenar el final de la codificación "continuar" para que la bandera vuelva a 1 una vez que se haya llegado al último elemento de la lista.
¡Espero que esto ayude!