Notifications
Clear all

Macro para gerar relatório com critérios

2 Posts
2 Usuários
0 Reactions
1,883 Visualizações
(@valle)
Posts: 1
New Member
Topic starter
 

Pessoal Boa Noite.

Venho encontrando dificuldades em gerar um relatório há tempos. Preciso muito de uma ajuda.
Meu nível de VBA é muito básico. Geralmente copio linguagens que encontro em exemplos e faço as adaptações para os meus modelos.

A dúvida é a seguinte:

Eu preciso gerar relatórios que puxarão os dados de uma tabela dinâmica.
Na tabela dinâmica eu tenho as seguintes colunas: DATA; Nº PEDIDO; CLIENTE; TRANSPORTE; PRODUTO; QTDE

Para gerar o relatório eu criei um Fórmulário UserForm que possui os campos Data Início; Data Fim; um ComboBox para selecionar o cliente e o botão EXECUTAR que executa a macro abaixo:

Private Sub btExecutar_Click()

Sheets("RELATÓRIO_VENDAS").Select
Worksheets("RELATÓRIO_VENDAS").Range("A3:F1000000").ClearContents
lin = 2
linha = 3

If cdDataINI = "" Or cdDataFIM = "" Then Exit Sub

Do Until Worksheets("DINÂMICA_VENDAS").Cells(lin, 1) = ""
If Worksheets("DINÂMICA_VENDAS").Cells(lin, 1) >= CDate(cdDataINI) And _
Worksheets("DINÂMICA_VENDAS").Cells(lin, 1) <= CDate(cdDataFIM) Then
Worksheets("RELATÓRIO_VENDAS").Cells(linha, 1) = Worksheets("DINÂMICA_VENDAS").Cells(lin, 1)
Worksheets("RELATÓRIO_VENDAS").Cells(linha, 2) = Worksheets("DINÂMICA_VENDAS").Cells(lin, 2)
Worksheets("RELATÓRIO_VENDAS").Cells(linha, 3) = Worksheets("DINÂMICA_VENDAS").Cells(lin, 3)
Worksheets("RELATÓRIO_VENDAS").Cells(linha, 4) = Worksheets("DINÂMICA_VENDAS").Cells(lin, 4)
Worksheets("RELATÓRIO_VENDAS").Cells(linha, 5) = Worksheets("DINÂMICA_VENDAS").Cells(lin, 5)
Worksheets("RELATÓRIO_VENDAS").Cells(linha, 6) = Worksheets("DINÂMICA_VENDAS").Cells(lin, 6)
linha = linha + 1
End If
lin = lin + 1
Loop

MsgBox "Processo concluído - " & cdDataINI & " à " & cdDataFIM
End Sub

A parte de gerar o relatório dentro das datas definidas está rodando direitinho, sem problema algum.

A questão é que além das datas eu gostaria que o relatório filtrasse por clientes também.
Sendo assim, se eu inserir algum nome de cliente no ComboBox só serão geradas as linhas que constam aquele determinado cliente dentro do período de datas.
E caso eu deixe em branco o ComboBox dos clientes, ele gera o relatório normal com todos os clientes dentro do período de datas.

Alguém pode me ajudar com este trabalho por favor?

Vou anexar a Planilha caso eu não tenha sido muito claro.

Att,

Gustavo Valle

 
Postado : 11/01/2017 4:52 pm
DJunqueira
(@djunqueira)
Posts: 772
Prominent Member
 

Olá VALLE,

fiz algumas modificações na sua planilha, apaguei mais de uma dezena de módulos vazios e apliquei o conceito de tabelas nomeadas reconhecidas pelo Excel na sua pasta de trabalho.
Não é costume criar tantos módulos com apenas uma sub-rotina, o 'ideal' seria concentrar seu código p/ cada aba num único módulo de modo a facilitar a sua vida e a de quem for rever a programação.

Com as tabelas nomeadas vc poderá usar segmentação de dados p/ filtrar, suas fórmulas ficarão mais compreensíveis uma vez q vc saberá exatamente a q colunas elas se referem, as fórmulas acompanharão o acréscimo de dados assim como a formatação normal e condicional, seu código ficará mais simples e preciso.

Com tabelas nomeadas vc pode ter várias 'listas' (tabelas nomeadas) com filtros numa mesma aba, algo q vc não pode fazer com a aplicação de filtro em listas tradicionais.

P/ q vc entenda melhor o q estou dizendo veja a aba 'ESTOQUE ATUAL SEM ROSCA' onde utilizei a nomenclatura de tabelas nas fórmulas e há 3 tabelas com filtros.
Na tabela dinâmica inseri uma Linha do Tempo p/ filtrar por data assim como Segmentação de Dados.

Na aba 'RELATÓRIO_VENDAS' novamente inseri Segmentação de Dados p/ filtrar por cliente e tb montei uma macro no módulo 10 p/ apagar os dados da tabela.

Sheets("RELATÓRIO_VENDAS").ListObjects("TRelProdução").DataBodyRange.EntireRow.Delete

Essa macro de uma linha é uma amostra de como o conceito de tabelas nomeadas tb afeta a construção do código VBA.
Perceba q ela só apaga os dados da tabela e não o cabeçalho ou qq célula fora do intervalo da tabela e isso muitas vezes pode ter impacto na velocidade de execução do código.

No final das contas minha intenção foi mais no sentido de ampliar sua visão de possíveis soluções p/ seus problemas usando os vários recursos do Excel.

Se sua dúvida foi respondida marque o tópico como RESOLVIDO usando o botão com marca verde.

 
Postado : 12/01/2017 12:50 am