Notifications
Clear all

GoTo de uma userform para módulo...

3 Posts
2 Usuários
0 Reactions
1,396 Visualizações
(@finaljustice)
Posts: 91
Trusted Member
Topic starter
 

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

 
Postado : 18/07/2013 3:06 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

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

 
Postado : 18/07/2013 4:15 pm
(@finaljustice)
Posts: 91
Trusted Member
Topic starter
 

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

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

 
Postado : 22/07/2013 12:13 pm