Usuário com melhor resposta
Usando VBA, preencher o formulario usando uma planilha de dados somente com as células "visíveis".

Pergunta
-
Tenho uma planilha de dados, folha de pagamento, e a uso mensalmente para pagamento aos funcionários. Esta planilha alimenta um formulário para 10 funcionários por folha, sendo assim para cada funcionário preciso dos seguintes dados:
1.Filial
2.Código
3.Nome do Funcionário
4.Líquido contracheque
5.Adiantamento
6.Vale
7.Convênio
8.FunçãoPor que uso o filtro? porque eu posso imprimir por filial, por função, somente os que trabalharam no mês, etc.
Me ajudem, por favor!
A primeira planilha chama-se "dados" e a outra "fopag"
INICIO
COD
NOME
FUNCEMP
FL
CCHEQUE
ADIANT
VALE
CONV
ARECB
26/03/2013
350
ADRIANA DA SILVA RAMOS
OP CAIXA
01
916,00
400,00
155,97
273,52
86,51
07/01/2013
050
ADRIANO RIBEIRO DA SILVA
BALCONISTA
01
682,00
300,00
-
225,49
156,51
07/04/2013
613
AGNALDO REGINALDO DA SILVA
BALCONISTA
02
-
-
-
-
-
A
B
C
D
E
F
G
H
I
J
K
L
M
N
1
FOPAG
FILIAL 09
março/2014
-
-
-
-
FOPAG
FILIAL 09
março/2014
-
2
766 - GEANDHER COSTA
-
-
-
-
566 - INGRID DOS SANTOS QUINTANILHA
-
3
LÍQUIDO CONTRACHEQUE .......
R$ 682,72
-
-
-
-
LÍQUIDO CONTRACHEQUE .......
R$ 682,72
-
4
( - ) ADIANTAMENTO(S) ......
R$ 300,00
-
-
-
-
( - ) ADIANTAMENTO(S) ......
R$ 300,00
-
5
( - ) VALE(S) ...............
-
R$ -
-
-
-
-
( - ) VALE(S) ...............
-
R$ 27,20
-
6
( - ) CONVÊNIO ..............
-
R$ -
-
-
-
-
( - ) CONVÊNIO ..............
-
R$ -
-
7
( = ) A RECEBER ...........................
R$ 382,72
-
-
-
-
( = ) A RECEBER ...........................
R$ 355,52
-
8
trezentos e oitenta e dois reais e setenta e dois centavos
-
-
-
-
trezentos e cinquenta e cinco reais e cinquenta e dois centavos
-
9
-
-
-
-
-
-
-
-
-
-
-
10
SUPERVISOR
GERENTE
ENTREGADOR
-
-
-
-
SUPERVISOR
GERENTE
PERFUMISTA
-
11
-
-
-
-
-
-
-
-
-
-
-
-
-
Respostas
-
Sub pMain() Dim lngFill As Long Dim lngRow As Long Dim rng As Excel.Range Dim strAddress As String Dim wksDados As Excel.Worksheet Dim wksVale As Excel.Worksheet Set wksDados = ThisWorkbook.Worksheets("DADOS") Set wksVale = ThisWorkbook.Worksheets("VALE") For lngRow = 2 To wksDados.Cells(wksDados.Rows.Count, "C").End(xlUp).Row If wksDados.Rows(lngRow).Hidden = False Then Select Case lngFill Mod 10 Case 0: strAddress = "A1" Case 1: strAddress = "A12" Case 2: strAddress = "A23" Case 3: strAddress = "A34" Case 4: strAddress = "A45" Case 5: strAddress = "I1" Case 6: strAddress = "I12" Case 7: strAddress = "I23" Case 8: strAddress = "I34" Case 9: strAddress = "I45" End Select Set rng = wksVale.Range(strAddress) rng.Range("E2").Value2 = wksDados.Cells(lngRow, "H").Value2 rng.Range("B9").Value2 = wksDados.Cells(lngRow, "B").Value2 _ & wksDados.Cells(lngRow, "C").Value2 If lngFill Mod 10 = 9 Then wksVale.PrintOut lngFill = lngFill + 1 End If Next lngRow If lngFill Mod 10 <> 0 Then wksVale.PrintOut End Sub
Felipe Costa Gualberto - http://www.ambienteoffice.com.br
- Marcado como Resposta Felipe Costa GualbertoMVP, Moderator quinta-feira, 24 de abril de 2014 21:44
-
Option Explicit Sub pFopag() Dim lngFill As Long Dim lngGarb As Long Dim lngRow As Long Dim col As Long Dim lin As Long Dim rng As Excel.Range Dim strAddress As String Dim wksDados As Excel.Worksheet Dim wksFopag As Excel.Worksheet Set wksDados = ThisWorkbook.Worksheets("DADOS") Set wksFopag = ThisWorkbook.Worksheets("FOPAG") Application.ScreenUpdating = False Sheets("FOPAG").Visible = True ' Classificar coluna Filial em ordem ascendente With ActiveWorkbook.Worksheets("DADOS").ListObjects("TAB").Sort .SortFields.Clear .SortFields.Add Key:=Range("E2"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With ' Filtrar valores diferentes de zero na coluna 10 wksDados.ListObjects("TAB").Range.AutoFilter Field:=10, Criteria1:="<>0" _ , Operator:=xlAnd ' Preencher com zeros as células em branco - colunas 6 a 10 lngRow = pGetLastRow(wksDados.Columns("C")) col = 6 While col < 11 lin = 1 While lin < lngRow lin = lin + 1 If Cells(lin, col) = "" Then Cells(lin, col) = "0" End If Wend col = col + 1 Wend ' Preencher o formulário FOPAG (10 quadros) For lngRow = 2 To pGetLastRow(wksDados.Columns("C")) If wksDados.Rows(lngRow).Hidden = False Then Select Case lngFill Mod 10 Case 0: strAddress = "A1" Case 1: strAddress = "A14" Case 2: strAddress = "A27" Case 3: strAddress = "A40" Case 4: strAddress = "A53" Case 5: strAddress = "I1" Case 6: strAddress = "I14" Case 7: strAddress = "I27" Case 8: strAddress = "I40" Case 9: strAddress = "I53" End Select Set rng = wksFopag.Range(strAddress) rng.Range("C2").Value2 = wksDados.Cells(lngRow, "E").Value2 rng.Range("B3").Value2 = wksDados.Cells(lngRow, "B").Value2 _ & " - " & wksDados.Cells(lngRow, "C").Value2 rng.Range("E4").Value2 = wksDados.Cells(lngRow, "F").Value2 rng.Range("E5").Value2 = wksDados.Cells(lngRow, "G").Value2 rng.Range("E6").Value2 = wksDados.Cells(lngRow, "H").Value2 rng.Range("E7").Value2 = wksDados.Cells(lngRow, "I").Value2 rng.Range("E11").Value2 = wksDados.Cells(lngRow, "D").Value2 If lngFill Mod 10 = 9 Then wksFopag.PrintOut lngFill = lngFill + 1 End If Next lngRow ' Limpar dados do formulário FOPAG For lngGarb = (lngFill Mod 10) To 9 Select Case lngGarb Mod 10 Case 0: strAddress = "A1" Case 1: strAddress = "A14" Case 2: strAddress = "A27" Case 3: strAddress = "A40" Case 4: strAddress = "A53" Case 5: strAddress = "I1" Case 6: strAddress = "I14" Case 7: strAddress = "I27" Case 8: strAddress = "I40" Case 9: strAddress = "I53" End Select Set rng = wksFopag.Range(strAddress) rng.Range("C2").Value2 = "" rng.Range("B3").Value2 = "" rng.Range("E4").Value2 = "" rng.Range("E5").Value2 = "" rng.Range("E6").Value2 = "" rng.Range("E7").Value2 = "" rng.Range("E11").Value2 = "" Next lngGarb If lngFill Mod 10 <> 0 Then wksFopag.PrintOut 'Ir para o início da planilha DADOS wksDados.Select Range("B1").Select ' Todas as linhas da lista filtrada no momento torna visível.Se o AutoFiltro estiver em uso, esse método mudará as setas para "Tudo" ActiveSheet.ShowAllData ' Classificar coluna NOME em ordem ascendente Range("C2").Select With ActiveWorkbook.Worksheets("DADOS").ListObjects("TAB").Sort .SortFields.Clear .SortFields.Add Key _ :=Range("C2"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ xlSortNormal .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Sheets("FOPAG").Visible = False Application.ScreenUpdating = True End Sub Private Function pGetLastRow(rng As Excel.Range) As Long 'Retorna a linha de uma coluna. Dim Temp As Long With rng On Error Resume Next Temp = .Find(What:="*" _ , After:=.Cells(1) _ , SearchDirection:=xlPrevious _ , SearchOrder:=xlByRows _ , LookIn:=xlFormulas).Row If Temp = 0 Then Temp = rng.Cells(1).Row End With pGetLastRow = Temp End Function
Felipe Costa Gualberto - http://www.ambienteoffice.com.br
- Marcado como Resposta JairNikit sexta-feira, 2 de maio de 2014 01:53
-
Benzadeus você não desiste mesmo! M E U S P A R A B É N S
Cara! Ficou show de bola. Redondinha
Muito obrigado. Obrigado mesmo.
Só fiz um PEQUENO AJUSTE na limpeza do formulário nas linhas 4, 5 6 e 7, incluindo "0" em vez de "vazio" para não desajustar os campos com valores, mais nada.
' Limpar dados do formulário FOPAG For lngGarb = (lngFill Mod 10) To 9 Select Case lngGarb Mod 10 Case 0: strAddress = "A1" Case 1: strAddress = "A14" Case 2: strAddress = "A27" Case 3: strAddress = "A40" Case 4: strAddress = "A53" Case 5: strAddress = "I1" Case 6: strAddress = "I14" Case 7: strAddress = "I27" Case 8: strAddress = "I40" Case 9: strAddress = "I53" End Select Set rng = wksFopag.Range(strAddress) rng.Range("C2").Value2 = "" rng.Range("B3").Value2 = "" rng.Range("E4").Value2 = "0" ' Valor zero rng.Range("E5").Value2 = "0" ' Valor zero rng.Range("E6").Value2 = "0" ' Valor zero rng.Range("E7").Value2 = "0" ' Valor zero rng.Range("E11").Value2 = "" Next lngGarb
Todas as Respostas
-
A primeira planilha mostra informações de vários funcionários. A segunda mostra apenas de um.
Você quer criar cópias da segunda planilha para cada registro filtrado da primeira planilha?
Felipe Costa Gualberto - http://www.ambienteoffice.com.br
-
-
Utilize o SendSpace para fazer upload de arquivos e, em seguida, poste o link aqui. Não respondo perguntas enviadas diretamente ao meu e-mail porque quando a solução fica num fórum, mais pessoas conseguem resolver o problema. Resolver um problema por e-mail encapsula o conhecimento somente a uma pessoa.
---
Sobre sua questão, se o número de registros filtrados for maior que o número de fichas na planilha de fopag?
Felipe Costa Gualberto - http://www.ambienteoffice.com.br
-
Em relação ao SendSpace vou aprender, ainda, e postar o link aqui.
Em relação às fichas na FOPAG, os registros filtrados são sempre maiores que 10. Porém a cada 10 registros preenchidos a própria macro os envia para a impressora e parte para preenchimento dos 10 seguintes. Fazendo isso até terminar o número de funcionários em questão.
Poderia também armazenar de alguma forma e os enviar para a impressora no final, talvez.
Muito obrigado.
-
https://onedrive.live.com/redir?resid=55F5D82D77E1D5C5!548&authkey=!ALbUU3HbZ5SOg_A&ithint=file%2c.xlsm
https://onedrive.live.com/redir?resid=55F5D82D77E1D5C5!549&authkey=!ADlDu3JCoGeQ0Gc&ithint=file%2c.pdf
A página em social. msdn.microsft.com diz:
O corpo do texto não pode conter imagens ou links até que possamos verificar sua conta.
-
Sub pMain() Dim lngFill As Long Dim lngRow As Long Dim rng As Excel.Range Dim strAddress As String Dim wksDados As Excel.Worksheet Dim wksVale As Excel.Worksheet Set wksDados = ThisWorkbook.Worksheets("DADOS") Set wksVale = ThisWorkbook.Worksheets("VALE") For lngRow = 2 To wksDados.Cells(wksDados.Rows.Count, "C").End(xlUp).Row If wksDados.Rows(lngRow).Hidden = False Then Select Case lngFill Mod 10 Case 0: strAddress = "A1" Case 1: strAddress = "A12" Case 2: strAddress = "A23" Case 3: strAddress = "A34" Case 4: strAddress = "A45" Case 5: strAddress = "I1" Case 6: strAddress = "I12" Case 7: strAddress = "I23" Case 8: strAddress = "I34" Case 9: strAddress = "I45" End Select Set rng = wksVale.Range(strAddress) rng.Range("E2").Value2 = wksDados.Cells(lngRow, "H").Value2 rng.Range("B9").Value2 = wksDados.Cells(lngRow, "B").Value2 _ & wksDados.Cells(lngRow, "C").Value2 If lngFill Mod 10 = 9 Then wksVale.PrintOut lngFill = lngFill + 1 End If Next lngRow If lngFill Mod 10 <> 0 Then wksVale.PrintOut End Sub
Felipe Costa Gualberto - http://www.ambienteoffice.com.br
- Marcado como Resposta Felipe Costa GualbertoMVP, Moderator quinta-feira, 24 de abril de 2014 21:44
-
-
-
A FOPAG é para todos os funcionários que trabalharam no mês em referência, seja o saldo de salário a receber positivo ou negativo. É uma forma de demonstrativo e autorização para receber direto no caixa.
Já o vale é tão somente para aquele em que o saldo de salário ficou negativo. Que assinará o vale para desconto na folha de pagamento do mês seguinte.
Desculpe pela omissão da informação.
-
Agora que vi que há uma aba oculta, desculpe.
Nesse caso, basta adaptar o código que já fiz. Altere os endereços do Select Case para os endereços corretos, e o Range("E2") e Range("B9") em relação ao objeto rng para ficar certo.
Felipe Costa Gualberto - http://www.ambienteoffice.com.br
-
-
-
Sim, tá funcionando. Muito obrigado.
Sua ajuda foi fundamental, essencial.
---------------------------------------------
É porque eu sou perfeccionista. Não queria copiar de uma planilha para outra para depois alimentar as fichas.
Objetivo era que a macro já executasse o filtro e alimentasse as fichas ao toque de um botão.
No caso a aba "DADOSX" deixaria de existir.
Mas não se preocupe.
-
Option Explicit Sub pFopag() Dim lngFill As Long Dim lngGarb As Long Dim lngRow As Long Dim col As Long Dim lin As Long Dim rng As Excel.Range Dim strAddress As String Dim wksDados As Excel.Worksheet Dim wksFopag As Excel.Worksheet Set wksDados = ThisWorkbook.Worksheets("DADOS") Set wksFopag = ThisWorkbook.Worksheets("FOPAG") Application.ScreenUpdating = False Sheets("FOPAG").Visible = True ' Classificar coluna Filial em ordem ascendente With ActiveWorkbook.Worksheets("DADOS").ListObjects("TAB").Sort .SortFields.Clear .SortFields.Add Key:=Range("E2"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With ' Filtrar valores diferentes de zero na coluna 10 wksDados.ListObjects("TAB").Range.AutoFilter Field:=10, Criteria1:="<>0" _ , Operator:=xlAnd ' Preencher com zeros as células em branco - colunas 6 a 10 lngRow = pGetLastRow(wksDados.Columns("C")) col = 6 While col < 11 lin = 1 While lin < lngRow lin = lin + 1 If Cells(lin, col) = "" Then Cells(lin, col) = "0" End If Wend col = col + 1 Wend ' Preencher o formulário FOPAG (10 quadros) For lngRow = 2 To pGetLastRow(wksDados.Columns("C")) If wksDados.Rows(lngRow).Hidden = False Then Select Case lngFill Mod 10 Case 0: strAddress = "A1" Case 1: strAddress = "A14" Case 2: strAddress = "A27" Case 3: strAddress = "A40" Case 4: strAddress = "A53" Case 5: strAddress = "I1" Case 6: strAddress = "I14" Case 7: strAddress = "I27" Case 8: strAddress = "I40" Case 9: strAddress = "I53" End Select Set rng = wksFopag.Range(strAddress) rng.Range("C2").Value2 = wksDados.Cells(lngRow, "E").Value2 rng.Range("B3").Value2 = wksDados.Cells(lngRow, "B").Value2 _ & " - " & wksDados.Cells(lngRow, "C").Value2 rng.Range("E4").Value2 = wksDados.Cells(lngRow, "F").Value2 rng.Range("E5").Value2 = wksDados.Cells(lngRow, "G").Value2 rng.Range("E6").Value2 = wksDados.Cells(lngRow, "H").Value2 rng.Range("E7").Value2 = wksDados.Cells(lngRow, "I").Value2 rng.Range("E11").Value2 = wksDados.Cells(lngRow, "D").Value2 If lngFill Mod 10 = 9 Then wksFopag.PrintOut lngFill = lngFill + 1 End If Next lngRow ' Limpar dados do formulário FOPAG For lngGarb = (lngFill Mod 10) To 9 Select Case lngGarb Mod 10 Case 0: strAddress = "A1" Case 1: strAddress = "A14" Case 2: strAddress = "A27" Case 3: strAddress = "A40" Case 4: strAddress = "A53" Case 5: strAddress = "I1" Case 6: strAddress = "I14" Case 7: strAddress = "I27" Case 8: strAddress = "I40" Case 9: strAddress = "I53" End Select Set rng = wksFopag.Range(strAddress) rng.Range("C2").Value2 = "" rng.Range("B3").Value2 = "" rng.Range("E4").Value2 = "" rng.Range("E5").Value2 = "" rng.Range("E6").Value2 = "" rng.Range("E7").Value2 = "" rng.Range("E11").Value2 = "" Next lngGarb If lngFill Mod 10 <> 0 Then wksFopag.PrintOut 'Ir para o início da planilha DADOS wksDados.Select Range("B1").Select ' Todas as linhas da lista filtrada no momento torna visível.Se o AutoFiltro estiver em uso, esse método mudará as setas para "Tudo" ActiveSheet.ShowAllData ' Classificar coluna NOME em ordem ascendente Range("C2").Select With ActiveWorkbook.Worksheets("DADOS").ListObjects("TAB").Sort .SortFields.Clear .SortFields.Add Key _ :=Range("C2"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ xlSortNormal .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Sheets("FOPAG").Visible = False Application.ScreenUpdating = True End Sub Private Function pGetLastRow(rng As Excel.Range) As Long 'Retorna a linha de uma coluna. Dim Temp As Long With rng On Error Resume Next Temp = .Find(What:="*" _ , After:=.Cells(1) _ , SearchDirection:=xlPrevious _ , SearchOrder:=xlByRows _ , LookIn:=xlFormulas).Row If Temp = 0 Then Temp = rng.Cells(1).Row End With pGetLastRow = Temp End Function
Felipe Costa Gualberto - http://www.ambienteoffice.com.br
- Marcado como Resposta JairNikit sexta-feira, 2 de maio de 2014 01:53
-
Benzadeus você não desiste mesmo! M E U S P A R A B É N S
Cara! Ficou show de bola. Redondinha
Muito obrigado. Obrigado mesmo.
Só fiz um PEQUENO AJUSTE na limpeza do formulário nas linhas 4, 5 6 e 7, incluindo "0" em vez de "vazio" para não desajustar os campos com valores, mais nada.
' Limpar dados do formulário FOPAG For lngGarb = (lngFill Mod 10) To 9 Select Case lngGarb Mod 10 Case 0: strAddress = "A1" Case 1: strAddress = "A14" Case 2: strAddress = "A27" Case 3: strAddress = "A40" Case 4: strAddress = "A53" Case 5: strAddress = "I1" Case 6: strAddress = "I14" Case 7: strAddress = "I27" Case 8: strAddress = "I40" Case 9: strAddress = "I53" End Select Set rng = wksFopag.Range(strAddress) rng.Range("C2").Value2 = "" rng.Range("B3").Value2 = "" rng.Range("E4").Value2 = "0" ' Valor zero rng.Range("E5").Value2 = "0" ' Valor zero rng.Range("E6").Value2 = "0" ' Valor zero rng.Range("E7").Value2 = "0" ' Valor zero rng.Range("E11").Value2 = "" Next lngGarb
-