Esse formulário está muito bem feito. Conserte apenas umas tabulações extras que estão percorrendo células das colunas AE e AF.
---
Cole o código abaixo num módulo, crie um botão chamado Gerar Pedido e associe a macro abaixo a esse botão:
'Altere o valor das constantes abaixo, porque não sei os valores
Private Const c_sSenhaPedido As String = "senha1"
Private Const c_sSenhaRelação As String = "senha2"
Private Const c_sCaminho As String = "c:temp"
Dim wsPedido As Worksheet
Dim wsRelação As Worksheet
Dim lRegistro As Long
Sub GerarPedido()
Inicializar
DesprotegerPlanilhas
LerÚltimoRegistro
SalvarCópiaDePedido
LimparFormulário
AtualizarRelação
ProtegerPlanilhas
Finalizar
End Sub
Private Sub Inicializar()
Application.ScreenUpdating = False
Application.EnableEvents = False
Set wsPedido = ThisWorkbook.Sheets("Pedido de Registro")
Set wsRelação = ThisWorkbook.Sheets("Relação de Funcionários")
lRegistro = 0
End Sub
Private Sub DesprotegerPlanilhas()
wsPedido.Unprotect c_sSenhaPedido
wsRelação.Unprotect c_sSenhaRelação
End Sub
Private Sub LerÚltimoRegistro()
'Verifica qual registro é o atual e cria um registro caso não exista:
On Error Resume Next
lRegistro = Evaluate(ThisWorkbook.Names("Registro").RefersTo)
On Error GoTo 0
If lRegistro = 0 Then
ThisWorkbook.Names.Add Name:="Registro", RefersTo:="=0"
End If
lRegistro = Evaluate(ThisWorkbook.Names("Registro").RefersTo) + 1
ThisWorkbook.Names.Add Name:="Registro", RefersTo:="=" & lRegistro
End Sub
Private Sub SalvarCópiaDePedido()
Dim sCaminho As String
sCaminho = c_sCaminho
If Right(sCaminho, 1) <> "" Then
sCaminho = sCaminho & ""
End If
wsPedido.Copy
With Workbooks(Workbooks.Count)
.SaveCopyAs sCaminho & _
Format(lRegistro, "000") & "-" & wsPedido.Range("F9") & ".xlsx"
.Close SaveChanges:=False
End With
End Sub
Private Sub LimparFormulário()
Dim rng As Range
Set rng = Union(wsPedido.Range("$F$57:$J$57,$P$57:$T$57,$L$59,$N$59,$AA$57,$AA$59,$AC$57,$AC$59,$D$64:$AC$66,$C$70:$C$83,$C$87:$C$89,$G$92:$AC$92") _
, wsPedido.Range("$G$33:$J$33,$D$35:$I$35,$G$37:$M$37,$M$33:$O$33,$N$35:$S$35,$R$33:$T$33,$Y$33:$AC$33,$S$37:$Z$37,$AB$37:$AC$37,$N$39:$Q$39,$F$39:$I$39,$F$41:$J$41,$N$41,$P$41,$V$41:$AC$41,$H$43,$J$43,$H$45:$L$45,$P$45:$T$45,$AA$43,$AC$43,$X$45:$AC$45,$K$47:$O$47") _
, wsPedido.Range("$F$23:$N$23,$P$23:$S$23,$W$23:$Z$23,$AB$23:$AC$23,$E$25:$L$25,$O$25:$T$25,$X$25:$AC$25,$E$27:$K$27,$N$27:$Q$27,$V$27:$Z$27,$AB$27:$AC$27,$D$29:$H$29,$J$29:$M$29,$Q$29:$T$29,$Y$29:$Z$29,$AB$29:$AC$29,$F$31,$H$31,$K$31:$O$31,$S$31:$X$31,$AA$31:$AC$31") _
, wsPedido.Range("$F$9:$AC$9,$H$11:$AC$11,$F$13:$M$13,$E$15:$L$15,$P$13:$V$13,$Q$15:$W$15,$X$13:$AC$13,$AA$15,$AC$15,$Y$17:$AC$17,$S$17:$T$17,$P$17:$Q$17,$M$17:$N$17,$J$17:$K$17,$L$19,$N$19,$R$19:$S$19,$I$49:$AC$49,$I$51:$AC$51,$I$53:$AC$53"))
rng.ClearContents
End Sub
Private Sub AtualizarRelação()
Dim lRow As Long
lRow = RowLast(wsRelação.Columns("A")) + 1
wsRelação.Cells(lRow, "A") = Format(lRegistro, "0000")
wsRelação.Cells(lRow, "B") = wsPedido.Range("H11")
wsRelação.Cells(lRow, "C") = wsPedido.Range("E15")
wsRelação.Cells(lRow, "D") = wsPedido.Range("Q15")
wsRelação.Cells(lRow, "E") = wsPedido.Range("F13")
End Sub
Private Sub ProtegerPlanilhas()
wsPedido.Protect c_sSenhaPedido
wsRelação.Protect c_sSenhaRelação
End Sub
Private Sub Finalizar()
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
Private Function RowLast(rng As Range) As Long
'Retorna o valor da última linha povoada do intervalo rng
With rng
On Error Resume Next
RowLast = .Find(What:="*" _
, After:=.Cells(1) _
, SearchDirection:=xlPrevious _
, SearchOrder:=xlByColumns _
, LookIn:=xlFormulas).Row
If RowLast = 0 Then RowLast = rng.Cells(1).Row
End With
End Function
Felipe Costa Gualberto
Microsoft Excel MVP
http://www.ambienteoffice.com.br
Postado : 27/06/2012 6:21 pm