Notifications
Clear all

Preencher planilha e inserir seus dados em outra

14 Posts
3 Usuários
0 Reactions
2,479 Visualizações
(@charlie-81)
Posts: 290
Reputable Member
Topic starter
 

Olá galerinha, tudo de buenas?

Bom, o título do tópico pode parecer simples, porém, imagino que este seja um grande desafio para vocês, semideuses do excel. Até por isso abri no tópico em "Macros".

A questão é a seguinte:

Tenho em minha pasta de trabalho uma planilha com o nome "Pedido de Registro" que é onde solicito o registro do funcionário junto à contabilidade e uma planilha de "Relação de Funcionários".

1º Gostaria que, ao preeencher toda essa ficha de pedido de registro,tivesse um botão na planilha com o nome de "Gerar Pedido" onde, quando eu clicasse sobre o mesmo fosse gerado um nº de registro que pode começar do 0 (zero) e ir acrescentando uma unidade toda vez que gerado um novo pedido de registro e que esse pedido fosse salvo em algum local do computador que pudesse ser definido da mesma forma de quando salvo um documento qualquer. Na hora de salvar, o arquivo deveria receber como nome, o nº do registro e o nome do funcionário. Ex.: 001-Fulano de Tal.xlsm

2º Também que, após a geração desse arquivo, todos os dados informados na planilha de "Pedido de Registro" fossem apagados, para que pudesse fazer um novo pedido.

3º Além disso, quando fosse gerado esse novo documento, que os dados informados nele e que preciso que estejam na "Relação de Funcionários" fossem tranferidos para esta planilha, dados estes que são:

* O nº de registro gerado ==> Coluna A da Relção de Funcionários
* O nome do funcionário ==> Coluna B da Relção de Funcionários
* O cargo ==> Coluna C da Relção de Funcionários
* A Admissão; ==> Coluna E da Relção de Funcionários
* E o nº de Dependentes para IR e Salario Família (de acordo com o preenchimento dos dados dos filhos) ==> Coluna K

Bom, em tese é isso. Espero e confio muito que possam me ajudar. Segue anexo com ilustração do que desejo. Caso alguém se habilite e queira tirar alguma dúvida que por mensagem seja de difícil compreensão, podem deixar o telefone através de uma MP que eu ligo imediatamente.

 
Postado : 27/06/2012 11:39 am
(@benzadeus)
Posts: 78
Trusted Member
 

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
 
Postado : 27/06/2012 6:21 pm
(@charlie-81)
Posts: 290
Reputable Member
Topic starter
 

benzadeus... muitissímo obrigado pelo código. Só uma coisinha que não funcionou e que talvez seja porque preciso configurar algo, que foi a questão de transferir os dados para a planilha relação de funcionários. Os dados não estão indo para lá. No mais, inseri as senhas para desproteger as planilhas, mudei o caminho para salvar e agora falta só que os dados sejam tranferidos para outra planilha. De qualquer forma, foi incrível sua resposta.

 
Postado : 28/06/2012 6:52 am
(@benzadeus)
Posts: 78
Trusted Member
 

Observe a rotina AtualizarRelação. Ela transfere os dados do formulário na Planilha.
Se bem que me lembro, acho que os dados estão entrando nessa Planilha aproximadamente na linha 150 ou 500 (não me recordo) porque acho que há uma célula na coluna A preenchida com um espaço. Então, na hora de obter a última linha, ele considera essa célula como tal.

 
Postado : 28/06/2012 10:54 am
(@charlie-81)
Posts: 290
Reputable Member
Topic starter
 

Observe a rotina AtualizarRelação. Ela transfere os dados do formulário na Planilha.
Se bem que me lembro, acho que os dados estão entrando nessa Planilha aproximadamente na linha 150 ou 500 (não me recordo) porque acho que há uma célula na coluna A preenchida com um espaço. Então, na hora de obter a última linha, ele considera essa célula como tal.

O que vc poderia sugerir para resolver isso?

 
Postado : 28/06/2012 2:16 pm
(@benzadeus)
Posts: 78
Trusted Member
 

Em primeiro lugar, apague todas as linhas abaixo do cabeçalho da planilha da planilha de relação.

Lembrei de um outro detalhe: desmescle o cabeçalho. Se você possui um cabeçalho que possui uma linha mesclada, a função que criei de obter a última linha irá falhar.

 
Postado : 28/06/2012 4:05 pm
(@charlie-81)
Posts: 290
Reputable Member
Topic starter
 

Fala aí benzadeus, tudo na paz?
Cara, fiz todas as observações que me solicitaste. Nenhuma das células da planilha se encontram mescladas. Quando salvo o arquivo, apenas o nº do registro vai para a outra planilha (Relação de Funcionários), as demais ficam em branco. Creio que seja um pequeno detalhe. Poderia por favor, se não for muito inconveniente, olhar meu exemplo e ver o que está ocorrendo. Seria muito grato se fizeste isso.

 
Postado : 29/06/2012 10:54 am
(@benzadeus)
Posts: 78
Trusted Member
 

Claro que não está atualizando! Troque o código:

Sub GerarPedido()
    Inicializar
    DesprotegerPlanilhas
    LerÚltimoRegistro
    SalvarCópiaDePedido
    LimparFormulário
    AtualizarRelação
    ProtegerPlanilhas
    Finalizar
End Sub

por

Sub GerarPedido()
    Inicializar
    DesprotegerPlanilhas
    LerÚltimoRegistro
    SalvarCópiaDePedido
    AtualizarRelação
    LimparFormulário
    ProtegerPlanilhas
    Finalizar
End Sub

A rotina estava limpando o formulário antes de registrar as informações na relação de funcionários. Bastou trocar a ordem de execução das rotinas. Desculpe-me.

 
Postado : 29/06/2012 12:55 pm
(@charlie-81)
Posts: 290
Reputable Member
Topic starter
 

Muito obrigado pela força cara. Vlws mesmo.

 
Postado : 30/06/2012 9:10 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Charlie-81,

Para organização do fórum, não responda sempre com citação (só, se necessário). Além de "POLUIR" o fórum, torna sua mensagem cansativa.

 
Postado : 30/06/2012 4:29 pm
(@charlie-81)
Posts: 290
Reputable Member
Topic starter
 

bezadeus, bom dia!

Cara, seu código ficou muito show. Parabéns.
Deixe eu te perguntar uma coisa? Queria salvar os arquivos em uma pasta específica. Logo no início eu alterei o caminho, mas, por exemplo, se for usar em outro computador, e este não possuir a pasta, dá erro no código.

Também percebi que tem uma parte do código que eu imaginava que fosse para criar esta pasta padrão:

Private Sub SalvarCópiaDePedido()
Dim sCaminho As String
sCaminho = c_sCaminho
If Right(sCaminho, 1) <> "" Then
sCaminho = sCaminho & "Registros"
End If

Na linha: sCaminho = sCaminho & "Registros" pensei que se unia com o caminho informado no início e criava a pasta, no entanto, isso não ocorre. Só salva o arquivo no local que informei acima.

 
Postado : 02/07/2012 5:02 am
(@benzadeus)
Posts: 78
Trusted Member
 

Você não pode mudar essa parte do código! A região no código onde você tem que mudar o caminho em que os arquivos são salvos é nas primeiras linhas, onde há:

Private Const c_sCaminho As String = "c:temp"

pensei que se unia com o caminho informado no início e criava a pasta

Se a pasta não existir, um erro é gerado. No entanto, se quiser sempre criar uma pasta, use o código abaixo:

Private Sub SalvarCópiaDePedido()
    Dim sCaminho As String
    sCaminho = c_sCaminho
    If Right(sCaminho, 1) <> "" Then
        sCaminho = sCaminho & ""
    End If
    On Error Resume Next
    MkDir sCaminho
    On Error GoTo 0
    
    wsPedido.Copy
    With Workbooks(Workbooks.Count)
        .SaveCopyAs sCaminho & _
          Format(lRegistro, "000") & "-" & wsPedido.Range("F9") & ".xlsx"
        .Close SaveChanges:=False
    End With
End Sub

O comando MkDir cria uma pasta. No entanto, esse comando cria apenas um nível de pasta. Por exemplo, para criar a pasta do caminho c:felipepastaeu, é necessário que a pasta c:felipepasta exista.

 
Postado : 02/07/2012 3:15 pm
(@charlie-81)
Posts: 290
Reputable Member
Topic starter
 

Um nível só é suficiente, tipo: c:Registros. Vou usar sua indicação.

daí no início eu devo informar:
Private Const c_sCaminho As String = "c:Registros", certo?

 
Postado : 02/07/2012 3:24 pm
(@benzadeus)
Posts: 78
Trusted Member
 

Sim.

 
Postado : 02/07/2012 4:48 pm