Este fórum está sendo desativado

Depois de 9 anos, este fórum será desativado. Mas calma.... estamos migrando para uma comunidade no DISCORD. Junte-se a nós.

ENTRAR PARA DISCORD

Tópicos relacionados a códigos VBA, gravação de macros, etc.
  • Avatar do usuário
Avatar do usuário
Por Jimmy
Avatar
#43196
Olá Sandro,

Creio que você não tem entrado no forum, e não leu minha última mensagem, mas gostaria de acrescentar algo às informações que prestei.

EU fiz testes de performance usando o Transpose, e invertendo a matriz manualmente, E NÃO HÁ PERDA DE PERFORMANCE NA SOLUÇÃO MANUAL, COM FOR/NEXT.

Além disso, ela apresenta uma vantagem que é permitir a inversão de matrizes com dimensão superior a 65531 ocorrências, enquanto que o Transpose apresenta esse limite.

Queria apenas deixar isso registrado para o caso de futuras pesquisas.

Jimmy San Juan
#43206
Bom dia, Jimmy.

Tenho entrado regularmente sim... desenvolvendo um vício em excel.

Tenho estudado muito seu código e feito testes comparando com outra alternativa com VBA e fórmulas.

Como disse seu código tem muitos comandos e propriedades novas para mim... mas estou me esforçando para aprender.

Nesse momento, ao transcrever seu código para minha planilha de trabalho estou enfrentando um erro de depuração na linha:
Código: Selecionar todos
Mes = Format(Application.WorksheetFunction.Sum(DateValue("01/" & Dados(NumLinha, colMes) & "/2019")), "mm")
Alterei apenas o nome de alguns intervalos e das tabelas.... mas conferi uma a uma. Vou postar a planilha para vc ver o que está errado.
E um outro problema é que não sei pq motivo a linha de cabeçalho das colunas "Valor Pago" e "Tarifas / Taxas" somente da tabela do mês de Março estão assumindo a formatação condicional do corpo da tabela.

Mas trocando em miúdos... você acha que a melhor opção no momento então é ficar da seguinte forma mesmo:
Código: Selecionar todos
For Mes = 1 To 12
        Qtd = UBound(Data(Mes))                       'Quantidade de linhas Total a inserir
        Debug.Print "Geran. mês " & Mes & ", " & Qtd & " linhas"
        If Qtd > 0 Then        'Insere linhas, se necessário
            LinIni = Tabela(Mes).TotalsRowRange.Row + 2   'Ve qual é a primeira linha abaixo da tabela
            PlanDestino.Rows(LinIni & ":" & LinIni + Qtd - 1).Insert Shift:=xlDown  'Insere as linhas
            Aux1 = Tabela(Mes).Range.Address
            Aux2 = InStrRev(Aux1, "$")
            Tabela(Mes).Resize Range(Mid(Aux1, 1, Aux2) & Qtd + Mid(Aux1, Aux2 + 1))
            Aux1 = Tabela(Mes).DataBodyRange.Rows.Count
            Aux2 = Tabela(Mes).TotalsRowRange.Row - 1
            If Aux1 > Qtd Then Rows(Aux2 - (Aux1 - Qtd) + 1 & ":" & Aux2).Delete: Debug.Print Mes & " " & Qtd & " " & Aux1
        End If
        Tabela(Mes).Range(2, 1).Resize(UBound(Data(Mes)), 1) = Application.Transpose(Registro(Mes))  'Joga Registros daquele mês na planilha
'       Tabela(Mes).Range(2, 5).Resize(UBound(Data(Mes)), 1) = Application.Transpose(Data(Mes))      'Idem para Datas
        ReDim Valores(1 To UBound(Data(Mes)), 1 To 1)   'Transpose manual pois o da Application altera a data
        For NumLinha = 1 To UBound(Data(Mes)): Valores(NumLinha, 1) = Data(Mes)(NumLinha): Next
        Tabela(Mes).Range(2, 5).Resize(UBound(Data(Mes)), 1) = Valores      'Idem para Datas
        
    Next
A tabela pode chegar a algo em torno de 10.000 linhas

Seria essa a melhor opção?
Editado pela última vez por SandroLima em 06 Mai 2019 às 14:42, em um total de 1 vez.
Avatar do usuário
Por Jimmy
Avatar
#43217
Sandro,
Nesse momento, ao transcrever seu código para minha planilha de trabalho estou enfrentando um erro de depuração na linha:
Esse erro está dando porque retiramos o ON ERROR RESUME NEXT, e o Excel está parando pra te avisar. Quando acontecer isso clique me DEPURAR, e entrará no editor da macro. A linha com erro erro ficará marcada em amarelo. Quatro linhas acima está o FOR NumLinha. Coloque o cursor sobre a palavra NumLinha e aparecerá seu conteúdo. Outra forma de ver o conteúdo é clicar na variável e depois no botão que tem um óculos sozinho (se não tiver aparecendo esse botão, tem que ativar: menu EXIBIR / BARRA DE FERRAMENTAS / DEPURAR).

No nosso caso verá que o valor é 215. Como esse loop percorre as linhas da tabela de dados, e como a tabela de dados inicia na linha 14 da planilha, quem está causando o erro é a linha 229 (215+14) da planilha, que é a mesma que a linha 215 da tabela.

Se for ver a linha 229 verá que no lugar do mês, tem um sinal de menos.

A linha de comando que dá erro pega o mês em texto (ex. novembro) e transforma em numérico (ex. 11). Como o comando pode transformar um traço em mês numérico? Ai é que dá pau. Se esse conteúdo, o traço, é uma possibilidade que pode acontecer sem representar um erro, então temos que definir o que fazer nesses casos, como tratar essa situação. Caso contrário podemos emitir uma mensagem de erro e encerrar o processamento.
Mas trocando em miúdos... você acha que a melhor opção no momento então é ficar da seguinte forma mesmo:
Acho que a melhor opção é transformar também o primeiro Transpose (do campo Registro) para inversão manual, como foi feito no caso das datas:
Código: Selecionar todos
    For Mes = 1 To 12
        Qtd = UBound(Data(Mes))                       'Quantidade de linhas Total a inserir
        If Qtd > 0 Then        'Insere linhas, se necessário
            LinIni = Tabela(Mes).TotalsRowRange.Row + 2   'Ve qual é a primeira linha abaixo da tabela
            PlanDestino.Rows(LinIni & ":" & LinIni + Qtd - 1).Insert Shift:=xlDown  'Insere as linhas
            Aux1 = Tabela(Mes).Range.Address
            Aux2 = InStrRev(Aux1, "$")
            Tabela(Mes).Resize Range(Mid(Aux1, 1, Aux2) & Qtd + Mid(Aux1, Aux2 + 1))
            Aux1 = Tabela(Mes).DataBodyRange.Rows.Count
            Aux2 = Tabela(Mes).TotalsRowRange.Row - 1
            If Aux1 > Qtd Then Rows(Aux2 - (Aux1 - Qtd) + 1 & ":" & Aux2).Delete ': Debug.Print Mes & " " & Qtd & " " & Aux1
        End If

        ReDim Valores(1 To UBound(Registro(Mes)), 1 To 1) 'Transpose manual pois o Transpose inverte a data
        For NumLinha = 1 To UBound(Valores): Valores(NumLinha, 1) = Registro(Mes)(NumLinha): Next
        Tabela(Mes).Range(2, 1).Resize(UBound(Registro(Mes)), 1) = Valores      'Idem para Datas
        
        ReDim Valores(1 To UBound(Data(Mes)), 1 To 1)     'Transpose manual pois o Transpose inverte a data
        For NumLinha = 1 To UBound(Valores): Valores(NumLinha, 1) = Data(Mes)(NumLinha): Next
        Tabela(Mes).Range(2, 5).Resize(UBound(Data(Mes)), 1) = Valores      'Idem para Datas

        Debug.Print Right("   " & Format(Timer - Tempo, "#,##0"), 4) & " Gerado mês " & Mes & ", " & Qtd & " linhas"
    Next
Se tiver dúvidas, vai perguntando... o que eu souber, ensino.

Jimmy San Juan
Editado pela última vez por Jimmy em 18 Abr 2019 às 22:10, em um total de 1 vez.
#43226
Boa noite, Jimmy.

Obrigado pelas observações... aprendo muito com isso.
Se esse conteúdo, o traço, é uma possibilidade que pode acontecer sem representar um erro, então temos que definir o que fazer nesses casos, como tratar essa situação.
Situação resolvida com a fórmula:
Código: Selecionar todos
=SE(OU([@[Pgto / Vencimento]]="";[@[Pgto / Vencimento]]="-");PRI.MAIÚSCULA(TEXTO([@Data];"MMMM"));PRI.MAIÚSCULA(TEXTO([@[Pgto / Vencimento]];"MMMM")))
Esse erro está dando porque retiramos o ON ERROR RESUME NEXT, e o Excel está parando pra te avisar. Quando acontecer isso clique me DEPURAR, e entrará no editor da macro. A linha com erro erro ficará marcada em amarelo. Quatro linhas acima está o FOR NumLinha. Coloque o cursor sobre a palavra NumLinha e aparecerá seu conteúdo. Outra forma de ver o conteúdo é clicar na variável e depois no botão que tem um óculos sozinho (se não tiver aparecendo esse botão, tem que ativar: menu EXIBIR / BARRA DE FERRAMENTAS / DEPURAR).
Excelente dica e explicação... vou passar a observar isso e interpretar. Obrigado por isso também.
Acho que a melhor opção é transformar também o primeiro Transpose (do campo Registro) para inversão manual, como foi feito no caso das datas:
Isso seria por causa da quantidade de linhas possíveis da tabela de origem?
Pergunto pq estava funcionando normalmente no modo anterior...
#43227
Desculpe o incômodo, Jimmy.

Mas gostaria de aproveitar o ensejo do tópico e o modelo de construção do seu código para resolver mais duas situações que iria apresentar em breve no fórum e que também podem ser resolvidas aqui nesse mesmo tópico.

Mas vamos por partes.

A primeira situação delas:

Gostaria de fazer algo semelhante ao que fizemos até aqui com apenas duas alterações:
1) Fazer a cópia dos dados, agora para a planilha "LIVRO-CAIXA" considerando apenas os dados (ou matriz) da coluna registro... porém dessa vez não há necessidade de gerar a matriz de dados para a coluna "Data Pgto"... somente para a coluna "registro"
2) Acrescentar a condição de"Livro-caixa" para os dados que deverão ser copiados da coluna "Tipo de Declaração".

Já tentei fazer a alteração no código com base na minha limitação mas deve estar faltando algum detalhe para o correto funcionamento.
Fique a vontade para apontar meus erros.

Segue planilha anexada.

A segunda situação trago posteriormente... mas seguiria com o mesmo modelo de código acredito eu.
Você não está autorizado a ver ou baixar esse anexo.
Avatar do usuário
Por Jimmy
Avatar
#43232
Sandro,
SandroLima escreveu: Situação resolvida com a fórmula:
Código: Selecionar todos
=SE(OU([@[Pgto / Vencimento]]="";[@[Pgto / Vencimento]]="-");PRI.MAIÚSCULA(TEXTO([@Data];"MMMM"));PRI.MAIÚSCULA(TEXTO([@[Pgto / Vencimento]];"MMMM")))
Assim a fórmula fica um pouco menor:
Código: Selecionar todos
=PRI.MAIÚSCULA(TEXTO(SE(OU([@[Pgto / Vencimento]]="";[@[Pgto / Vencimento]]="-");[@Data];[@[Pgto / Vencimento]]);"MMMM"))
Se o mês provem da data do pagamento, ou, na falta desta, da data de registro, então não precisamos nem da coluna de mês. Pelo menos não para efeito de macro, mas se precisa por outras questões ok. Sem essa coluna, a macro pode usar o mesmo critério da fórmula acima para extrair o mês, com a vantagem de já estar no formato numérico.

SandroLima escreveu:Isso seria por causa da quantidade de linhas possíveis da tabela de origem?
Pergunto pq estava funcionando normalmente no modo anterior...
Isso seria porque o Transpose tem um problema, e sabe-se lá que outro problema pode ter. Já que a inversão manual não degrada a performance, funciona mellhor que o Transpose, está sob o nosso controle porque usa FOR/NEXT, e já está sendo usada para a Data (por necessidade), porque não padronizar e usar a inversão manual para o Registro também?
Avatar do usuário
Por Jimmy
Avatar
#43233
SandroLima escreveu: Fazer a cópia dos dados, agora para a planilha "LIVRO-CAIXA" considerando apenas os dados (ou matriz) da coluna registro... porém dessa vez não há necessidade de gerar a matriz de dados para a coluna "Data Pgto"... somente para a coluna "registro"
Você quer que as duas executem sempre ao mesmo comando, sempre em pares, ou há situações em que vai executar para Fluxo, e não quer que execute para Livro (ou vice-versa)?
#43242
Bom dia, Jimmy
Assim a fórmula fica um pouco menor:
CÓDIGO: SELECIONAR TODOS
=PRI.MAIÚSCULA(TEXTO(SE(OU([@[Pgto / Vencimento]]="";[@[Pgto / Vencimento]]="-");[@Data];[@[Pgto / Vencimento]]);"MMMM"))
Alteração realizada... quanto mais simples melhor.
Se o mês provem da data do pagamento, ou, na falta desta, da data de registro, então não precisamos nem da coluna de mês. Pelo menos não para efeito de macro, mas se precisa por outras questões ok. Sem essa coluna, a macro pode usar o mesmo critério da fórmula acima para extrair o mês, com a vantagem de já estar no formato numérico.
Utilizo essa coluna para outras macros e para efeito de filtro direto na tabela do banco de dados. Acho que podemos manter assim mesmo... e já tem me ajudado bastante. Não quero exagerar no abuso rsrs.
Isso seria porque o Transpose tem um problema, e sabe-se lá que outro problema pode ter. Já que a inversão manual não degrada a performance, funciona mellhor que o Transpose, está sob o nosso controle porque usa FOR/NEXT, e já está sendo usada para a Data (por necessidade), porque não padronizar e usar a inversão manual para o Registro também?
De acordo.
SandroLima escreveu:
Fazer a cópia dos dados, agora para a planilha "LIVRO-CAIXA" considerando apenas os dados (ou matriz) da coluna registro... porém dessa vez não há necessidade de gerar a matriz de dados para a coluna "Data Pgto"... somente para a coluna "registro"
Você quer que as duas executem sempre ao mesmo comando, sempre em pares, ou há situações em que vai executar para Fluxo, e não quer que execute para Livro (ou vice-versa)?
São situações diferentes... cada uma executada na sua própria planilha... pode ser através do evento WorkSheet_Change como está atualmente ou através de um botão "Atualizar" caso o ano selecionado já esteja correto.. o que acha melhor?
Mas são duas planilhas distintas. Uma para o fluxo financeiro como um todo e a outra com a condição de "Livro-caixa" na coluna "Tipo de Declaração".
Avatar do usuário
Por Jimmy
Avatar
#43252
SandroLima escreveu: São situações diferentes... cada uma executada na sua própria planilha... pode ser através do evento WorkSheet_Change como está atualmente ou através de um botão "Atualizar" caso o ano selecionado já esteja correto.. o que acha melhor?
Não conheço a dinâmica do trabalho com a planilha, mas imagino que sempre que o operador alterar a data, ele vai querer ver o resultado disso, logo, seria mais ágil processar usando o evento Change.
SandroLima escreveu:Mas são duas planilhas distintas. Uma para o fluxo financeiro como um todo e a outra com a condição de "Livro-caixa" na coluna "Tipo de Declaração".
Entendi que cada um terá como resultado uma planilha diferente, ou fluxo ou caixa. Minha dúvida é mais focada no momento em que devem ser executados. Se as execuções forem independentes, porém baseadas na mesma base de dados (a plnilha ATIVIDADES DIARIAS) há o risco do operador processar o Fluxo, imprimir o Fluxo, alterar a base de dados, processar o Caixa e imprimi-lo. Dessa forma haverá inconsistência entre Fluxo e Caixa. Se você quer que essas planilhas sempre reflitam a mesma situação, quando executar um, automaticamente deve-se executar o outro.

Para efeito de alterações na macro, não há muita diferença entre a execução simultânea, e a individual, sendo um pouquinho mais simples a simultânea, mas nada que pese na decisão de fazer de uma forma ou outra.
SandroLima escreveu:A tabela pode chegar a algo em torno de 10.000 linhas
Você já testou com essa quantidade de linhas? 10 mil linhas com 20 colunas dá 200 mil variáveis com conteúdos diversos. Não sei que computador tem, e nem quanta memória, mas se isso apresentar problema teremos que ler a tabela em blocos para não fazer como é feito hoje, onde a tabela é lida toda para a memória e depois processada.

Como você tem alterado a macro, adaptado, etc, é melhor sempre trabalharmos sobre a última versão. Assim que definirmos o que falta, chegará a hora das alterações. Nessa hora vou te pedir que me envie a planilha, e a partir dai você não altera nada enquanto eu altero. Após te devolver, a bola passa a ser tua.

Jimmy San Juan
#43254
Não conheço a dinâmica do trabalho com a planilha, mas imagino que sempre que o operador alterar a data, ele vai querer ver o resultado disso, logo, seria mais ágil processar usando o evento Change.
Concordo plenamente.

Entendi que cada um terá como resultado uma planilha diferente, ou fluxo ou caixa. Minha dúvida é mais focada no momento em que devem ser executados. Se as execuções forem independentes, porém baseadas na mesma base de dados (a plnilha ATIVIDADES DIARIAS) há o risco do operador processar o Fluxo, imprimir o Fluxo, alterar a base de dados, processar o Caixa e imprimi-lo. Dessa forma haverá inconsistência entre Fluxo e Caixa. Se você quer que essas planilhas sempre reflitam a mesma situação, quando executar um, automaticamente deve-se executar o outro.
A base de dados será a mesma (Plan "Atividades Diárias", inclusive para a próxima situação que vou apresentar posteriormente). Minha preocupação seria com o tempo de execução da macro caso as duas acontecessem simultaneamente.
Acredito que individualmente ainda seja a melhor opção.
Você já testou com essa quantidade de linhas? 10 mil linhas com 20 colunas dá 200 mil variáveis com conteúdos diversos. Não sei que computador tem, e nem quanta memória, mas se isso apresentar problema teremos que ler a tabela em blocos para não fazer como é feito hoje, onde a tabela é lida toda para a memória e depois processada.
Não testei... foi só uma estimativa.. e jogada para mais... não deve chegar a tudo isso.
Como você tem alterado a macro, adaptado, etc, é melhor sempre trabalharmos sobre a última versão. Assim que definirmos o que falta, chegará a hora das alterações. Nessa hora vou te pedir que me envie a planilha, e a partir dai você não altera nada enquanto eu altero. Após te devolver, a bola passa a ser tua.
É que conforme vão surgindo ideias para melhorias eu tento ir adaptando. Vou tentar manter o padrão. Mas como falei não quero ficar dando trabalho demais.
Avatar do usuário
Por Jimmy
Avatar
#43255
Ok, vamos fazer execuções separadas. Anexe a sua última versão da planilha pra eu trabalhar sobre ela. Não altere nada até eu te devolver, ou se alterar, anote para aplicar a mesma alteração na planilha que te retornarei.
Avatar do usuário
Por Jimmy
Avatar
#43256
Esqueci de perguntar. Você já fez adaptações para rodar no Livro Caixa. Você notou algo que tenha dado errado?
Avatar do usuário
Por Jimmy
Avatar
#43257
Agora esqueci de comentar... tô ficando velho.... ou já sou :lol:

Digamos que o tempo de execução do Fluxo sejam 20 segundos, e do Caixa mais o menos o mesmo tempo.

O tempo de execução dos 2 juntos não será de 40 segundos, mas de uns 25 ou 30 segundos, porque a leitura da tabela será a mesma pra gerar um ou outro. O que quero dizer é que fazer os 2 juntos significa o Caixa aproveitar a leitura da tabela feita para gerar o Fluxo, e gerar o Caixa também.
#43262
Boa noite, Jimmy.

Obrigado pela atenção dada.
Ok, vamos fazer execuções separadas. Anexe a sua última versão da planilha pra eu trabalhar sobre ela. Não altere nada até eu te devolver, ou se alterar, anote para aplicar a mesma alteração na planilha que te retornarei.
Ok. Façamos assim então... vou lhe mandar a pasta de trabalho com a estrutura planejada, inclusive com a base para as futuras demandas que eu iria lançar em futuros tópicos.
E você fica à vontade para me ajudar até onde acha que deve.
Esqueci de perguntar. Você já fez adaptações para rodar no Livro Caixa. Você notou algo que tenha dado errado?
Como disse anteriormente preciso incluir a condição de "Livro-caixa" para a coluna Tipo de Declaração e eliminar a matriz para a coluna "Data" trabalhado apenas com a matriz da coluna "Registro".
Fiz isso (pelo menos tentei fazer) mas não funcionou adequadamente. Troquei duas vezes o ano selecionado e não funcionou mais.
O tempo de execução dos 2 juntos não será de 40 segundos, mas de uns 25 ou 30 segundos, porque a leitura da tabela será a mesma pra gerar um ou outro. O que quero dizer é que fazer os 2 juntos significa o Caixa aproveitar a leitura da tabela feita para gerar o Fluxo, e gerar o Caixa também.
Ainda assim penso que pode parecer uma eternidade cada vez que rodar o código.
Talvez a melhor solução seja depois eu acrescentar um botão "Imprimir" com uma Inputbox confirmando se os dados precisam ser atualizados antes de imprimir... ou criar 2 botões: "Atualizar e Imprimir" ou apenas "Imprimir".
O que acha dessas alternativas?

Amanhã pela manhã envio a planilha com a estruturação planejada após remover os dados de clientes da planilha.
Avatar do usuário
Por Jimmy
Avatar
#43266
Bom dia Sandro,

Ok, aguardo a planilha.
#43278
Boa tarde, Jimmy.

Conforme vinhamos falando e seguindo a sequencia das demandas...

Para a Planilha "Livro-caixa" tentei, a partir do seu próprio código para a Planilha "Fluxo Financeiro" e com minha tentativa de adaptação, copiar os dados da Planilha "Atividades Diaria" com duas observações:

1) Copiar os dados para a Planilha "Livro-caixa" porém a partir de uma única matriz no caso da coluna "Registro" (e portanto excluindo a necessidade da matriz da coluna "Data")
2) Incluir como condição para os dados copiados o valor/termo "Livro-caixa" da coluna "Tipo de Declaração da Planilha "Atividades Diarias".

Vou relatar as demandas para as outras duas Planilhas... mas essas fazemos ao poucos ou como vc achar melhor:

A Planilha "TIPO DE DECLARAÇÃO" segue o mesmo principio da Planilha "FLUXO FINANCEIRO" e acho que pode ser reproduzida a partir desse mesmo código seu.
São 6 tabelas... Com a diferença de que cada tabela corresponde a um grupo de despesa/movimentação da Coluna "Tipo de Declaração" da Planilha "Atividades Diárias".
- Despesas com Educação
- Despesas com Saúde
- Livro-caixa (sim, ele aparece aqui novamente)
- Outras movimentações tributáveis
- Movimentações não tributáveis
- Sem classificação


E, por fim, A Planilha "ATENDIMENTOS".
Essa com uma observação e acho que para isso a melhor opção é um botão de atualizar.
Nela o que preciso é que ao acionar a macro ela copie somente as linhas que possuem um "CÓDIGO" de letras e números existente na coluna "Código" da Planilha "Atividades Diárias" descartando os que tiverem o "-" como retorno.
Pq o botão atualizar e não o evento change?
Pq gostaria de que o código verificasse os códigos já copiados e trouxesse somente códigos novos/ainda não copiados.
Os códigos da Planilha "ATIVIDADES DIARIAS" são únicos (não se repetem).
Uma vez copiados, há a possibilidade de que eu acrescente linhas na Planilha "ATENDIMENTOS" para um determinado código de forma manual... isso acontece pq a partir de um código copiado para essa planilha pode ser que ele tenha mais de um procedimento agregado e com isso eu preciso inserir uma linha descrevendo cada procedimento daquele código copiado.
Em cada linha inserida manualmente o código é repetido... e por isso a macro não pode excluir códigos repetidos mas sim verificar se determinado código já existe e copiar somente os novos códigos


Segue planilha anexa com a forma estruturada da maneira que pretendo. Apaguei apenas dados particulares.
Qualquer dúvida estou à disposição.
Obrigado mais uma vez pela disposição em me ajudar e aperfeiçoar o código cada vez que percebe a possibilidade de melhorar.
Você não está autorizado a ver ou baixar esse anexo.
Avatar do usuário
Por Jimmy
Avatar
#43280
Sandro,

Passo a passo é mais fácil. Vamos acertar primeiro a planilha Caixa, e ai passamos para a demanda seguinte.

Vou tentar fazer ainda hoje, para que a planilha não fique travada para alterações tuas, por muito tempo.
Avatar do usuário
Por Jimmy
Avatar
#43282
Sandro,

Seque anexo, falta testar.

A macro é a mesma para Fluxo Financeiro (FF) e para Livro-Caixa (LC). Ao acionar a macro, no evento Change, é passado um parâmetro para a macro, informando qual a planilha a executar.

Os assinalamentos de SET que são feitos para as 12 planilhas, vão depender desse parâmetro para apontar para a Planilha de FF ou a de LC.

A coluna de Data só é armazenada na memória se for execução para FF, mas não para LC.

Ou seja, a macro é a mesma mas executa para FF ou para LC, apontando para uma ou outra planilha.

Depois dessa parte validada, partimos pra próxima etapa.

Jimmy San Juan
Você não está autorizado a ver ou baixar esse anexo.
#43297
Boa tarde, Jimmy.

Muito obrigado pela prestatividade.

Estou testando a macro e pelo que pude perceber a macro melhorou ainda mais a performance para a Plan "FLUXO FINANCEIRO".
Mas para a Plan "LIVRO-CAIXA" não funcionou adequadamente.

De qualquer maneira baseado no seu código vou tentar dividir as rotinas da Macro em 2 módulos mesmo... um para cada Planilha... pois pretendo fazer a mesma rotina com outras condições posteriormente.

Por exemplo, além do critério "Livro-caixa", depois quero fazer uma rotina para extrair somente os atendimentos baseado no critério "Paciente", e com esse código modificando apenas o critério eu poderia fazer muitas outras rotinas conforme necessidade.

Vou tentar separar as duas rotinas e dou retorno. Já lhe envio com a tentativa para vc conferir e ajustar o que estiver errado.

Agora me diga uma coisa. Pq alterou linhas como:
[code]Debug.Print Right(" " & Format(Timer() - Tempo, "0"), 4) & " Iniciação ok"[/code]

Foi devido isso a melhora de performance da macro ou foi para juntar as duas rotinas em um a única macro?

Feliz Páscoa e muito obrigado.

EDIT:
Segue planilha anexa para verificação da macro para livro-caixa
Você não está autorizado a ver ou baixar esse anexo.
Avatar do usuário
Por Jimmy
Avatar
#43312
Olá Sandro,
SandroLima escreveu:Muito obrigado pela prestatividade.
Por nada!!
SandroLima escreveu:Estou testando a macro e pelo que pude perceber a macro melhorou ainda mais a performance para a Plan "FLUXO FINANCEIRO".
Não me lembro de ter feito algo que alterasse a performance, mas.... que bom!!
SandroLima escreveu:Mas para a Plan "LIVRO-CAIXA" não funcionou adequadamente.
Qual problema apresentou?
SandroLima escreveu:De qualquer maneira baseado no seu código vou tentar dividir as rotinas da Macro em 2 módulos mesmo... um para cada Planilha... pois pretendo fazer a mesma rotina com outras condições posteriormente.
Podemos fazer assim num primeiro momento, mas eu acredito que pra você é mais fácil raciocinar com as macros separadas, porque tem pouca experiência em VBA. Quando tiver mais familiaridade com programação, vai ver mais simplicidade em todas juntas, e verá que por terem todas a mesma estrutura básica, juntas é mais indicado. Vou ver se consigo te mandar um áudio explicando a rotina que te mandei (junta) de uma forma um pouco mais estrutural.
SandroLima escreveu:Por exemplo, além do critério "Livro-caixa", depois quero fazer uma rotina para extrair somente os atendimentos baseado no critério "Paciente", e com esse código modificando apenas o critério eu poderia fazer muitas outras rotinas conforme necessidade.
Isso mostra que tenho razão quando digo que a estrutura básica é a mesma, e as mudanças entre as rotinas é pequena, e fácil de administrar a junção.
SandroLima escreveu:Vou tentar separar as duas rotinas e dou retorno. Já lhe envio com a tentativa para vc conferir e ajustar o que estiver errado.
Ok, vou ver se consigo olhar hoje, porque no início da semana vai ser corrido...
SandroLima escreveu:Agora me diga uma coisa. Pq alterou linhas como:
Código: Selecionar todos
Debug.Print Right("   " & Format(Timer() - Tempo, "0"), 4) & " Iniciação ok"
Foi devido isso a melhora de performance da macro ou foi para juntar as duas rotinas em um a única macro?
Na parte de edição do VBA existe um botão no menu de edição que é uma planilhazinha e um sinal de exclamação vermelho em cima, que abre a janela de "Verificação Imediata". POde abrir essa janela também teclando CTRL-G.

A macro consegue imprimir linhas nessa janela para que, por exemplo, você possa acompanhar a execução.
Quem imprime nessa janela é o comando Debug.Print. Eu dividi a macro em atapas, e no final de cada etapa eu imprimo nessa tela. Experimente abrir o editor, abrir essa janela (CTRL-G), abrir o módulo da macro, clicar na segunda linha (Sub Vai1(), que executa a macro como FF), coloque pra rodar (botão de play na barra de edição), e observe as etapas sendo impressas na janela de Verificação Imediata.

Antes eu apenas imprimia uma linha cada vez que acabava uma etapa. Daí modifiquei o comando pra imprimir também quantos segundos (inteiros, sem decimais) decorreram desde o início da macro até o encerramento de cada etapa. isso pra ter uma ideia de quanto tempo demora cada etapa.

Essas linhas poderiam ser apagadas quanto a macro estiver redonda, mas pra ser sincero eu nem apagaria porque não gasta nada de processamento e nem de memória, e se um dia você notar algo de estranho na execução da macro, basta abrir a janela e ver se todas as etapas foram concluídas, se nenhuma apresentou tempo de execução ínfimo ou exagerado, o que poderia dar uma pista de onde está o erro.

Agora sendo direto, sem enrolação: não, a alteração na linha Debug.Print não tem nada a ver com a melhora na performance, e nem com a junção das rotinas.

Jimmy
  • 1
  • 2
  • 3
  • 4
  • 5
  • 7
long long title how many chars? lets see 123 ok more? yes 60

We have created lots of YouTube videos just so you can achieve [...]

Another post test yes yes yes or no, maybe ni? :-/

The best flat phpBB theme around. Period. Fine craftmanship and [...]

Do you need a super MOD? Well here it is. chew on this

All you need is right here. Content tag, SEO, listing, Pizza and spaghetti [...]

Lasagna on me this time ok? I got plenty of cash

this should be fantastic. but what about links,images, bbcodes etc etc? [...]

Estamos migrando para uma comunidade no Discord