Tópicos relacionados a códigos VBA, gravação de macros, etc.
Por SandroLima 08 Mai 2019 às 00:54
Membro 5 Estrelas
Mensagens: 553
Reputação: 9
#43749
O tempo de execução vai depender de uma série de fatores, mas entre eles está a quantidade de dados. Assim, seria bom se as linhas filhas tenham preenchidas apenas as colunas que pertencem a elas, ou que sejam necessárias para as macros. Eu vi muitas colunas com X. Será que são todas necessárias? Será que algumas das informações já estando na linha mãe não seria suficiente? Esses cuidados fazem a planilha emagrecer , e se tornar mais ágil.

Não tinha pensado assim... até então trabalhei com as linhas cheias que facilitam a busca/coleta de informações. Não sei dizer no momento como seria isso.

Já pensou na ideia de fazer um fechamento semestral, e retirar os registros 100% encerrados (registros mortos)?

Nunca havia pensado nisso... mas trabalho com a possibilidade de edição de dados durante todo o ano (sempre fica uma pendência para lançar ou corrigir depois)... não sei se seria viável ou desejável.

Ou ainda: criar uma coluna que diferencie os registros vivos (você define qual o critério para vivo) dos registros mortos. As macros de execução poderia ser acionadas de forma a considerar todos os registros, ou apenas os vivos, à escolha do operador. Talvez para o dia a dia o operador possa se contentar em rodar o processamento parcial (só registros vivos) e isso agilizaria muito o processo, principalmente mais pra perto do final do ano, mas para fechamento do mês a contabilidade necessite da execução total e o operador possa rodar tudo.

Podemos avaliar isso mais para frente... no momento a tabela parece ter já bastante colunas para serem abastecidas... mas podemos considerar isso mais adiante.
Avatar do usuário
Por Jimmy 10 Mai 2019 às 19:46
Membro 5 Estrelas
Mensagens: 601
Reputação: 380
#43808
Bom dia Sandro,

Tem muita coisa pra ver...

SandroLima escreveu: Por exemplo trazer esses dois valores com a macro e os demais com fórmulas seria mais rápido do que trazer todos os campos com a macro? Saberia me dizer isso?

Acho que mais rápido seria não usar fórmula. Pegar o valor da Diária e Colocar na Atendimento.

Eu não achei a maioria dessas colunas acima, na planilha ATENDIMENTOS, mesmo porque a maioria tem nomes provisórios: Colunas1, Colunas2, etc. Então copiei apenas as colunas Registro, Sub, Valor e Código. Creio que faz assim por questão de sigilo, mas não tenho certeza. Tente fazer a cópia das colunas que desejar, e se tiver dificuldade me avise.
___

Alterei a linha
Tabela(Mes).Range(2, 3).Resize(UBound(Codig(Mes)), 1) = Valores
para
Tabela(Mes).ListColumns("Código").DataBodyRange = Valores
Embora ambas façam a mesma coisa, devemos evitar determinar o número da coluna na própria instrução (no nosso caso a coluna 3, que é Código), porque caso mude essa coluna de lugar, o código passará a fazer besteira. Na segunda instrução, o número da coluna não é utilizado, apenas seu nome, logo, se ela mudar de lugar, a macro não sofre.
Uma alternativa seria
Tabela(Mes).Range(2, ColCod).Resize(UBound(Codig(Mes)), 1) = Valores
___

É sempre bom também que, entre as diversas tabelas, se mantenham as colunas que representam a mesma informação, com o mesmo nome. Por exemplo, a coluna Valor Pago da planilha Atividades, deve ter também o nome de Valor Pago (e não apenas Valor). Isso não é exigência do Excel, mas apenas organiza melhor as informações, facilitando o desenvolvimento e manutenção das macros.
___

Na macro de classificação inclui a linha
TabelaAtividades.Range.AutoFilter: TabelaAtividades.Range.AutoFilter
que desliga e religa os filtros (limpa se houver algum filtro ativado) porque quando há filtro ativo, a rotina de classificação só classifica as linhas visíveis (não as ocultas), e, consequentemente dá erro no sequenciamento dos números de registro.
___

Fiz a macro de inclusão de desdobramentos de Atendimento e Parcelamentos. A macro vai inserir desdobramentos na linha em que a célula selecionada está, e não deverá ser uma linha filha. Se a linha já tiver desdobramento, digamos, do tipo A (Atendimento), só será possível inserir do tipo P. Se já tiver dos 2 tipos, não será possível inserir mais nada, e nesse caso, a linha mãe não conterá nem A-00 e nem P-00; será #-00 que indica que há filhas A e P.
Coloquei um botão no topo da planilha, mas a macro pode também ser acionada teclando SHIFT+CTRL, segurando e em seguida teclando D (de Desdobramentos).

Apenas pra simplificar e ficar pronto mais rápido, fiz a macro apenas perguntar quantas linhas serão inseridas, inserir essas as linhas, definir o número de Registro e Sub, e Valor para o Parcelamento. As demais colunas das linhas filhas, temos que definir. Acho que você já as passou, mas depois eu disse que deveriam ser só as essenciais, e ai não lembro como ficou. Creio que por causa da falta de algumas informações, estão aparecendo cores de formatações condicionais, mas quando preenchermos as colunas necessárias, isso deve desaparecer. A col de valor de Atendimento ainda não fiz, mas vai seguir o mesmo padrão do de Parcelamento. A princípio, os valores são o resultado da divisão do valor total pela quantidade de linhas. Os valores que forem sendo digitados, como por exemplo a primeira parcela (entrada) de valor maior, ou outro caso similar, vão sendo respeitados, e as demais linhas vão dividindo o saldo entre elas. Quando todas forem digitadas, a soma das parcelas deve ser igual ao valor total (da linha mãe). Se não for, vai aparecer mensagem. Na verdade coloquei uma tolerância de 1 real, mas podemos alterar para outro valor, ou até zero mesmo.


Ainda faltam coisas, mas já dá pra testar e aparecerem problemas. Eu prefiro ir fazendo blocos menores e já ir te passando, mas acabou ficando um volume um pouco maior...

A planilha agora está com você. Vamos deixar o que já foi feito redondo, e seguimos adiante...

Jimmy
Apenas usuários registrados podem ver ou baixar anexos.
Por SandroLima 11 Mai 2019 às 15:11
Membro 5 Estrelas
Mensagens: 553
Reputação: 9
#43817
Bom dia, Jimmy.

Obrigado pelo retorno.

Eu não achei a maioria dessas colunas acima, na planilha ATENDIMENTOS, mesmo porque a maioria tem nomes provisórios: Colunas1, Colunas2, etc. Então copiei apenas as colunas Registro, Sub, Valor e Código.

Eu achei que já tinha inserido.

Creio que faz assim por questão de sigilo, mas não tenho certeza. Tente fazer a cópia das colunas que desejar, e se tiver dificuldade me avise.

Na verdade não... estava imaginando que o retorno das demais colunas seria por fórmulas e achei que era informação demais que serviria apenas para confundir. Vou colocar os nomes das colunas na planilha antes de reenviar para vc (e após os testes).
Vou alimentar a Plan com alguns poucos dados fictícios também.

Alterei a linha
Tabela(Mes).Range(2, 3).Resize(UBound(Codig(Mes)), 1) = Valores
para
Tabela(Mes).ListColumns("Código").DataBodyRange = Valores
Embora ambas façam a mesma coisa, devemos evitar determinar o número da coluna na própria instrução (no nosso caso a coluna 3, que é Código), porque caso mude essa coluna de lugar, o código passará a fazer besteira. Na segunda instrução, o número da coluna não é utilizado, apenas seu nome, logo, se ela mudar de lugar, a macro não sofre.
Uma alternativa seria
Tabela(Mes).Range(2, ColCod).Resize(UBound(Codig(Mes)), 1) = Valores

Entendido.

É sempre bom também que, entre as diversas tabelas, se mantenham as colunas que representam a mesma informação, com o mesmo nome. Por exemplo, a coluna Valor Pago da planilha Atividades, deve ter também o nome de Valor Pago (e não apenas Valor). Isso não é exigência do Excel, mas apenas organiza melhor as informações, facilitando o desenvolvimento e manutenção das macros.

Entendo... mas é uma opção de facilitar a comunicação entre empresa e o escritório de contabilidade. Para quem alimentou a empresa é interessante saber que um cliente fechou um tratamento de X valor... para a contabilidade importam as entradas e receitas do mês apenas (no caso, o valor da parcela.. e por isso o valor da parcela na plan ATIVIDADES DIARIAS virá valor pago na maioria das outras planilhas)

Na macro de classificação inclui a linha
TabelaAtividades.Range.AutoFilter: TabelaAtividades.Range.AutoFilter
que desliga e religa os filtros (limpa se houver algum filtro ativado) porque quando há filtro ativo, a rotina de classificação só classifica as linhas visíveis (não as ocultas), e, consequentemente dá erro no sequenciamento dos números de registro.

Vou verificar.

Ainda faltam coisas, mas já dá pra testar e aparecerem problemas. Eu prefiro ir fazendo blocos menores e já ir te passando, mas acabou ficando um volume um pouco maior...

A planilha agora está com você. Vamos deixar o que já foi feito redondo, e seguimos adiante...

Vou aplicar aqui na planilha.
Parece muito bom o funcionamento... vou incluir uns dados e nomear as colunas para testes.
Em breve retorno com a avaliação.

Muito obrigado de novo, Jimmy. Bom final de semana.
Avatar do usuário
Por Jimmy 11 Mai 2019 às 23:49
Membro 5 Estrelas
Mensagens: 601
Reputação: 380
#43818
Ok Sandro,

Após inserir alguns dados, mande a planilha para mim pois vou usar esses dados para fazer um teste de performance. Procure fazer uma amostra balanceada, ou seja, com quantidades que você julga proporcionais à realidade de dados contendo linhas sem desdobramentos, com desdobramentos de um tipo, de outro, e de ambos., espalhadas pelos 12 meses, com os tipos FF e LC, etc. Procure fazer uma amostra proporcional ao que você acha que será o ano.

Bom domingo!!
Por SandroLima 13 Mai 2019 às 19:55
Membro 5 Estrelas
Mensagens: 553
Reputação: 9
#43842
Boa tarde, Jimmy

Após inserir alguns dados, mande a planilha para mim pois vou usar esses dados para fazer um teste de performance. Procure fazer uma amostra balanceada, ou seja, com quantidades que você julga proporcionais à realidade de dados contendo linhas sem desdobramentos, com desdobramentos de um tipo, de outro, e de ambos., espalhadas pelos 12 meses, com os tipos FF e LC, etc. Procure fazer uma amostra proporcional ao que você acha que será o ano.

Optei por pegar uma base de dados anterior trocando por dados fictícios (achei mais fácil assim do que começar a fazer uma nova base na nossa planilha)
Segue a planilha com uma pequena parte da base de dados esperada para um ano (foi o que consegui fazer... mas acredito que não deva passar de 5.000 linhas... acho que ficaria entre 3500 e 5000 linhas)

Travei na parte dos desdobramentos pq não soube declarar as variáveis da linha:
Código: Selecionar todosLFCR1 = Chr(10) & Chr(13):  LFCR2 = LFCR1 & LFCR1:  LFCR3 = LFCR1 & LFCR2


Algumas linhas (identificadas por compra/venda parceada) foram criadas com a macro de parcelamento que utilizo.

***IMPORTANTE***
Vi que vc alterou um pouco a macro FluxoFinanceiro_Anual...
E vi que vc fez ela sobre a base da macro criada em 13.04.2019.
Alguns dias depois de criada essa macro (a de 13.04.2019) vc me pediu para fazer alterações (conforme está agora a macro de 20.04.2019)
Nomeei as macros do módulo Fluxo da seguinte maneira:
(13.04.2019) FluxoFinanceiro_Anual_2
(20.04.2019) FluxoFinanceiro_Anual (essa é a que estou aplicando atualmente)
(essa foi criada a partir da anterior "FluxoFinanceiro_Anual_2"... vc pediu para que eu atualizasse a anterior)

E a mais recente que vc enviou nomeei como Atendimento_Anual_3 (essa foi construída em cima da base da "FluxoFinanceiro_Anual_2"... não deveria ter sido feita a partir da macro atualizada "FluxoFinanceiro_Anual"???

As três estão no mesmo módulo para que vc avalie qual a de melhor aplicação.

Também optei por colocar título em todas as colunas que serão utilizadas em cada uma das planilhas para ficar mais fácil a comunicação e entendimento.

Deixei algumas colunas com as fórmulas que uso para retornar os valores de cada coluna... pois lembrei que conversamos sobre se o que seria mais rápido... retornar os valores das demais colunas com macro ou fórmula?
Atualmente uso essa fórmula padrão nas demais colunas para retornar os respectivos valores.

Fico aguardando seu posicionamento para prosseguirmos...

E só para irmos nos programando estarei ausente entre os dias 17 e 25 desse mês.
Falo isso por não querer atrapalhar sua rotina ok??? Faremos conforme sua disponibilidade... sem pressa rsrs.

Segue planilha anexa... e muito obrigado mais uma vez, Jimmy.
Apenas usuários registrados podem ver ou baixar anexos.
Editado pela última vez por SandroLima em 14 Mai 2019 às 00:53, em um total de 2 vezes.
Avatar do usuário
Por Jimmy 13 Mai 2019 às 23:20
Membro 5 Estrelas
Mensagens: 601
Reputação: 380
#43845
Olá Sandro,

Optei por pegar uma base de dados anterior trocando por dados fictícios (achei mais fácil assim do que começar a fazer uma nova base na nossa planilha)
Segue a planilha com uma pequena parte da base de dados esperada para um ano (foi o que consegui fazer... mas acredito que não deva passar de 5.000 linhas... acho que ficaria entre 3500 e 5000 linhas)

Essas 500 linhas eu posso transformar em 5000, mas faltaram os desdobramentos. Quantas linhas teriam desdobramentos de cada tipo? Quantas linhas em média para atendimento? E para parcelamento? Essas 3500~5000 que você falou é no ano? Contando com desdobramentos?

Travei na parte dos desdobramentos pq não soube declarar as variáveis da linha:
CÓDIGO: SELECIONAR TODOS
LFCR1 = Chr(10) & Chr(13): LFCR2 = LFCR1 & LFCR1: LFCR3 = LFCR1 & LFCR2

Declara assim: Dim LFCR1 as string
Essa variável é formada por 2 caracteres, de códigos ASCII 10 e 13. Eles promovem um pular de linha quando uma mensagem é exibida. Exemplo: msgbox "Vai" & CHR(10) & CHR(13) & "pular" imprime na tela:

Vai
pular

Pra não ter que ficar digitando CHR(10) & CHR(13), joguei esses 2 caracteres em uma variável chamada LFCR1.
Depois montei uma pra pular 2 linhas e outra pra pular 3.
LF significa Line Feed, e CR significa Carriage Return, que é como esses 2 caracteres são conhecidos, e quer dizes "vá para a linha de baixo", e "vá para o início da linha".

Por enquanto, tire o Option Explicit que vai rodar bem. Depois do módulo pronto, colocamos e declaramos tudo. Eu, particularmente, não gosto de usar isso, porque quando estou aquecido e programando, o fato de ter que parar pra declarar uma variável nova, me tira o ritmo. Tem pessoas que gostam pois evita erros de digitação no nome da variável, porque ao digitar errado o VB avisa que a variável não está declarada. Questão de gosto.

Tirando esse option vai conseguir incluir desdobramentos, e deixar a massa de testes mais parecida com o real.

***IMPORTANTE***

A diferença entre a FluxoFinanceiro_Anual, e a FluxoFinanceiro_Anual_2, é que a primeira (atual) apaga as tabelas de meses da planilha antes de ler a tabela diária, e a segunda apaga depois. Já apaguei a 2, deixei apenas a FluxoFinanceiro_Anual.

Na de atendimento já passei o apagar das tabelas pra antes da leitura da tabela diária.

Também optei por colocar título em todas as colunas que serão utilizadas em cada uma das planilhas para ficar mais fácil a comunicação e entendimento.

Ótimo!

Deixei algumas colunas com as fórmulas que uso para retornar os valores de cada coluna... pois lembrei que conversamos sobre se o que seria mais rápido... retornar os valores das demais colunas com macro ou fórmula?
Atualmente uso essa fórmula padrão nas demais colunas para retornar os respectivos valores.

Não sei se estaremos falando sobre o mesmo assunto, mas vamos lá.

Fórmulas nas colunas, pegando dados de outras colunas da mesma linha, não há problema algum.

Fórmulas pegando dados de colunas de outras linhas, pode ser problemático, pois a classificação faz as linhas mudarem de lugar, e a fórmula pode ficar com uma referência inválida, ou apontando para a informação errada.

Se não estou enganado, quando falamos sobre usar o valor ou fórmula, me referia às colunas das linhas filhas, e que terão o mesmo valor da linha mãe. Supondo que a coluna XYZ da linha mãe é resultado de uma fórmula que utiliza dados de outras colunas da mesma linha, e que tem como resultado 12345. Supondo agora que a linha filha tenha a necessidade de ter essa mesma informação. Ela pode usar a mesma fórmula da mãe (desde que tenha também as informações das colunas utilizadas na fórmula), e obterá o mesmo 12345. A filha pode também, ao ser criada, ter o valor 12345 colocado na coluna XYZ, como se tivesse sido digitado, e não fruto de fórmula. É claro que dessa forma, caso algum valor de alguma coluna usada na fórmula, for alterado, o resultado da coluna XYZ só se altera se ela contiver também fórmula, como a linha mãe. Se tiver 12345 como digitado, as outras colunas podem alterar todas, que o 12345 continuará a ser 12345.
Essa é a vantagem de colocar como fórmula, mas a desvantagem é que a planilha fica mais pesada e mais lenta pra recalcular. O quanto vai depender da quantidade de linhas.

Outra coisa que eu havia comentado é que, na minha opinião, a linha filha só deve ter preenchidas as colunas que a amarram à mãe (Reg, Sub e Data), e também aquelas nas quais ela terá um valor diferente da mãe (Descrição, Valor, etc). A linha filha deve ser vista como um complemento da mãe, e não uma linha completa.
___

Não entendi o que aconteceu com a macro Ordena_AtivDiarias, que passou a ser Ordena_AtivDiarias_2, mas não é executada. Sem ela a inclusão de desdobramentos não funciona.


Jimmy
Por SandroLima 14 Mai 2019 às 00:50
Membro 5 Estrelas
Mensagens: 553
Reputação: 9
#43846
Boa noite, Jimmy

Quantas linhas teriam desdobramentos de cada tipo? Quantas linhas em média para atendimento? E para parcelamento?

Os desdobramentos para atendimentos devem chegar a no máximo em número de 6-8. Já o de parcelamentos podem chegar a 30
Essas 3500~5000 que você falou é no ano? Contando com desdobramentos?

Pensando bem... considerando os desdobramentos de parcelas e atendimentos pode sim chegar a 10.000 linhas fácil... mas também não muito mais que isso não.

Dim LFCR1 as string

Feito!
E as outras? Também é necessário declarar como variável? LFCR2 e LFCR3?

Essa variável é formada por 2 caracteres, de códigos ASCII 10 e 13. Eles promovem um pular de linha quando uma mensagem é exibida. Exemplo: msgbox "Vai" & CHR(10) & CHR(13) & "pular" imprime na tela:

Vai
pular

Pra não ter que ficar digitando CHR(10) & CHR(13), joguei esses 2 caracteres em uma variável chamada LFCR1.
Depois montei uma pra pular 2 linhas e outra pra pular 3.
LF significa Line Feed, e CR significa Carriage Return, que é como esses 2 caracteres são conhecidos, e quer dizes "vá para a linha de baixo", e "vá para o início da linha".

Entendido e copiado rsrs.

Por enquanto, tire o Option Explicit que vai rodar bem.
Tirando esse option vai conseguir incluir desdobramentos, e deixar a massa de testes mais parecida com o real.

Ok... por enquanto tirarei.

A diferença entre a FluxoFinanceiro_Anual, e a FluxoFinanceiro_Anual_2, é que a primeira (atual) apaga as tabelas de meses da planilha antes de ler a tabela diária, e a segunda apaga depois. Já apaguei a 2, deixei apenas a FluxoFinanceiro_Anual.

Feito também.

Na de atendimento já passei o apagar das tabelas pra antes da leitura da tabela diária.

Ok.

Fórmulas nas colunas, pegando dados de outras colunas da mesma linha, não há problema algum.

Isso... pegam o "registro" como referência e buscam os dados na Plan "ATIVIDADES DIARIAS"... por isso tenho perguntado entre macro ou fórmulas
Se não estou enganado, quando falamos sobre usar o valor ou fórmula, me referia às colunas das linhas filhas, e que terão o mesmo valor da linha mãe. Supondo que a coluna XYZ da linha mãe é resultado de uma fórmula que utiliza dados de outras colunas da mesma linha, e que tem como resultado 12345. Supondo agora que a linha filha tenha a necessidade de ter essa mesma informação. Ela pode usar a mesma fórmula da mãe (desde que tenha também as informações das colunas utilizadas na fórmula), e obterá o mesmo 12345. A filha pode também, ao ser criada, ter o valor 12345 colocado na coluna XYZ, como se tivesse sido digitado, e não fruto de fórmula. É claro que dessa forma, caso algum valor de alguma coluna usada na fórmula, for alterado, o resultado da coluna XYZ só se altera se ela contiver também fórmula, como a linha mãe. Se tiver 12345 como digitado, as outras colunas podem alterar todas, que o 12345 continuará a ser 12345.
Essa é a vantagem de colocar como fórmula, mas a desvantagem é que a planilha fica mais pesada e mais lenta pra recalcular. O quanto vai depender da quantidade de linhas.

Quando falei de macros ou fórmulas estava me referindo à situação colocada logo acima... mas dentro dessa situação que vc colocou as linhas filhas podem copiar a mãe... exceto pela coluna sub (óbvio) e pelas colunas que envolvem valor financeiro (contábeis)... penso eu.

Outra coisa que eu havia comentado é que, na minha opinião, a linha filha só deve ter preenchidas as colunas que a amarram à mãe (Reg, Sub e Data), e também aquelas nas quais ela terá um valor diferente da mãe (Descrição, Valor, etc). A linha filha deve ser vista como um complemento da mãe, e não uma linha completa.

Entendi isso... eu prefiro linhas cheias mesmo que não sejam fórmulas... mas se é para melhorar a performance manda ver.

Não entendi o que aconteceu com a macro Ordena_AtivDiarias, que passou a ser Ordena_AtivDiarias_2, mas não é executada. Sem ela a inclusão de desdobramentos não funciona.

Erro meu na hora de organizar as macros... e já corrigido. Vou reanexar no tópico anterior. Mantive a minha macro inicial para vc ver como ela trabalha (a forma que preciso).
Avatar do usuário
Por Jimmy 14 Mai 2019 às 12:26
Membro 5 Estrelas
Mensagens: 601
Reputação: 380
#43855
Bom dia Sandro,

Os desdobramentos para atendimentos devem chegar a no máximo em número de 6-8. Já o de parcelamentos podem chegar a 30

Usaremos essa informação para limitar a quantidade de linhas informadas na hora de abrir um desdobramento.
O que vale pra avaliarmos a performance, e suas consequências (se vamos usar fórmulas ou valores nas filhas, por exemplo) não é o máximo de parcelamentos ou atendimentos.
O que é interessante saber é:
-Quantidade média estimada de registros por ano (parece que já temos esse dados: 5000)
-Quantidade média estimada de registros que terão desdobramento de Atendimento (ex. 1000 das 5000 linhas)
-Quantidade média estimada de registros que terão desdobramento de Parcelamento (ex. 2000 das 5000 linhas)
-Quantidade média de linhas que terá um desdobramento de Atendimento típico (ex. 4 linhas)
-Quantidade média de linhas que terá um desdobramento de Parcelamento típico (ex. 8 linhas)

São valores estimados. Depois podemos colocar 20% de margem acima para efetuar os testes.

Quando falei de macros ou fórmulas estava me referindo à situação colocada logo acima... mas dentro dessa situação que vc colocou as linhas filhas podem copiar a mãe... exceto pela coluna sub (óbvio) e pelas colunas que envolvem valor financeiro (contábeis)... penso eu.

... eu prefiro linhas cheias mesmo que não sejam fórmulas... mas se é para melhorar a performance manda ver.

Podemos fazer assim e ver se fica muito demorado, mas de qualquer forma, se fizermos assim, os valores serão passados da mãe para a filha de forma fixa, ou seja, sem fórmula, pois se usarmos fórmulas a classificação bagunçará essas fórmulas.

Eu tinha proposto da linha ficar vazia na filha, porque caso após feito o desdobramento, a mãe sofrer alguma alteração de valor em alguma das suas células, a filha não será atualizada. Com isso, o operador corre o risco de consultar aquela informação na linha filha e obter um dado inválido. Pra não ocorrer isso teríamos 2 alternativas:
- O operador terá que fazer a alteração nas linhas filhas também;
- A macro que Ordena e Acerta poderia verificar eventuais diferenças, e recopiar todos os dados que não batem, da mãe para as filhas, a cada vez que fosse executada. Mesmo assim, no intervalo entre a alteração na linha mãe, e a execução da
dos acertos, a informação estará divergente entre mãe e filhas.
____

Como você está aprendendo (e eu também, sempre!), de vez em quando eu escrevo coisas que não tem a ver com o projeto, mas já que esbarramos nelas, eu comento. Lá vai mais uma.

Falei no post a respeito de uma das finalidades de declarar variáveis, que é evitar enganos de digitação.
Há outras: ela é importante também para economizar espaço de memória. Se você precisa guardar uma informação em uma variável, usando o DIM com declaração do tipo de variável, o Excel vai alocar a memória suficiente pra guardar aquilo. Um número grande ocupa varias vezes mais espaço do que um número de 1 dígito. Se você usa o DIM com declaração de tipo, economiza espaço. Para variáveis únicas da macro (ex.: ColReg, Lin, LFCR1, ErroABC), não vejo vantagem nisso. A economia é mínima perto do espaço que temos de memória. A necessidade começa quando falamos de matrizes. Se dimensionar uma matriz de 500.000 componentes, e disser que eles serão do tipo Double, ou se disser que serão do tipo String, ou se disser que serão do tipo Byte, haverá diferença, pois a redução de espaço individual será multiplicada por 500mil. Eu, particularmente, só declaro variáveis nessas condições, quando haverá significativo ganho de memória.

Tem vezes que a declaração faz ocupar ainda mais memória. Em programação é comum ter que usar uma variável momentânea, que tem abrangência apenas dentro de um loop, por exemplo, apenas numa parte da macro. Eu costumo usar a variável Aux1 para isso (se forem mais, uso Aux2, Aux3, etc). São variáveis que ajudam só de forma localizada. Depois de usar, mais pra frente na macro, se tiver necessidade de outra variável local, uso Aux1 novamente, mas sua finalidade não tem nada a vez com a primeira utilização. Elas podem conter número, ou texto, ou operadores lógicos, sei lá. A situação é quem define. Se eu declarar Aux1 como Double, por exemplo, porque vou usá-la dessa forma, mais pra frente se precisar usar uma variável auxiliar novamente, para guardar texto, não poderei usar Aux1. Terei que declarar e usar outra variável. Se eu não declarar que Aux1 é de um determinado tipo (o Excel a considera Variant, que corresponde a "Coringa"), poso usar diversas vezes durante a macro.

Para aqueles que querem declarar pelo primeiro motivo (evitar erros de digitação) mas não pelo segundo, não querem ficar pensando no tipo de variável, quanto ocupa, etc (me refiro ás variáveis simples, de 1 ocorrência) eles podem declarar a variável, mas sem declarar o tipo. Ex.: DIM LFCR1, LFCR2, LFCR3, Flag, Auxiliar, Erro, Erro2.

Jimmy
Por SandroLima 14 Mai 2019 às 14:23
Membro 5 Estrelas
Mensagens: 553
Reputação: 9
#43858
Bom dia, Jimmy

O que é interessante saber é:
vamos lá...

-Quantidade média estimada de registros por ano (parece que já temos esse dados: 5000)

São em média 300 registros mensais (sem desdobramento algum)... portanto 3.600 ao ano.

-Quantidade média estimada de registros que terão desdobramento de Atendimento (ex. 1000 das 5000 linhas)
-Quantidade média de linhas que terá um desdobramento de Atendimento típico (ex. 4 linhas)

Difícil de mensurar a quantidade mensal final... mas a possibilidade de no máximo 8 desdobramento de atendimento é suficiente.

-Quantidade média estimada de registros que terão desdobramento de Parcelamento (ex. 2000 das 5000 linhas)
-Quantidade média de linhas que terá um desdobramento de Parcelamento típico (ex. 8 linhas)

Difícil também definir a quantidade mensal... mas os pacotes podem ser divididos em até 30 parcelas.

Eu tinha proposto da linha ficar vazia na filha, porque caso após feito o desdobramento, a mãe sofrer alguma alteração de valor em alguma das suas células, a filha não será atualizada. Com isso, o operador corre o risco de consultar aquela informação na linha filha e obter um dado inválido.

Podemos experimentar... desde que nas planilhas para onde as informações serão destinadas mães e filhas fiquem sempre juntas... como disse é só por uma questão de hábito meu... mas podemos experimentar sua sugestão.

Pra não ocorrer isso teríamos 2 alternativas:
- O operador terá que fazer a alteração nas linhas filhas também;
- A macro que Ordena e Acerta poderia verificar eventuais diferenças, e recopiar todos os dados que não batem, da mãe para as filhas, a cada vez que fosse executada. Mesmo assim, no intervalo entre a alteração na linha mãe, e a execução da
dos acertos, a informação estará divergente entre mãe e filhas.

Aqui talvez cairíamos em 2 situações... falta de praticidade no preenchimento da planilha e diminuição de performance... mas é só um palpite de um leigo... não sei.

Há outras: ela é importante também para economizar espaço de memória. Se você precisa guardar uma informação em uma variável, usando o DIM com declaração do tipo de variável, o Excel vai alocar a memória suficiente pra guardar aquilo. Um número grande ocupa varias vezes mais espaço do que um número de 1 dígito. Se você usa o DIM com declaração de tipo, economiza espaço. Para variáveis únicas da macro (ex.: ColReg, Lin, LFCR1, ErroABC), não vejo vantagem nisso. A economia é mínima perto do espaço que temos de memória. A necessidade começa quando falamos de matrizes. Se dimensionar uma matriz de 500.000 componentes, e disser que eles serão do tipo Double, ou se disser que serão do tipo String, ou se disser que serão do tipo Byte, haverá diferença, pois a redução de espaço individual será multiplicada por 500mil. Eu, particularmente, só declaro variáveis nessas condições, quando haverá significativo ganho de memória.

Vou pesquisar para entender melhor sobre isso.

Tem vezes que a declaração faz ocupar ainda mais memória. Em programação é comum ter que usar uma variável momentânea, que tem abrangência apenas dentro de um loop, por exemplo, apenas numa parte da macro. Eu costumo usar a variável Aux1 para isso (se forem mais, uso Aux2, Aux3, etc). São variáveis que ajudam só de forma localizada. Depois de usar, mais pra frente na macro, se tiver necessidade de outra variável local, uso Aux1 novamente, mas sua finalidade não tem nada a vez com a primeira utilização. Elas podem conter número, ou texto, ou operadores lógicos, sei lá. A situação é quem define. Se eu declarar Aux1 como Double, por exemplo, porque vou usá-la dessa forma, mais pra frente se precisar usar uma variável auxiliar novamente, para guardar texto, não poderei usar Aux1. Terei que declarar e usar outra variável. Se eu não declarar que Aux1 é de um determinado tipo (o Excel a considera Variant, que corresponde a "Coringa"), poso usar diversas vezes durante a macro.

Para aqueles que querem declarar pelo primeiro motivo (evitar erros de digitação) mas não pelo segundo, não querem ficar pensando no tipo de variável, quanto ocupa, etc (me refiro ás variáveis simples, de 1 ocorrência) eles podem declarar a variável, mas sem declarar o tipo. Ex.: DIM LFCR1, LFCR2, LFCR3, Flag, Auxiliar, Erro, Erro2.

Entendido.

OBS:
Como minha organização da tabela baseia-se nas colunas "Registro" e "Data" atualizei a Macro que ordena (a minha) e também a formatação condicional que utilizo nessas duas colunas para que vc veja o resultado atual que tenho atualmente (claro desconsiderando os desdobramentos... apenas para vc ver a ordem que preciso que os dados da tabela sejam apresentados).
Não alterei nenhuma das outras macros e nem funcionalidades.
Segue planilha anexa.

Obrigado pelas explanações, Jimmy
Apenas usuários registrados podem ver ou baixar anexos.
Avatar do usuário
Por Jimmy 14 Mai 2019 às 23:19
Membro 5 Estrelas
Mensagens: 601
Reputação: 380
#43870
Sandro,

Difícil de mensurar a quantidade mensal final... mas a possibilidade de no máximo 8 desdobramento de atendimento é suficiente.

Para estimar a quantidade final de registros no ano, infelizmente, temos que ter uma estimativa desse número.

Vamos para um exemplo de cálculo anual, usando não a média, mas o ponto médio.
Supondo que 50% (ponto médio) dos atendimentos gere Desdobramentos de Atendimento, e que cada desdobramento gere 4 linhas (ponto médio entre zero e 8). Para parcelamento seria 50%, e 15 linhas.

O total de linhas no ano seria:
3.600 + 3.600 x 0,5 x 4 + 3.600 x 0,5 x 15 = 3.600 + 7.200 + 27.000 = 37.800 linhas
Não sei se 50% é muito ou pouco, mas sem um número pra colocar na equação, não há resposta.

Aqui talvez cairíamos em 2 situações... falta de praticidade no preenchimento da planilha e diminuição de performance... mas é só um palpite de um leigo... não sei.

Sim, seu palpite está certo, mas só ocorrerá isso se for definido que a linha filha ficará cheia, com todas as colunas que a mãe tem. Se fosse pra escolher um desses, eu escolheria falta de performance, porque saberia que a planilha é lenta, mas segura, pois não dá pra confiar que o operador vai lembrar de alterar todas as filhas quando alterar a mãe. Na verdade a falta de performance só dá pra dizer se vai ou não haver, quando fizermos o teste. Sem testes, eu chutaria que para verificar a planilha com 10 mil linhas, 40 colunas, demoraria algo em torno de 4 segundos, mas é claro que depende da memória da máquina, processador, etc.

Façamos o seguinte. Primeiro definimos a quantidade de linhas máxima no ano, depois geramos uma massa de testes desse tamanho, com as linhas filhas com todas as colunas, medimos então o tempo de resposta, e se for satisfatório deixamos assim. Se não for, deixamos as linhas filhas com poucas colunas. Que tal?

Como minha organização da tabela baseia-se nas colunas "Registro" e "Data" atualizei a Macro que ordena (a minha) e também a formatação condicional que utilizo nessas duas colunas para que vc veja o resultado atual que tenho atualmente (claro desconsiderando os desdobramentos... apenas para vc ver a ordem que preciso que os dados da tabela sejam apresentados).

Sandro, quando eu mudei a rotina de classificação, eu não reparei que no final havia mais uma classificação por cores de fonte/célula, e, consequentemente, não a incorporei à minha versão da macro de classificação. Agora vejo porque a classificação que estava gerando não tinha o resultado que você esperava.

Não procurei entender as formatações condicionais, e nem a classificação sobre ela, pois isso pode ser um outro capítulo; apenas incorporei essa terceira classificação por cores (a primeira classifica por data para renumerar os registros, e a segunda por Registro decrescente) da forma como você vinha fazendo, e o resultado agora está igual ao da macro anterior. Vou apagar a macro de classificação antiga pra não gerar confusão, mas se for necessário a temos em versões anteriores da planilha.

Jimmy
Por SandroLima 15 Mai 2019 às 12:57
Membro 5 Estrelas
Mensagens: 553
Reputação: 9
#43875
Bom dia, Jimmy

Para estimar a quantidade final de registros no ano, infelizmente, temos que ter uma estimativa desse número.

Vamos para um exemplo de cálculo anual, usando não a média, mas o ponto médio.
Supondo que 50% (ponto médio) dos atendimentos gere Desdobramentos de Atendimento, e que cada desdobramento gere 4 linhas (ponto médio entre zero e 8). Para parcelamento seria 50%, e 15 linhas.

Compreendo.

O total de linhas no ano seria:
3.600 + 3.600 x 0,5 x 4 + 3.600 x 0,5 x 15 = 3.600 + 7.200 + 27.000 = 37.800 linhas
Não sei se 50% é muito ou pouco, mas sem um número pra colocar na equação, não há resposta.

Ainda não tinha feito a planilha dessa maneira... mas parece uma estimativa apropriada, Jimmy.
Calculo até que a quantidade de registros seja coerente com esse número mas os desdobramentos devem ser menores pois nem todos os parcelamentos chegam a esse número de parcelas (30), portanto acredito estarmos com folga nessa estimativa.

Façamos o seguinte. Primeiro definimos a quantidade de linhas máxima no ano, depois geramos uma massa de testes desse tamanho, com as linhas filhas com todas as colunas, medimos então o tempo de resposta, e se for satisfatório deixamos assim. Se não for, deixamos as linhas filhas com poucas colunas. Que tal?

De acordo.
A questão de linhas filhas "cheias" penso que seria importante, por exemplo, no caso da Plan "LIVRO-CAIXA" pq nela serão copiadas somente as linhas filhas/parcelas referente ao mês da tabela de destino e não o valor total do tratamento (no caso a linha mãe).

Sandro, quando eu mudei a rotina de classificação, eu não reparei que no final havia mais uma classificação por cores de fonte/célula, e, consequentemente, não a incorporei à minha versão da macro de classificação. Agora vejo porque a classificação que estava gerando não tinha o resultado que você esperava.

Não procurei entender as formatações condicionais, e nem a classificação sobre ela, pois isso pode ser um outro capítulo;

Claro, Jimmy.
Sem problemas... coloquei para que vc fosse analisando e entendendo como necessito.

apenas incorporei essa terceira classificação por cores (a primeira classifica por data para renumerar os registros, e a segunda por Registro decrescente) da forma como você vinha fazendo, e o resultado agora está igual ao da macro anterior. Vou apagar a macro de classificação antiga pra não gerar confusão, mas se for necessário a temos em versões anteriores da planilha.

Ok... vc me passa a macro para eu ver a alteração?
E a bola agora? Está com vc?
Aguardo o próximo capítulo??? Rsrs

Tenha um bom dia.
Avatar do usuário
Por Jimmy 15 Mai 2019 às 23:01
Membro 5 Estrelas
Mensagens: 601
Reputação: 380
#43896
Olá Sandro,

Ainda não tinha feito a planilha dessa maneira... mas parece uma estimativa apropriada, Jimmy.

Na verdade essa conta que fiz era um exemplo, e não uma estimativa. A minha conta deu quase 30 mil linhas, quando de início você falava algo entre 5 e 10 mil. Com 30 mil acredito que vamos ter problemas de performance. Há procedimentos no Excel que tem uma degradação da performance exponencial e não linear. Isso quer dizer que quando dobramos o tamanho, o tempo de processamento não necessariamente dobrará, mas pode quadriplicar... ou mais!!

Essa quantidade de linhas realmente me pegou de surpresa!

A questão de linhas filhas "cheias" penso que seria importante, por exemplo, no caso da Plan "LIVRO-CAIXA" pq nela serão copiadas somente as linhas filhas/parcelas referente ao mês da tabela de destino e não o valor total do tratamento (no caso a linha mãe).

Entendi seus motivos. Vamos fazer assim.

Ok... vc me passa a macro para eu ver a alteração?
E a bola agora? Está com vc?

A bola tá aqui comigo. Deixa eu fazer mais algumas coisas e te passo. Eu rodei a classificação já com a parte que classifica por cor de célula, e aconteceu algo desagradável. As linhas filhas e mães não ficaram juntas. Acredito que trabalhar com a linha mãe cheia vai resolver isso, pois uma vez que as colunas têm os mesmos dados, a cor das células mães e filhas serão a mesma. Não sei se isso vai funcionar para as lilhas de parcelamento, uma vez que as datas serão diferentes. Vamos ver.

Jimmy
Por SandroLima 16 Mai 2019 às 00:25
Membro 5 Estrelas
Mensagens: 553
Reputação: 9
#43897
Boa noite, Jimmy
Na verdade essa conta que fiz era um exemplo, e não uma estimativa. A minha conta deu quase 30 mil linhas, quando de início você falava algo entre 5 e 10 mil. Com 30 mil acredito que vamos ter problemas de performance.

Na verdade fui pela seu exemplo.
Não tenho uma estimativa estabelecida pq não usava os desdobramentos.
Sempre fazia manualmente... depois pensei naquela rotina de copiar apenas registros novos/ainda não copiados... mas realmente ficaria refém de possíveis erros.

Essa quantidade de linhas realmente me pegou de surpresa!

Puxa... já dei trabalho demais até aqui... não quero exagerar... podemos experimentar com menos e ver o resultado.

Entendi seus motivos. Vamos fazer assim.

:)

A bola tá aqui comigo. Deixa eu fazer mais algumas coisas e te passo. Eu rodei a classificação já com a parte que classifica por cor de célula, e aconteceu algo desagradável. As linhas filhas e mães não ficaram juntas. Acredito que trabalhar com a linha mãe cheia vai resolver isso, pois uma vez que as colunas têm os mesmos dados, a cor das células mães e filhas serão a mesma. Não sei se isso vai funcionar para as lilhas de parcelamento, uma vez que as datas serão diferentes. Vamos ver.

Então... mas penso que na Plan "ATIVIDADES DIARIAS" elas não vão ficar juntas mesmo e não vejo como um problema não... estou habituado a ver assim mesmo.
Até pq a formatação condicional das colunas [Data] e [Registro] é devido à "pendências" de outras colunas como por exemplo {Status Pgto].
Explico:
Em um dado tratamento de 10 parcelas, elas possuem a mesma data de registro, mas possuem datas de vencimento diferentes e só ficaram juntas no topo da tabela enquanto possuem o mesmo Status "Aguardando pagamento", por exemplo, que é uma das condições para a formatação condicional.
À medida que adquirem o Status "Pago" elas vão para a posição ordenada usual (por data na tabela) e desagrupam para reagrupar posteriormente quando adquirem o mesmo status ("pago") novamente.
O que podemos pensar é em fazer uma macro complementar apenas para reagrupar mães e filhas (independente da formatação condicional das colunas Registro e Data), quando necessário, para verificar qualquer erro ou dúvida do usuário.
Penso que isso não seria problema.
O problema que vejo agora é outro... à medida que dou baixa em uma parcela (status: pago) como ficaria a situação da linha mãe? Em que momento ela mudaria de Status já que nas linhas filhas essa alteração sera manualmente... como vou lembrar de depois de dar baixa em 10 parcelas alterar também o status da linha mãe... há menos que na macro considerasse isso quando a sub fosse P10/10 automaticamente ele alterasse o Status da linha mãe (não sei se é possível, estou apenas pensando em alternativas).
Mas enfim... o problema que vc apontou nesse parágrafo para mim talvez não atrapalhasse.
Acabei me alongando no discurso rssrs.

Fico na escuta... e só lembrando: a partir do dia 17 e até o dia 25 estarei um pouco ausente.

Grande abraço, Jimmy...
Avatar do usuário
Por Jimmy 16 Mai 2019 às 09:49
Membro 5 Estrelas
Mensagens: 601
Reputação: 380
#43899
Bom dia Sandro,

Não tenho uma estimativa estabelecida pq não usava os desdobramentos.
Sempre fazia manualmente... depois pensei naquela rotina de copiar apenas registros novos/ainda não copiados... mas realmente ficaria refém de possíveis erros.

E se você pegar a planilha da época que fazia manual, pegar um período de 3 meses, por exemplo, e contar quantas linhas normais tem, quantas de Atendimento, e quantas de Parcelamentos? Há possibilidade de fazer isso?

Puxa... já dei trabalho demais até aqui... não quero exagerar... podemos experimentar com menos e ver o resultado.

Não me referia ao trabalho, mas à performance. O problema que inserir uma linha numa tabela de 20 mil linhas é um processo lento, que pode levar alguns segundos, não muitos como 20, mas uns 5 segundos fácil. Por outro lado, certamente mais rápido e seguro do que fazer manualmente, como era feito.

Uma vez que a quantidade de linhas não pode ser mudado, pois depende dos atendimentos que fizer, etc, temos que começar a discutir o que seria um problema, em termos de tempo de resposta, entre clicar em INSERIR LINHA e ter a linha disponível para digitação. Cinco segundos é muito ou dá pra trabalhar?

Certa vez cogitei de fazer um arquivo morto, uma segunda tabela para onde aquilo que está encerrado (o registro como um todo, e não uma ou outra parcela de parcelamento) seja movido, saindo da tabela do dia-a-dia. Na hora de gerar Fluxo Financeiro, Livro Caixa, etc, as duas tabelas seriam lidas, a Viva e a Morta.

Então... mas penso que na Plan "ATIVIDADES DIARIAS" elas não vão ficar juntas mesmo e não vejo como um problema não... estou habituado a ver assim mesmo.

Não sabia disso, porque eu não havia percebido antes a classificação por cores. Tenho que mudar algumas coisas. Por exemplo, ao inserir desdobramento P em um registro que já tem o A (Sub = A-00), fiz a macro procurar o último A antes de inserir as linhas novas de P, para que fique a ordem: Linha mãe, A, e P. Como agora a família não ficará junta, passarei a incluir logo abaixo da mãe.

O problema que vejo agora é outro... à medida que dou baixa em uma parcela (status: pago) como ficaria a situação da linha mãe?

Via fórmula é um pouco complicado fazer, porque exigiria fórmula de uma linha que pega valores de outra. Acho que isso vai ter que ser feito de forma assíncrona, ou seja, quando a última parcela é paga, a linha mãe NÃO muda de status automaticamente, mas dependeria da execução de macro que passe um pente fino e mude as coisas. Essa macro já temos, e é acionada pelo botão ORDENA E ACERTA. Só que assim ela vai ficando cada vez mais pesada e demorada...

Até ontem, ao incluir Desdobramentos, a macro, no final, acionava a macro ORDENA E ACERTA por cautela. Ontem tirei isso porque com 20 mil linhas a necessidade de agilidade não permitirá execuções por cautela. Agora a macro apenas insere as linhas, numera as Subs, copia o conteúdo da mãe, etc, e encerra. A macro de inserção de linhas também aciona a macro ORDENA E ACERTA mas por outro motivo, para poder pegar o valor do maior registro. Vou mudar isso também para que a macro ORDENA E ACERTA não seja mais acionada na inserção de linhas. Deve ser acionada apenas pelo operador, quando ele achar que deve.

Fico na escuta... e só lembrando: a partir do dia 17 e até o dia 25 estarei um pouco ausente.

Sem possibilidade inclusive para tirar dúvidas?

Jimmy
Avatar do usuário
Por Jimmy 16 Mai 2019 às 09:56
Membro 5 Estrelas
Mensagens: 601
Reputação: 380
#43900
Esqueci de falar:

Após a cópia dos dados da mão pra filha A, eu estou apagando a coluna de Descrição, porque ela será diferente.

Após a cópia dos dados da mão pra filha P estou alterando a coluna Vlr Parcela (a principio o Vlr c/ desconto dividido pela quantidade de parcelas), e a coluna Competência.

O que mais deve ser feito nas linhas A e P?

Outra dúvida: porque há valores negativos e positivos na voluna Vlr c/ Desconto?
Por SandroLima 16 Mai 2019 às 11:45
Membro 5 Estrelas
Mensagens: 553
Reputação: 9
#43907
Bom dia, Jimmy.

E se você pegar a planilha da época que fazia manual, pegar um período de 3 meses, por exemplo, e contar quantas linhas normais tem, quantas de Atendimento, e quantas de Parcelamentos? Há possibilidade de fazer isso?

São poucos dados o que tenho... não muito longe disso que enviei para você. É bem recente essa rotina de planilhas no meu dia a dia.
Podemos trabalhar em cima dessa quantidade mesmo que enviei com uma pequena margem... Falamos em 5.000 a 10.000 linhas inicialmente.
Se estimarmos umas 12.000 linhas então (1.000 para cada mês)... não passei nunca disso... e para falar a verdade sempre muito abaixo (mas claro nunca fiz desdobramentos de atendimentos na mesma planilha)... acha que seria muito para a performance das macros?
Além do que há meses de pouca demanda como Dezembro e Janeiro... compensaria os meses de maior fluxo.
Não tenho uma estimativa real.

Uma vez que a quantidade de linhas não pode ser mudado, pois depende dos atendimentos que fizer, etc, temos que começar a discutir o que seria um problema, em termos de tempo de resposta, entre clicar em INSERIR LINHA e ter a linha disponível para digitação. Cinco segundos é muito ou dá pra trabalhar?

Acho bem razoável sim... mas vc acha que seria esse tempo apenas para inserir uma nova linha?
Penso que o tempo ficaria aumentado caso fossem realizados os desdobramento mas para inserir uma nova linha simples talvez não (olha o leigo aqui dando palpite de novo rsrs).

Certa vez cogitei de fazer um arquivo morto, uma segunda tabela para onde aquilo que está encerrado (o registro como um todo, e não uma ou outra parcela de parcelamento) seja movido, saindo da tabela do dia-a-dia. Na hora de gerar Fluxo Financeiro, Livro Caixa, etc, as duas tabelas seriam lidas, a Viva e a Morta.

Isso analisei e vejo como uma dificuldade para a rotina aqui... periodicamente é observado a necessidade de alguma alteração... um erro de cálculo, uma renegociação de pacote contratado, um cancelamento de pagamento, acréscimo de procedimentos etc.

Não sabia disso, porque eu não havia percebido antes a classificação por cores. Tenho que mudar algumas coisas. Por exemplo, ao inserir desdobramento P em um registro que já tem o A (Sub = A-00), fiz a macro procurar o último A antes de inserir as linhas novas de P, para que fique a ordem: Linha mãe, A, e P. Como agora a família não ficará junta, passarei a incluir logo abaixo da mãe.

Mas seria bom manter assim... até para verificação e alteração de algum campo no momento em que forem inseridos os desdobramentos. Tudo ordenado da maneira que vc colocou ficou bom... elas só sairiam desse agrupamento depois... caso alguma linha filha tivesse alguma das "pendências" da formatação condicional alterada (por exemplo, atingiu a data de vencimento ou adquiriu o status "pago")
Mas no momento de inserir o registro e fazer os desdobramentos penso que ficou muito bom a maneira que vc deixou.
Depois a macro que organiza a tabela se encarregaria de colocar cada linha em seu devido lugar na tabela conforme a existência de "pendências".

Via fórmula é um pouco complicado fazer, porque exigiria fórmula de uma linha que pega valores de outra. Acho que isso vai ter que ser feito de forma assíncrona, ou seja, quando a última parcela é paga, a linha mãe NÃO muda de status automaticamente, mas dependeria da execução de macro que passe um pente fino e mude as coisas.

Entendido.

Essa macro já temos, e é acionada pelo botão ORDENA E ACERTA. Só que assim ela vai ficando cada vez mais pesada e demorada...

Podemos pensar em separar as partes da macro na que ordena e a que atualiza... e pensar no momento oportuno que cada uma deveria ser executada... o que acha?
A que ordena penso que seria desejável sempre ao encerrar ou abrir a planilha (gosto mais ao encerrar) e a que atualiza pode ser via botão a a qualquer momento desejado algo assim... ou as duas ao encerrar e um botão para cada uma ser executada somente quando desejado... o que acha?

Até ontem, ao incluir Desdobramentos, a macro, no final, acionava a macro ORDENA E ACERTA por cautela. Ontem tirei isso porque com 20 mil linhas a necessidade de agilidade não permitirá execuções por cautela. Agora a macro apenas insere as linhas, numera as Subs, copia o conteúdo da mãe, etc, e encerra. A macro de inserção de linhas também aciona a macro ORDENA E ACERTA mas por outro motivo, para poder pegar o valor do maior registro. Vou mudar isso também para que a macro ORDENA E ACERTA não seja mais acionada na inserção de linhas. Deve ser acionada apenas pelo operador, quando ele achar que deve.

Excelente... respondi nesse sentido no parágrafo anterior sem ter lido isso.
Penso que dará certo assim.

Sem possibilidade inclusive para tirar dúvidas?

Não, não... posso sim.
Apenas não terei um computador e a planilha para realizar testes ou enviar algo caso vc necessite.
Mas o fórum posso responder pelo cel na boa.

Após a cópia dos dados da mão pra filha A, eu estou apagando a coluna de Descrição, porque ela será diferente.

Isso mesmo... e analisando aqui (pois isso é novo para mim) acho que a coluna [Valor} das linhas filhas A assim como nas linhas filhas P deve ter o cálculo do valor total dividido pela quantidade de procedimentos (aquela inputbox com o cálculo de que o valor está alterado que vc fez para os parcelamentos gostei muito).

Após a cópia dos dados da mão pra filha P estou alterando a coluna Vlr Parcela (a principio o Vlr c/ desconto dividido pela quantidade de parcelas), e a coluna Competência.

A coluna [Complemento] recebe a informação Compra / Venda Parcelada.
A coluna [Pgto / Vencimento] recebe a data acrescida de 1 mês para cada parcela consecutiva.
A coluna [Status Pgto] recebe o Status "Aguardando pagamento"
Posso enviar a macro de parcelamento para vc ver a rotina dela atualmente.

Outra dúvida: porque há valores negativos e positivos na voluna Vlr c/ Desconto?

Ah sim... somente altero o campo da coluna [Valor]... as outras colunas contábeis recebem valor com fórmula (que inclusive poderiam ser abreviadas...mas como sou um aprendiz e fui eu que fiz a fórmula ela ficou bastante extensa).
A coluna [Vlr c/ Desconto] recebe a seguinte fórmula:
Código: Selecionar todos=SEERRO(SE(E([@Fluxo]="ENTRADA";OU([@Desconto]=0;[@Desconto]="-";[@Desconto]=""));[@Valor];SE(E([@Fluxo]="ENTRADA";[@Desconto]<>0;[@Desconto]<>"-";[@Desconto]<>"");[@Valor]-([@Valor]*[@Desconto]);SE(E([@Fluxo]="SAÍDA";OU([@Desconto]=0;[@Desconto]="-";[@Desconto]=""));[@Valor]*(-1);SE(E([@Fluxo]="SAÍDA";[@Desconto]<>0;[@Desconto]<>"-";[@Desconto]<>"");([@Valor]-([@Valor]*[@Desconto]))*(-1)))));"-")

E a coluna [Vlr Parcela]:
Código: Selecionar todos=SEERRO(SE(E([@Fluxo]="SAÍDA"; OU([@Parcelas]="-";[@Parcelas]="";[@Parcelas]=0));[@Valor]*-1;SE(E([@Fluxo]="SAÍDA";E([@Parcelas]>0));([@Valor]/[@Parcelas])*-1;SE(E([@Fluxo]="ENTRADA"; OU([@Parcelas]="-";[@Parcelas]="";[@Parcelas]=0));[@Valor];[@Valor]/[@Parcelas])));"Erro")


Qualquer coisa é só chamar e obrigado de novo.
Avatar do usuário
Por Jimmy 16 Mai 2019 às 15:50
Membro 5 Estrelas
Mensagens: 601
Reputação: 380
#43919
Sandro,

Podemos pensar em separar as partes da macro na que ordena e a que atualiza... e pensar no momento oportuno que cada uma deveria ser executada... o que acha?

Acho uma boa ideia. Vamos, por enquanto, deixar como está. Depois de tudo pronto, dividimos.

Isso mesmo... e analisando aqui (pois isso é novo para mim) acho que a coluna [Valor} das linhas filhas A assim como nas linhas filhas P deve ter o cálculo do valor total dividido pela quantidade de procedimentos

Nas filhas P não estou alterando a col VALOR, nem a VLR C/ DESCONTO. Só altero a col VL PARCELA. Mas, abaixo, vc disse que VLR PARCELA vai uma fórmula. Fiquei confuso.

Se for isso mesmo, o que você acha de fazer igual nas filhas A. Afinal de contas, cada filha A é um atendimento que não deixa de ser uma PARCELA do atendimento todo.

(aquela inputbox com o cálculo de que o valor está alterado que vc fez para os parcelamentos gostei muito)

Não lembro de ter usado inputbox. Não seria msgbox, a mensagem que avisa que o total dos valores das parcelas não bate com o valor da linha mãe?

A coluna [Vlr c/ Desconto] recebe a seguinte fórmula:
CÓDIGO: SELECIONAR TODOS
=SEERRO(SE(E([@Fluxo]="ENTRADA";OU([@Desconto]=0;[@Desconto]="-";[@Desconto]=""));[@Valor];SE(E([@Fluxo]="ENTRADA";[@Desconto]<>0;[@Desconto]<>"-";[@Desconto]<>"");[@Valor]-([@Valor]*[@Desconto]);SE(E([@Fluxo]="SAÍDA";OU([@Desconto]=0;[@Desconto]="-";[@Desconto]=""));[@Valor]*(-1);SE(E([@Fluxo]="SAÍDA";[@Desconto]<>0;[@Desconto]<>"-";[@Desconto]<>"");([@Valor]-([@Valor]*[@Desconto]))*(-1)))));"-")

E a coluna [Vlr Parcela]:
CÓDIGO: SELECIONAR TODOS
=SEERRO(SE(E([@Fluxo]="SAÍDA"; OU([@Parcelas]="-";[@Parcelas]="";[@Parcelas]=0));[@Valor]*-1;SE(E([@Fluxo]="SAÍDA";E([@Parcelas]>0));([@Valor]/[@Parcelas])*-1;SE(E([@Fluxo]="ENTRADA"; OU([@Parcelas]="-";[@Parcelas]="";[@Parcelas]=0));[@Valor];[@Valor]/[@Parcelas])));"Erro")

Dei uma olhada por cima, e pode ser que dê pra reduzir a fórmula, mas pra isso eu te peço que me descreva o que quer que a fórmula faça.

Jimmy
Por SandroLima 16 Mai 2019 às 16:15
Membro 5 Estrelas
Mensagens: 553
Reputação: 9
#43921
Acho uma boa ideia. Vamos, por enquanto, deixar como está. Depois de tudo pronto, dividimos.

OK.

Nas filhas P não estou alterando a col VALOR, nem a Nas filhas P não estou alterando a col VALOR, nem a VLR C/ DESCONTO. Só altero a col VL PARCELA. Mas, abaixo, vc disse que VLR PARCELA vai uma fórmula. Fiquei confuso.. Mas, abaixo, vc disse que VLR PARCELA vai uma fórmula. Fiquei confuso.

Essa fórmula serve para distinguir valores de entrada e saída. Se a coluna [Fluxo} for "Entrada" recebe sinal positivo e se for [Saída}, sinal negativo.
A coluna [Valor] é neutra coloco o valor absoluto... de acordo com o fluxo (Entrada ou Saída) a Coluna [VLR C/ DESCONTO] e [VLR PARCELA] recebem o sinal positivo ou negativo... mas pode ser via macro.

Se for isso mesmo, o que você acha de fazer igual nas filhas A. Afinal de contas, cada filha A é um atendimento que não deixa de ser uma PARCELA do atendimento todo.

Exatamente.

Não lembro de ter usado inputbox. Não seria msgbox, a mensagem que avisa que o total dos valores das parcelas não bate com o valor da linha mãe?

Isso mesmo rsrs... me habituando ainda com as denominações. Mas achei fantástico isso.

Dei uma olhada por cima, e pode ser que dê pra reduzir a fórmula, mas pra isso eu te peço que me descreva o que quer que a fórmula faça.

Como falei serve apenas para atribui o sinal ao campo caso seja entrada ou saída e conforme a existência de parcelas... mas pode ser definido com a macro.

À disposição e obrigado pela atenção, Jimmy.
Avatar do usuário
Por Jimmy 17 Mai 2019 às 12:28
Membro 5 Estrelas
Mensagens: 601
Reputação: 380
#43936
Bom dia Sandro,

Essa fórmula serve para distinguir valores de entrada e saída. Se a coluna [Fluxo} for "Entrada" recebe sinal positivo e se for [Saída}, sinal negativo.
A coluna [Valor] é neutra coloco o valor absoluto... de acordo com o fluxo (Entrada ou Saída) a Coluna [VLR C/ DESCONTO] e [VLR PARCELA] recebem o sinal positivo ou negativo... mas pode ser via macro.

Entendi.
Sugiro então substituir a fórmula da coluna Vlr c/ Desconto
=SEERRO(SE(E([@Fluxo]="ENTRADA";OU([@Desconto]=0;[@Desconto]="-";[@Desconto]=""));[@Valor];SE(E([@Fluxo]="ENTRADA";[@Desconto]<>0;[@Desconto]<>"-";[@Desconto]<>"");[@Valor]-([@Valor]*[@Desconto]);SE(E([@Fluxo]="SAÍDA";OU([@Desconto]=0;[@Desconto]="-";[@Desconto]=""));[@Valor]*(-1);SE(E([@Fluxo]="SAÍDA";[@Desconto]<>0;[@Desconto]<>"-";[@Desconto]<>"");([@Valor]-([@Valor]*[@Desconto]))*(-1)))));"-")
por
=SEERRO( SE([@Fluxo]="ENTRADA";1;SE([@Fluxo]="SAÍDA";-1;"-")) * (1-SEERRO(--[@Desconto];0)) * SEERRO(--[@Valor];"-");"-")

Sugiro também substituir a fórmula da coluna Vlr Parcela
=SEERRO(SE(E([@Fluxo]="SAÍDA"; OU([@Parcelas]="-";[@Parcelas]="";[@Parcelas]=0));[@Valor]*-1;SE(E([@Fluxo]="SAÍDA";E([@Parcelas]>0));([@Valor]/[@Parcelas])*-1;SE(E([@Fluxo]="ENTRADA"; OU([@Parcelas]="-";[@Parcelas]="";[@Parcelas]=0));[@Valor];[@Valor]/[@Parcelas])));"Erro")
por
=SEERRO( SE([@Fluxo]="ENTRADA";1;SE([@Fluxo]="SAÍDA";-1;"-")) * SEERRO(--[@Valor];"-") / (1/SEERRO(1/[@Parcelas];1));"-")

Detalhe: A fórmula do valor com desconto, da forma que você fez, se baseia na coluna Valor, porém, caso você resolva dar Desconto E Parcelamento, a fórmula não vai funcionar, pois vai desconsiderar o desconto.
Acho, como leigo que não conhece sua negócio, que seria melhor a fórmula se basear na coluna Vlr c/ Desconto, pois funcionaria se houver apenas desconto, apenas parcelamento, e também se houver ambos.

Jimmy
Por SandroLima 17 Mai 2019 às 13:18
Membro 5 Estrelas
Mensagens: 553
Reputação: 9
#43941
Bom dia, Jimmy

Sugiro então substituir a fórmula da coluna Vlr c/ Desconto
=SEERRO(SE(E([@Fluxo]="ENTRADA";OU([@Desconto]=0;[@Desconto]="-";[@Desconto]=""));[@Valor];SE(E([@Fluxo]="ENTRADA";[@Desconto]<>0;[@Desconto]<>"-";[@Desconto]<>"");[@Valor]-([@Valor]*[@Desconto]);SE(E([@Fluxo]="SAÍDA";OU([@Desconto]=0;[@Desconto]="-";[@Desconto]=""));[@Valor]*(-1);SE(E([@Fluxo]="SAÍDA";[@Desconto]<>0;[@Desconto]<>"-";[@Desconto]<>"");([@Valor]-([@Valor]*[@Desconto]))*(-1)))));"-")
por
=SEERRO( SE([@Fluxo]="ENTRADA";1;SE([@Fluxo]="SAÍDA";-1;"-")) * (1-SEERRO(--[@Desconto];0)) * SEERRO(--[@Valor];"-");"-")

Sugiro também substituir a fórmula da coluna Vlr Parcela
=SEERRO(SE(E([@Fluxo]="SAÍDA"; OU([@Parcelas]="-";[@Parcelas]="";[@Parcelas]=0));[@Valor]*-1;SE(E([@Fluxo]="SAÍDA";E([@Parcelas]>0));([@Valor]/[@Parcelas])*-1;SE(E([@Fluxo]="ENTRADA"; OU([@Parcelas]="-";[@Parcelas]="";[@Parcelas]=0));[@Valor];[@Valor]/[@Parcelas])));"Erro")
por
=SEERRO( SE([@Fluxo]="ENTRADA";1;SE([@Fluxo]="SAÍDA";-1;"-")) * SEERRO(--[@Valor];"-") / (1/SEERRO(1/[@Parcelas];1));"-")

Entendido e implementado... bem menor a fórmula e o mesmo resultado. Valeu.

Detalhe: A fórmula do valor com desconto, da forma que você fez, se baseia na coluna Valor, porém, caso você resolva dar Desconto E Parcelamento, a fórmula não vai funcionar, pois vai desconsiderar o desconto.
Acho, como leigo que não conhece sua negócio, que seria melhor a fórmula se basear na coluna Vlr c/ Desconto, pois funcionaria se houver apenas desconto, apenas parcelamento, e também se houver ambos.

Vc fala a coluna [Vlr Parcela]??
Seria isso:
Código: Selecionar todos=SEERRO( SE([@Fluxo]="ENTRADA";1;SE([@Fluxo]="SAÍDA";-1;"-")) * SEERRO(--[@[Vlr c/ Desconto]];"-") / (1/SEERRO(1/[@Parcelas];1));"-")