Estou criando um formulário de entrada para uso com um 'tablet' no Excel para nosso pessoal preencher quando estiver em campo. Como entradas como menus suspensos e similares são bastante complicadas, desejo usar um formulário de entrada básico com grandes botões de comando Aprovar/Reprovar. Em vez de usar CommandBoxes individuais para chamar o formulário, optei por usar o seguinte código (dentro do objeto/planilha) para chamar o formulário quando determinadas células são selecionadas:
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
O formulário de entrada chama informações relativas ao ActiveCell, para preencher o Item#, Descrição e Comentários usando o seguinte código no FORM.
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
A intenção é que o usuário insira um comentário (se aplicável), depois clique em um dos quatro botões “Aprovado”, “Reprovado”, “Aprovado e Continuado” e “Reprovado e Continuado”.
Se eles clicarem em "Aprovado" ou "Reprovado", tenho o código no Formulário, retorne o texto da caixa Comentário para a célula adjacente (usando Offset), insira "P" ou "F" respectivamente na célula ativa e feche o formulário do usuário sem problemas (usando o seguinte código no FORM).
Private Sub PASSButton_Click()
PFInputForm.Hide
ActiveCell = "P"
ActiveCell.Offset(0, 1) = PFInputForm.INPUTCOMMENT
End Sub
O problema que tenho é quando quero que o usuário clique em "Aprovar e continuar" ou "Falha e continuar", onde o acima deve acontecer, mas a célula ativa desce uma célula e abre um novo formulário específico para essa linha.
O código que executo atualmente no FORM para "Passar e Continuar" está abaixo. O problema que tenho é que quando o novo formulário é aberto, posso ver que a nova célula ativa está selecionada na planilha, mas o formulário ainda está chamando as informações da ActiveCell anterior.
Private Sub PCONTButton_Click()
PFInputForm.Hide
ActiveCell = "P"
ActiveCell.Offset(0, 1) = PFInputForm.INPUTCOMMENT
ActiveCell.Offset(1, 0).Select
End Sub
Eu tentei sem sucesso algumas variantes, incluindo ocultar o formulário do usuário (tanto no código FORM quanto no código da planilha), mas depois de algumas horas vasculhando este (e outros) fóruns, sinto que agora estou apenas esfaqueando o escuro!
Responder1
Encontrei uma solução graças a outro usuário. Adicionei uma instrução IF THEN adicional à função que chama o formulário, que está procurando um sinalizador (1 ou 0) na célula AI14 (que começa 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
Em seguida, adicionei uma mudança de sinalizador de volta para 1 para os botões PASS e FAIL:
Private Sub PASSButton_Click()
Range("AI14") = 1
ActiveCell = "P"
ActiveCell.Offset(0, 1) = PFInputForm.INPUTCOMMENT
PFInputForm.Hide
End Sub
Omito a mudança do sinalizador nos botões "Continuar", para manter o sinalizador em zero, para que o código superior não continue. Em seguida, adicionei algum conteúdo extra ao código do botão Continuar para que ele extraia as informações relacionadas do novo 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 usa a mesma fonte de informações que o código para inicializar o formulário (veja a postagem original)
Eu só preciso arrumar o final da codificação "continuar" para que o sinalizador retorne para 1 assim que o último item da lista for alcançado.
Espero que isto ajude!