Boa tarde,
Estou com uma dúvida, como faria para sair de duas rotinas.
Basicamente tenho uma rotina que programei para Finalizar um pedido e assim enviar o pedido para o faturamento, mas ANTES do envio abro uma userform com uma listbox e mostro todos os itens que foram adicionados no pedido. O que ocorre é que se o usuário erra e quer cancelar e não enviar o pedido mesmo fechando a userform o processo da continuidade. Para concertar isso, então eu tentei fazer com que ao usuário apertar o botao X para fechar o userform o pedido seja "abortado" antes de enviar, porém estou tendo dificuldade.
Essa é a rotina "primária" que irá chamar a userform para mostrar os itens antes de enviar.
Sub finalped() 'processo de inserção das equações, calculos, envio do pedido para faturamento limpeza de planilha de pedido Dim rng As Range Dim cell As Range Sheets("Pedido").Select 'ws = ActiveSheet.Name blimit = Range("B1048576").End(xlUp).Row Sheets("Pedido").Range("B41").Select Do While ActiveCell <> Empty n = ActiveCell.Row ActiveCell.Offset(0, 6).Formula = "=$F$" & n & "*" & "$G$" & n 'Desconto em R$ ActiveCell.Offset(0, 7).Formula = "=$F$" & n & "-" & "$H$" & n 'Vlr unitário c/ desconto ActiveCell.Offset(0, 8).Formula = "=$I$" & n & "*" & "$C$" & n 'sub total unit x qnt ActiveCell.Offset(0, 9).FormulaLocal = "=$J$" & n & "*" & ncmperprd 'calc do tributo ActiveCell.Offset(1, 0).Select Loop 'somatorias Sheets("Pedido").Select Range("B41").Select Range(Cells(1048576, ActiveCell.Column).End(xlUp), Cells(ActiveCell.Row, 256).End(xlToLeft)).Select Call formatfont Sheets("Pedido").Select Sheets("Pedido").Range("C1048576").End(xlUp).Offset(1, 0).Select ActiveCell.Formula = "=Sum($C$41:$C$" & blimit & ")" ActiveCell.Offset(0, -1) = "Totais:" Sheets("Pedido").Range("J1048576").End(xlUp).Offset(1, 0).Select ActiveCell.Formula = "=Sum($J$41:$J$" & blimit & ")" Sheets("Pedido").Range("K1048576").End(xlUp).Offset(1, 0).Select ActiveCell.Formula = "=Sum($K$41:$K$" & blimit & ")" 'formatação das células Sheets("Pedido").Select Range("B41").Select Range(Cells(1048576, ActiveCell.Column).End(xlUp), Cells(ActiveCell.Row, 256).End(xlToLeft)).Select Call formatfont Sheets("Pedido").Range("B41").Select Range(ActiveCell, Cells(1048576, ActiveCell.Column).End(xlUp)).Select Call formatreg Sheets("Pedido").Range("C41").Select Range(ActiveCell, Cells(1048576, ActiveCell.Column).End(xlUp)).Select Call formatreg Sheets("Pedido").Range("D41").Select Range(ActiveCell, Cells(1048576, ActiveCell.Column).End(xlUp)).Select Call formatreg Sheets("Pedido").Range("E41").Select Range(ActiveCell, Cells(1048576, ActiveCell.Column).End(xlUp)).Select Call formatreg Sheets("Pedido").Range("F41").Select Range(ActiveCell, Cells(1048576, ActiveCell.Column).End(xlUp)).Select Call formatmoney Sheets("Pedido").Range("G41").Select Range(ActiveCell, Cells(1048576, ActiveCell.Column).End(xlUp)).Select Call formatpercent Sheets("Pedido").Range("H41").Select Range(ActiveCell, Cells(1048576, ActiveCell.Column).End(xlUp)).Select Call formatmoney Sheets("Pedido").Range("I41").Select Range(ActiveCell, Cells(1048576, ActiveCell.Column).End(xlUp)).Select Call formatmoney Sheets("Pedido").Range("J41").Select Range(ActiveCell, Cells(1048576, ActiveCell.Column).End(xlUp)).Select Call formatmoney Sheets("Pedido").Range("K41").Select Range(ActiveCell, Cells(1048576, ActiveCell.Column).End(xlUp)).Select Call formatmoney UserForm3.Hide 'verificar Pedido antes de enviar para faturamento UserForm4.ListBox1.Clear UserForm4.Caption = "Revisão de Solicitações" UserForm4.TextBox1 = UserForm1.TextBox1 UserForm4.TextBox2 = UserForm1.TextBox2 UserForm4.CommandButton1.Caption = "Enviar Pedido" UserForm4.ListBox1.ColumnCount = 8 Sheets("Pedido").Select Sheets("Pedido").Range("B40").Select Set rng = Range(ActiveCell, Cells(1048576, ActiveCell.Column).End(xlUp)) For Each cell In rng.Cells With UserForm4.ListBox1 .AddItem cell.Value .List(.ListCount - 1, 1) = cell.Offset(0, 1).Value .List(.ListCount - 1, 2) = cell.Offset(0, 2).Value .List(.ListCount - 1, 3) = cell.Offset(0, 4).Value .List(.ListCount - 1, 4) = cell.Offset(0, 5).Value .List(.ListCount - 1, 5) = cell.Offset(0, 6).Value .List(.ListCount - 1, 6) = cell.Offset(0, 7).Value .List(.ListCount - 1, 7) = cell.Offset(0, 8).Value End With Next cell 'Aqui estou chamando a userform que irá mostrar ao usuário as informações e assim que fechar essa userform o processo continua para enviar através de email. UserForm4.show 'duplicar uma planilha e depois enviar ela por email. Call Mail_ActiveSheet Call Clean 'Aqui é o ponto que deve VOLTAR caso o usuário clique no X da userform4 Cancelped: End Sub
Este é o código que inseri na userform para especificar o que acontece quando o usuário clica no X da userform.
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = 0 Then If MsgBox("Você deseja encerrar esse pedido e recomeçar?", vbYesNo, "Encerrar pedido") = vbYes Then UserForm1.MultiPage1.Value = 2 GoTo Cancelped End If End If End Sub
Aparece um erro de "Rótulo não definido", alguém tem alguma sugestão?
Obrigado pela atenção,
FJ
final, se entendi corretamente, a rotina abaixo está no Userfom3 :
Sub finalped()
Que apos executar algumas ações Oculta o UserForm3.Hide e chama o UserForm4.
No UserForm4 você tem a rotina para se fachar somente pelo "X" e na rotina você faz uma chamada utilizando a instrução "GoTo Cancelped", só que o Rotulo "Cancelped" indicado pelo GoTo encontra-se no UserForm3 então ele não é localizado, pois deveria estar no mesmo Formulario.
Para contornar esta questão, você pode Criar uma Variável Publica e dai fazer a verificação, exemplificando :
Em um Módulo, logo no inicio, coloque :
Public sCancelar As Boolean
E no UserForm4, troque a rotina pela a abaixo :
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = 0 Then If MsgBox("Você deseja encerrar esse pedido e recomeçar?", vbYesNo, "Encerrar pedido") = vbYes Then UserForm1.MultiPage1.Value = 2 'GoTo Cancelped sCancelar = True End If End If End Sub
Uma obs, na rotina acima você faz referencia ao UserForm1, como não vi nenhuma instrução anteriormente chamando o mesmo, faça os ajustes nos nomes dos formularios, este é só um exemplo.
Apos isto, no UserForm3, apos a linha :
'Aqui estou chamando a userform que irá mostrar ao usuário as informações e assim que fechar essa userform o processo continua para enviar através de email.
UserForm4.Show
Coloque abaixo da chamada do Userform4 :
If sCancelar = True Then GoTo Cancelped
Lembrando que uma Variável do Tipo "Boolean" é iniciada sempre como "False".
Faça os testes e veja se é isto.
[]s
Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel
final, se entendi corretamente, a rotina abaixo está no Userfom3 :
Sub finalped()
Que apos executar algumas ações Oculta o UserForm3.Hide e chama o UserForm4.No UserForm4 você tem a rotina para se fachar somente pelo "X" e na rotina você faz uma chamada utilizando a instrução "GoTo Cancelped", só que o Rotulo "Cancelped" indicado pelo GoTo encontra-se no UserForm3 então ele não é localizado, pois deveria estar no mesmo Formulario.
Para contornar esta questão, você pode Criar uma Variável Publica e dai fazer a verificação, exemplificando :Em um Módulo, logo no inicio, coloque :
Public sCancelar As BooleanE no UserForm4, troque a rotina pela a abaixo :
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = 0 Then If MsgBox("Você deseja encerrar esse pedido e recomeçar?", vbYesNo, "Encerrar pedido") = vbYes Then UserForm1.MultiPage1.Value = 2 'GoTo Cancelped sCancelar = True End If End If End SubUma obs, na rotina acima você faz referencia ao UserForm1, como não vi nenhuma instrução anteriormente chamando o mesmo, faça os ajustes nos nomes dos formularios, este é só um exemplo.
Apos isto, no UserForm3, apos a linha :
'Aqui estou chamando a userform que irá mostrar ao usuário as informações e assim que fechar essa userform o processo continua para enviar através de email.
UserForm4.Show
Coloque abaixo da chamada do Userform4 :If sCancelar = True Then GoTo Cancelped
Lembrando que uma Variável do Tipo "Boolean" é iniciada sempre como "False".
Faça os testes e veja se é isto.
[]s
Boa tarde Mauro muito obrigado por me responder prontamente! Demorei para testar pois estava bem doente em casa mas hoje estou melhor e pude testar sua sugestão.
Para entender, essa é uma pequena parte de um projeto razoavelmente grande que estou fazendo, a grande maioria das rotinas coloco em módulos e assim vou chamando eles quando necessário. Acabei de testar sua sugestão, ela funciona porém percebi que ao cancelar o pedido e tentar refazer o pedido não era enviado, então coloquei no início da rotina que finaliza o pedido:
sCancelar = False
Com o intuito de "restaurar" ao formato "original" da variável para que a rotina dee continuidade, e funcionou! Não sei se há outra maneira de fazer isso mas agora está funcionando corretamente!!!
Muito obrigado pela atenção e ajuda Mauro!
Att,
FJ