Página 5 de 7

Re: Segregar dados em tabelas - Matriz VBA

Enviado: 29 Abr 2019 às 08:59
por SandroLima
Seria apenas numérica, 1, 2, 3... Usar letras dificulta um pouco a macro, porque números é só somar 1, mas letras não dá. A + 1 não é = B.
Ok... vamos ver como fica... curioso para isso.
Pensei apenas 1, 2, 3... porque na columa Registro das linhas filhas vai constar o mesmo registro da mãe.
Tudo bem... penso que atenderá muito bem assim.
Essa é a ideia que eu dei no post de 12:29h
;)
Você não comentou, achei que viu dificuldades. Vamos deixar as duas separadas mesmo pra ver se o resultado é bom.
Penso que pode ser bom... quanto menos colunas melhor... estou pensando em depois como capturar as linhas que tenham informação de código... hoje uso algo do tipo: < > "-"
Aliás, onde está a macro que monta a fórmula de Código? Dei uma olhada por cima nas macros mas não vi.
Não está na macro... obtenho através de fórmula na coluna "código" da tabela.
A fórmula descrevi no tópico #43537
Sim, eu coloquei desconsiderar kkk
Empolguei tanto que li rápido kkkkk.
Vamos medir pra quantificar o quento está deixando lenta. Lembra dos Debug.Print? Podem ser usados para isso.
Perfeito... ainda estou aprendendo a usar.
Ok, bola comigo.
Estou bem assessorado :)

Re: Segregar dados em tabelas - Matriz VBA

Enviado: 29 Abr 2019 às 10:49
por Jimmy
SandroLima escreveu:A fórmula descrevi no tópico #43537
Ok, mas como essa fórmula vai parar na célula?

Re: Segregar dados em tabelas - Matriz VBA

Enviado: 29 Abr 2019 às 16:30
por SandroLima
Opa, Jimmy.

Coloquei ela em toda a coluna "Código" da tabela.

A cada nova linha inserida a fórmula entra automaticamente.

Por isso o código de inserir linha fica lento. A cada nova linha inserida ele verifica em toda a tabela qual linha atendeu as condições da macro para transformar o código (fórmula) em texto.

Re: Segregar dados em tabelas - Matriz VBA

Enviado: 01 Mai 2019 às 19:14
por Jimmy
Olá Sandro,

Fiz muitas alterações na rotina de inserir linhas, e suas correlatas. Incluí um botão para executar a classificação, verificação de filhas ou mães órfãs, etc.

Por enquanto, a inserção de desdobramentos (filhas) está sendo manualmente; mais tarde automatizamos.
Coloquei apenas dois pra testes, e parece que está ok. Pra colocar as filhas basta abrir as linhas, copiar a linha mãe toda para as filhas, alterar a descrição. Depois rodar a macro do botão criado (igual ao de inserir linhas, mas não insere). As linhas filhas ficarão azuis sempre. Se houver algum erro, como por exemplo, um grupo de linhas com o mesmo Registro (o que indicaria uma família), com Sub numerado sequencialmente, porém nenhuma delas está identificada com Sub zero (não tem mãe), a macro vai fazer a linha ficar vermelha. É o caso do registro 513.

Depois temos que definir quais colunas as linhas filhas vão herdar das mães. Algumas são obrigatórias, como Registro, Sub, Mês e Ano. A Descrição será diferente nas filhas e mães. O valor depois iremos calcular.

Peço que faça testes naquilo que já estava funcionando, pra ver se continua.

Após os testes, e tendo a base necessária, a que foi criada hoje, podemos passar pra geração da planilha Atividades, e após isso, automatizar a inserção de linhas.

Fiz um teste com 10 mil linhas e a inserção de linhas demorou 1,2 seg. em média.

Jimmy

Re: Segregar dados em tabelas - Matriz VBA

Enviado: 02 Mai 2019 às 19:42
por SandroLima
Boa noite, Jimmy.

E obrigado pela atenção prestada novamente.
Fiz muitas alterações na rotina de inserir linhas, e suas correlatas. Incluí um botão para executar a classificação, verificação de filhas ou mães órfãs, etc.
Muitas novidades por aí :D :D ... vou testar com calma para entender o código.
Vi que vc recriou a macro que ordena/organiza a Plan ATIVIDADES DIARIAS.
Coloquei ela como é completa aqui para mim para vc avaliar (removi parte dela anteriormente por achar que vcnão faria uso e para diminuir a quantidade de informações) (coloquei a minha macro original novamente na planilha e identifiquei como "Ordena_AtivDiarias_2", para que vc possa comparar com a sua e ver se atrapalharia com a criação dos desdobramentos.
A macro utiliza de formatação condicional (cor da fonte e preenchimento) das colunas "Registro" e "Data" para ordenar a tabela de maneira que linhas onde a coluna "Status Pgto" (apenas um exemplo entre as outas condições de formatação existentes) conste como "Aguardamento Pagamento" fiquem sempre no topo da tabela. Devia ter deixado a macro completa desde o início mas como disse achei que seria excesso de informação já que não interferiria na rotina que estamos construindo.
Da forma como ela está precisei substituir a sua linha de código:
Código: Selecionar todos
.ListColumns("Registro").DataBodyRange.Cells(1, 1).Value = _
                .ListColumns("Registro").DataBodyRange.Cells(2, 1).Value + 1

pela minha anterior:
Código: Selecionar todos
.ListColumns("Registro").DataBodyRange.Cells(1, 1).Value = ULinha
As linhas filhas ficarão azuis sempre.
Será que a opção de numeração sequencial na coluna sub não seria suficiente para identificar as linhas filhas? Digo isso pq a tabela possui outros tipos de formatação condicional que se utilizam de cores de fonte e preenchimento. Gostei da ideia mas teríamos que pensar em outra maneira para identificar as linhas filha.
Se houver algum erro, como por exemplo, um grupo de linhas com o mesmo Registro (o que indicaria uma família), com Sub numerado sequencialmente, porém nenhuma delas está identificada com Sub zero (não tem mãe), a macro vai fazer a linha ficar vermelha. É o caso do registro 513.
Não entendi essa parte... Percebi que o registro 513 encontra-se em vermelho e também que não há uma linha mãe para esse registro(0)... Mas o que provocou o erro? Pq ficou assim? Haverá um tratamento de erro para que não ocorra ou corrigido manualmente?
Depois temos que definir quais colunas as linhas filhas vão herdar das mães.
Para facilitar o processo identifiquei todas as colunas da tabela Plan ATIVIDADES DIARIAS e marquei com um "X" acima das colunas cujo valor deve ser repetido paras as linhas-filha.

Segue planilha anexa com todas as colunas identificadas e aquelas que se repetiram para os desdobramentos marcadas com um "X" logo acima da coluna.
Também coloquei a macro completa da organização da tabela para que vc avalie ou junte com a que vc criou. As macros originais (minhas) estão logo abaixo das suas nas páginas do editor.

Re: Segregar dados em tabelas - Matriz VBA

Enviado: 02 Mai 2019 às 23:12
por Jimmy
SandroLima escreveu:Da forma como ela está precisei substituir a sua linha de código:
Código: Selecionar todos
.ListColumns("Registro").DataBodyRange.Cells(1, 1).Value = _
                .ListColumns("Registro").DataBodyRange.Cells(2, 1).Value + 1

pela minha anterior:
Código: Selecionar todos
.ListColumns("Registro").DataBodyRange.Cells(1, 1).Value = ULinha
Não vai funcionar assim porque ULinha não mais reflete o número do próximo registro vago. Suponha que tem 10 linhas, sendo 4 delas filhas (mesmo registro da mãe). Os registros vão de 1 a 6, e o novo registro deveria ser o 7. Se usar o ULinha, o novo registro será 11, porque foram processadas 10 linhas.

Você não contou o porque precisou voltar a instrução ao que era. Ela apenas determina o número de registro da nova linha!
As linhas filhas ficarão azuis sempre.
Podemos tirar isso, fácil, fácil. Na relação de mudanças após seu teste, não esqueça de colocar esta.
Não entendi essa parte... Percebi que o registro 513 encontra-se em vermelho e também que não há uma linha mãe para esse registro(0)... Mas o que provocou o erro? Pq ficou assim? Haverá um tratamento de erro para que não ocorra ou corrigido manualmente?
Isso só acontecerá se o operador errar, nunca no modo de utilização normal. Apenas simulei um erro do operador excluindo a linha mãe. Se isso acontecer, haverá mensagem de erro e a linha fica vermelha, não no ato da exclusão, mas na hora de rodar inclusão ou os acertos.

Se o operador apagar apenas o valor zero, permanecendo a linha mãe, a macro "concluirá" que a linha que não tem Sub, mas tem o mesmo registro de algumas linhas filhas, só pode ser mãe, e restaurará o zero. Entenda que essas condições não deveriam acontecer, mas se o operador errar, acontecerão.

Se o operador apagar o valor Sub de uma filha, ela será automaticamente renumerada, mas a ordem será perdida. Por exemplo, se há 3 filhas, e o operador apaga o valor Sub 2, permanecerá a mãe, a filha1, a filha 3 e a linha sem Sub por último (por força das regras de classificação-ordenamento). Apos rodar os acertos, a filha 1 continua 1, a 3 vira 2, e a vazia vira 3. As informações não se perdem, apenas a ordem. Se isso for um problema, conversaremos.
Para facilitar o processo identifiquei todas as colunas da tabela Plan ATIVIDADES DIARIAS e marquei com um "X" acima das colunas cujo valor deve ser repetido paras as linhas-filha.
ok
Também coloquei a macro completa da organização da tabela para que vc avalie ou junte com a que vc criou. As macros originais (minhas) estão logo abaixo das suas nas páginas do editor.
ok, olharei.

Eu gostaria de ir em frente apenas no seu sinal verde. Caso contrário corremos o risco de uma parte do trabalho ter que ser desfeito, assim como corremos o risco com a questão da classificação, onde me baseei na rotina incompleta. Espero que a rotina completa possa ser adaptada para a nova.

Termine seus testes e me passe seu parecer. Temos que definir oque fazer com a instrução que você teve que voltar ao que era, e finalizar a conversa sobre possíveis erros do operador. Esse último assunto pode ficar pra mais tarde, mas os demais não.

Jimmy

Re: Segregar dados em tabelas - Matriz VBA

Enviado: 03 Mai 2019 às 15:02
por SandroLima
Boa tarde, Jimmy
Você não contou o porque precisou voltar a instrução ao que era. Ela apenas determina o número de registro da nova linha!
Ah sim... pelo motivo de que a minha macro (a que ordena a tabela) leva as linhas com registros com formatação condicional de preenchimento amarelo ou vermelho (por exemplo com data da coluna "Pgto / Vencimento" perto da data atual e cujo Status de Pagamento seja ainda "Aguardando pagamento").
Mas penso que essa situação pode ser contornada mudando a fórmula da célula E13... podemos colocar uma fórmula que some a quantidade de registros e diminua o número de registros repetidos.
Por exemplo a fórmula matricial:
Código: Selecionar todos
{=SOMA(SEERRO(1/CONT.SE(TB_AtividadesDiarias[Registro];TB_AtividadesDiarias[Registro]);0))}
O valor do último registro inserido pode ser o resultado dessa fórmula acrescido de 1 (E13 + 1)... o que acha?
Podemos tirar isso, fácil, fácil. Na relação de mudanças após seu teste, não esqueça de colocar esta.
Acho que dá para manter isso também... basta alterar a macro que ordena a tabela... em vez de usar cores das células posso usar fórmulas dentro da macro.
Há menos que vc tenha imaginado outra maneira de identificar as linhas filha... a ideia de identificá-las achei interessante.
Se eu alterar a ordenação da tabela por fórmulas em vez de por cores há possibilidade de que as linhas filhas alterem a posição, digo, saiam do bloco "mãe e filhas" (ao reordenar a tabela a linha filha sairia da proximidade da sua linha mãe?)
Pensando nessa alteração há possibilidade de "travar as alterações de um bloco "mãe e filhas"? Por exemplo, ao alterar o Status da linha mãe para pago alterar automaticamente das linhas filhas?
Isso só acontecerá se o operador errar, nunca no modo de utilização normal. Apenas simulei um erro do operador excluindo a linha mãe. Se isso acontecer, haverá mensagem de erro e a linha fica vermelha, não no ato da exclusão, mas na hora de rodar inclusão ou os acertos.

Se o operador apagar apenas o valor zero, permanecendo a linha mãe, a macro "concluirá" que a linha que não tem Sub, mas tem o mesmo registro de algumas linhas filhas, só pode ser mãe, e restaurará o zero. Entenda que essas condições não deveriam acontecer, mas se o operador errar, acontecerão.

Se o operador apagar o valor Sub de uma filha, ela será automaticamente renumerada, mas a ordem será perdida. Por exemplo, se há 3 filhas, e o operador apaga o valor Sub 2, permanecerá a mãe, a filha1, a filha 3 e a linha sem Sub por último (por força das regras de classificação-ordenamento).
Seria perfeito assim.
Apos rodar os acertos, a filha 1 continua 1, a 3 vira 2, e a vazia vira 3. As informações não se perdem, apenas a ordem. Se isso for um problema, conversaremos.
Não vejo nenhum problema.
Temos que definir oque fazer com a instrução que você teve que voltar ao que era
Isso acho que é possível resolver da maneira como conversamos no começo do tópico. Um fórmula que conte os registros não duplicados.

Continuo fazendo testes, Jimmy. Mas preciso das suas orientações.

Re: Segregar dados em tabelas - Matriz VBA

Enviado: 03 Mai 2019 às 16:58
por Jimmy
SandroLima escreveu:Ah sim... pelo motivo de que a minha macro (a que ordena a tabela) leva as linhas com registros com formatação condicional de preenchimento amarelo ou vermelho (por exemplo com data da coluna "Pgto / Vencimento" perto da data atual e cujo Status de Pagamento seja ainda "Aguardando pagamento").
Não entendi o sentido do LEVA: "... leva as linhas com registros..."

Na substituição que fez, em vez de colocar na coluna Registro da nova linha, o número do registro seguinte, passou a colocar a quantidade de linhas + 1. Como isso afeta as formatações condicionais?

Com base na última planilha que você mandou, me oriente em como reproduzir o erro. Diga mais ou menos assim: "rodando com a linha que você fez, tal célula deveria estar de tal forma e não está, mas com a linha usando ULinha isso passa a acontecer.". Uma vez o erro reproduzido, fica mais fácil entender e arrumar.

Não tem fórmula na E13; tem na D13, que, aliás, pode ser alterada de
=SOMARPRODUTO((TB_AtividadesDiarias[Registro]<>"")*(TB_AtividadesDiarias[Registro]<>""))-SOMARPRODUTO((TB_AtividadesDiarias[Registro]="-")*(TB_AtividadesDiarias[Registro]="-"))
para
=SOMARPRODUTO(--(TB_AtividadesDiarias[Registro]<>""))-SOMARPRODUTO(--(TB_AtividadesDiarias[Registro]="-"))
Explico: a multiplicação dele por ele mesmo só serve pra transformar VERDADEIRO em 1, e FALSO em 0. Essa transformação acontece porque o Excel entende que se uma operação matemática está sendo feita com um operador lógico, significa que você está interessado no número (1 ou 0) e não nos operadores lógicos VERDADEIRO ou FALSO. É mais usual fazer essa transformação usando o "--" que significa "o negativo do negativo" que na prática não altera nada, mas o Excel entende como uma operação matemática, e transforma VERDADEIRO em 1, e FALSO em 0.
Mas penso que essa situação pode ser contornada mudando a fórmula da célula E13... podemos colocar uma fórmula que some a quantidade de registros e diminua o número de registros repetidos.

Por exemplo a fórmula matricial:
Código: Selecionar todos
{=SOMA(SEERRO(1/CONT.SE(TB_AtividadesDiarias[Registro];TB_AtividadesDiarias[Registro]);0))}
O valor do último registro inserido pode ser o resultado dessa fórmula acrescido de 1 (E13 + 1)... o que acha?
Não sei opinar sobre essa solução porque ainda não entendi o problema.
Acho que dá para manter isso também... basta alterar a macro que ordena a tabela... em vez de usar cores das células posso usar fórmulas dentro da macro.
Há menos que vc tenha imaginado outra maneira de identificar as linhas filha... a ideia de identificá-las achei interessante.
Se eu alterar a ordenação da tabela por fórmulas em vez de por cores há possibilidade de que as linhas filhas alterem a posição, digo, saiam do bloco "mãe e filhas" (ao reordenar a tabela a linha filha sairia da proximidade da sua linha mãe?)
Tenho dúvidas se entendi corretamente o que você quis dizer. Entendi que em vez da macro renumerar a coluna de Registros, poderia haver uma fórmula que fizesse com queos registros se renumerassem automaticamente. É isso?
Se for isso, não sei que fórmula seria, mas crio que não vale a pena. As linhas filhas azuis eu posso tirar a qualquer momento, ou podemos alterar o padrão da tabela.

Aliás, tô pra te dizer algo faz tempo e esqueço. A tabela zebrada serve pra ajudar a não perder uma linha de vista, quando você tem que deslocar a planilha para um lado ou outro. Se está seguindo uma linha azul, jamais vai perder a visão da linha que está seguindo, e passar a segui a de cima (ou a de baixo), porque ela é de outra cor. Sua vista, numa distração, pode até se perder e passar a seguir duas linhas acima (ou abaixo), pois essas são da mesma cor que a se segue. Esse é o objetivo do zebrado. É uma questão de gosto, mas eu prefiro tabela zebrada de 3 em 3 linhas, ou seja, 3 brancas, 3 azuis, 3 brancas, 3 azuis... a tabela fica mais leve, e mais difícil de perder a linha que está sendo seguida, quando desloca a tabela pra um lado ou outro. Digamos que está seguindo uma linha que é a linha de cima de uma faixa branca tripla. O cérebro guarda facilmente que você está seguindo a linha de cima. Se for a do meio ou a de baixo idem. E sendo grupo de 3 linhas, você dificilmente vai confundir o grupo que está seguindo com o grupo branco acima (ou abaixo) porque esse grupo está 6 linhas acima (ou abaixo). Vou te mandar a última planilha que você mandou, de volta com essa alteração pra você avaliar.
Pensando nessa alteração há possibilidade de "travar as alterações de um bloco "mãe e filhas"? Por exemplo, ao alterar o Status da linha mãe para pago alterar automaticamente das linhas filhas?
Sim, claro! As células marcadas com seu X, vão receber fórmulas pegando os dados da mãe, exceto a descrição, que será digitado para cada linha, e a coluna de valor, que será reavaliada a cada "acerto". A avaliação será assim: a macro ira separar os valores vindo de fórmulas (no início será o valor da linha mãe, dividido pela quantidade de filhas), dos valores digitados. Os digitados serão somados, vai ser calculado quanto falta pra chegar no valor total (da linha mãe) e esse restante será dividido pelas linhas que contém fórmula, via fórmula mesmo. Acho que as que estarão com fórmula devem ter uma cor diferente, ou algum meio de avisar ao operador de que aquele valor é automático, e provavelmente, não correto. A medida que ele for digitando os valores corretos, a quantidade de filhas, daquele bloco, com fórmulas vai diminuindo até acabar.
Seria perfeito assim.
Já está assim! Aliás, seria bom testar isso também. Veja que isso não torna o sistema infalível. Se o operador apagar o Sub de mais de 1 linha de uma mesma família, sei lá o que acontecerá. São algumas medidas apenas pra diminuir as chances de erro, mas não para tornar o erro impossível.

Isso acho que é possível resolver da maneira como conversamos no começo do tópico. Um fórmula que conte os registros não duplicados.
Então, essa contagem de registros não duplicados já existe. Quando a macro classifica as linhas pelo Registro, e ordem decrescente, o número do registro da primeira linha da tabela representa essa quantidade de registros não duplicados. Por isso é que mudei a linha:
.ListColumns("Registro").DataBodyRange.Cells(1, 1).Value = ULinha
para
.ListColumns("Registro").DataBodyRange.Cells(1, 1).Value = .ListColumns("Registro").DataBodyRange.Cells(2, 1).Value + 1
Usei Cells(2,1) (linha 2 da tabela) porque já havia sido inserida a linha nova, e assim, a quantidade de registros não repetidos passo para a linha 2.

Será que é possível que você esteja atribuindo a essa mudança, um problema que na verdade não tem relação com ela?

Jimmy

Re: Segregar dados em tabelas - Matriz VBA

Enviado: 03 Mai 2019 às 17:30
por SandroLima
Não entendi o sentido do LEVA: "... leva as linhas com registros..."
Desculpa por não completar a frase... falha técnica rsrs.
Seria:
"Ah sim... pelo motivo de que a minha macro (a que ordena a tabela) leva as linhas com registros com formatação condicional de preenchimento amarelo ou vermelho (por exemplo com data da coluna "Pgto / Vencimento" perto da data atual e cujo Status de Pagamento seja ainda "Aguardando pagamento") para o topo (início da tabela).
Dessa maneira nem sempre o próximo registro (da linha que vai ser inserida) vai receber o maior número de registro.
Na substituição que fez, em vez de colocar na coluna Registro da nova linha, o número do registro seguinte, passou a colocar a quantidade de linhas + 1. Como isso afeta as formatações condicionais?

Com base na última planilha que você mandou, me oriente em como reproduzir o erro. Diga mais ou menos assim: "rodando com a linha que você fez, tal célula deveria estar de tal forma e não está, mas com a linha usando ULinha isso passa a acontecer.". Uma vez o erro reproduzido, fica mais fácil entender e arrumar.
Havia esquecido de completar a frase anterior...
Não tem fórmula na E13; tem na D13
Isso... foi ela (D13) que eu quis apontar.
Não sei opinar sobre essa solução porque ainda não entendi o problema.
Eu tinha esquecido o final da frase kkkk.
Tudo apenas para inserir na linha do topo da tabela sempre o registro como o maior valor da coluna acrescido de 1.
Tenho dúvidas se entendi corretamente o que você quis dizer. Entendi que em vez da macro renumerar a coluna de Registros, poderia haver uma fórmula que fizesse com que os registros se renumerassem automaticamente. É isso?
Como falei anteriormente uso das cores de preenchimento da formatação condicional e a macro que ordena para levar os registros que receberam formatação condicional para o topo da tabela (seria o mesmo que levar os registro que possuem pendências para o topo da tabela). Explico:
Por exemplo registros cujo está faltando um CPF ou cujo Status do Recibo/NF seja "Aguardando emissão". Isso são consideradas pendências e a coluna "Registro" recebe o preenchimento amarelo para essas linhas e a macro que ordena a tabela "leva" essas linhas para o topo da tabela.
Mencionei que posso mudar a macro para que em vez de usar as cores das células das colunas "Registro" e "Data" para ordenar a tabela eu use condições na macro que não envolvam cores. Isso posso ajustar... só demoro um pouquinho pq o raciocínio para excel ainda engatinha aqui... mas sei que consigo.
E sendo grupo de 3 linhas, você dificilmente vai confundir o grupo que está seguindo com o grupo branco acima (ou abaixo) porque esse grupo está 6 linhas acima (ou abaixo). Vou te mandar a última planilha que você mandou, de volta com essa alteração pra você avaliar.
Não sabia disso... ainda não tinha percebido isso como uma dificuldade... mas posso experimentar.
Como reproduzo isso na minha planilhas, nas demais tabelas. Não achei essa formatação.
Sim, claro! As células marcadas com seu X, vão receber fórmulas pegando os dados da mãe, exceto a descrição, que será digitado para cada linha, e a coluna de valor, que será reavaliada a cada "acerto". A avaliação será assim: a macro ira separar os valores vindo de fórmulas (no início será o valor da linha mãe, dividido pela quantidade de filhas), dos valores digitados. Os digitados serão somados, vai ser calculado quanto falta pra chegar no valor total (da linha mãe) e esse restante será dividido pelas linhas que contém fórmula, via fórmula mesmo. Acho que as que estarão com fórmula devem ter uma cor diferente, ou algum meio de avisar ao operador de que aquele valor é automático, e provavelmente, não correto. A medida que ele for digitando os valores corretos, a quantidade de filhas, daquele bloco, com fórmulas vai diminuindo até acabar.
Parece ótimo... gostei.
Então, essa contagem de registros não duplicados já existe. Quando a macro classifica as linhas pelo Registro, e ordem decrescente, o número do registro da primeira linha da tabela representa essa quantidade de registros não duplicados. Por isso é que mudei a linha:
.ListColumns("Registro").DataBodyRange.Cells(1, 1).Value = ULinha
para
.ListColumns("Registro").DataBodyRange.Cells(1, 1).Value = .ListColumns("Registro").DataBodyRange.Cells(2, 1).Value + 1
Usei Cells(2,1) (linha 2 da tabela) porque já havia sido inserida a linha nova, e assim, a quantidade de registros não repetidos passo para a linha 2.
Quem mandou eu comer palavras naquela frase do início do tópico kkkkk.

Segregar dados em tabelas - Matriz VBA

Enviado: 03 Mai 2019 às 23:36
por Jimmy
Agora sim entendi!!!

Ok, teste alterando a linha para:
.ListColumns("Registro").DataBodyRange.Cells(1, 1).Value = application.WorksheetFunction.Max(T.ListColumns("Registro").DataBodyRange) +1

Ela pega o maior valor da coluna Registro da tabela, e soma 1. Assim, mesmo que essa linha de maior registro não seja a primeira, vai ser encontrada.

Acho que agora não temos mais pendências. Temos?

Creio que falta somente o resultado dos testes.

Jimmy

Re: Segregar dados em tabelas - Matriz VBA

Enviado: 04 Mai 2019 às 10:12
por SandroLima
Bom dia, Jimmy e todo o pessoal do fórum
Ok, teste alterando a linha para:
.ListColumns("Registro").DataBodyRange.Cells(1, 1).Value = application.WorksheetFunction.Max(T.ListColumns("Registro").DataBodyRange) +1
Ela pega o maior valor da coluna Registro da tabela, e soma 1. Assim, mesmo que essa linha de maior registro não seja a primeira, vai ser encontrada.
Pronto... resolvido. Pode ser assim.
Acho que agora não temos mais pendências. Temos?
Creio que não.
Creio que falta somente o resultado dos testes.
Fiz o teste inserindo manualmente a linha filha e tudo ok.
Nas outras macros fiz os testes e não vi nenhuma anormalidade, exceto pelo fato de ela trazer os valores de registros duplicados (linhas mães e filhas)... fato que vc mencionou que resolveríamos posteriormente retornando apenas os registros das linhas-mãe (exceto para a Plan "ATENDIMENTOS" que deverá retornar inclusive os desdobramentos), correto?

Segregar dados em tabelas - Matriz VBA

Enviado: 04 Mai 2019 às 23:37
por Jimmy
Olá Sandro,

Perfeito!! Bola comigo agora.

Segregar dados em tabelas - Matriz VBA

Enviado: 05 Mai 2019 às 17:57
por Jimmy
Sandro, me relembra uma coisa. Na planilha Atendimento são incluídas as linhas da Atividades que tendam quais critérios? Lembro que serão divididas por meses, que entram apenas as do ano escolhido, e que as filhas também vão. O que mais?

Re: Segregar dados em tabelas - Matriz VBA

Enviado: 05 Mai 2019 às 20:34
por SandroLima
Olá, Jimmy.
Sandro, me relembra uma coisa. Na planilha Atendimento são incluídas as linhas da Atividades que tendam quais critérios? Lembro que serão divididas por meses, que entram apenas as do ano escolhido, e que as filhas também vão. O que mais?
E cujo valor da coluna [Item] seja "Paciente".

Jimmy,
Fiz uma adequação de algumas condições de formatação condicional para minhas necessidades nas colunas [Registro] e {Data].
Gostaria que copiasse e colasse essa formatação na sua planilha para avaliar se vai interferir na organização da tabela após rodar a sua macro.
Também modifiquei (mas quase nada) a minha macro de ordenação da tabela (Sub Ordena_AtivDiarias_2) para utilizar somente as cores de preenchimento das colunas e não mais as cores da fonte. Verifique se atrapalha a sua macro.

Mais uma vez obrigado e boa noite.

Re: Segregar dados em tabelas - Matriz VBA

Enviado: 06 Mai 2019 às 17:56
por SandroLima
Boa tarde, Jimmy.

E desculpe o incômodo antecipado antes de finalizarmos mais essa etapa. Estou em constante teste aqui das macros e das situações que podem ocorrer no dia a dia.

Acaba de me ocorrer uma situação aqui e como ela ocorre dentro da Plan "ATIVIDADES DIARIAS" e vc já se encontra bem familiarizado com a planilha gostaria de uma opinião sua de como proceder.

Na mesma Planilha tenho uma macro que utilizo para fazer os registros em que há o parcelamento do valor total do tratamento.
A macro é semelhante à macro de inserir linha na tabela... e como agora temos a situação dos desdobramentos (linhas mães e filhas) fiquei pensando em como seria a melhor maneira de conciliar ou produzir uma associação das duas rotinas (PARCELAMENTO E DESDOBRAMENTO).

Imagine a seguinte situação;
Eis que é realizado um tratamento que foi composto por 3 tipos de atendimento diferentes e no valor total de R$ 3.000,00, por exemplo.
1º Atendimento - R$ 1.200,00
2º Atendimento - R$ 500,00
3º Atendimento - R$ 1.300,00
Isso, conforme estamos projetando, criaria uma linha mãe e 3 linhas filhas. Até aí tudo bem.

Porém, esqueci de considerar a situação em que o tratamento (o conjunto de 3 atendimentos do exemplo) foi contratado através do pagamento parcelados, por exemplo 20 parcelas iguais de R$ 150,00.

A minha macro de parcelamento, como mencionei anteriormente, ela atua semelhante a macro de inserir linha... insere a nova linha no topo da tabela (no caso exposto seriam 20 novas linhas), divide o valor total, pela quantidade de parcelas, em cada nova linha na coluna [Competência] insere o valor parcela 1 de 20, 2 de 20 e assim por diante... e nas demais colunas repete o valor da linha anterior (ou também linha mãe).

Como eu poderia conciliar essa situação de parcelamento com os desdobramentos?

A situação dos parcelamentos é extremamente válida permanecer pq cada parcela cairia em um mês simultâneo o que é de suma relevância distribuir no seu respectivo mês de recebimento no caso de uma planilha de Livro-caixa.

Para os casos das ocorrências de pagamento à vista não haveria nenhum problema... a rotina planejada é ótima... a ideia dos desdobramentos é incrível.
Teria algo em mente de como poderíamos conciliar/lidar com essa situação?

Se precisar da macro é só falar que envio para sua análise.

Segregar dados em tabelas - Matriz VBA

Enviado: 07 Mai 2019 às 09:22
por Jimmy
Bom dia Sandro,

Estou um pouco corrido nestes dias, mas não estamos parados; estou fazendo devagar, mas estou.

Alterar as duas planilhas ao mesmo tempo (a que está comigo e com você) pode dar confusão. Acho que o melhor seria você anotas as alterações que fez (condicionais, etc) e após eu terminar, quando eu te devolver a planilha, você aplica. Pode ser assim?

Quando aos pagamentos, a visão seria parecida com os desdobramentos de serviço, só que estes seriam desdobamentos de pagamento. Temos apenas que bolar uma forma de distinguir um do outro. Acho fundamental que os desdobramentos de pagamentos também contenham o mesmo Registro do atendimento que os gerou, assim como têm os desdobramentos de serviço. Uma ideia seria colocar na Sub, o número da parcela antecedida da letra "P" (de pagamento). Ex.: P1, P2,.... ou P01/20, P02/20... Teríamos que adequar algumas macros pois ter conteúdo na Sub não significaria necessariamente ser um desdobramento de serviço. Por outro lado a macro que trata os pagamentos só "olharia" para as linhas que contém Sub iniciando com "P".

Vamos amadurecendo a ideia.

Jimmy

Re: Segregar dados em tabelas - Matriz VBA

Enviado: 07 Mai 2019 às 10:49
por SandroLima
Bom dia, Jimmy.
Estou um pouco corrido nestes dias, mas não estamos parados; estou fazendo devagar, mas estou.
Sem pressa, Jimmy... no seu tempo.
Alterar as duas planilhas ao mesmo tempo (a que está comigo e com você) pode dar confusão. Acho que o melhor seria você anotas as alterações que fez (condicionais, etc) e após eu terminar, quando eu te devolver a planilha, você aplica. Pode ser assim?
Perfeitamente!
Quando aos pagamentos, a visão seria parecida com os desdobramentos de serviço, só que estes seriam desdobamentos de pagamento. Temos apenas que bolar uma forma de distinguir um do outro.
Entendo... e acho que ficaria bom.
Que tal P - 01/20, P - 02/20, P - 03/20 nos casos de pagamentos/parcelas e S - 01, S - 02, S - 03 no caso do desdobramento dos serviços?
Mas começo a me preocupar com a lentidão que isso pode gerar para a macro de organização/ordenação da tabela. Será que não!?
Acho fundamental que os desdobramentos de pagamentos também contenham o mesmo Registro do atendimento que os gerou
Até então minha macro de parcelamento gerava um número de registro para cada pagamento/parcela... mas penso que da maneira que falou seja mais coerente.
Teríamos que adequar algumas macros pois ter conteúdo na Sub não significaria necessariamente ser um desdobramento de serviço. Por outro lado a macro que trata os pagamentos só "olharia" para as linhas que contém Sub iniciando com "P".
Entendido.
Vamos amadurecendo a ideia.
Ok...

Muito obrigado novamente e tenha uma ótima semana.

Re: Segregar dados em tabelas - Matriz VBA

Enviado: 07 Mai 2019 às 20:37
por Jimmy
SandroLima escreveu:Mas começo a me preocupar com a lentidão que isso pode gerar para a macro de organização/ordenação da tabela. Será que não!?
Pode ser que sim, mas pra saber você teria que gerar uma massa de dados de teste, incluir diversos desdobramentos (na proporção que você julgue que se aproxime da realidade) e rodar pra ver quanto tempo demora.

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 sufuciente? Esses cuidados fazem a planilha emagrecer , e se tornar mais ágil.

Outra consideração, além do tempo de execução, é a frequência de execução. Uma macro que demora 30 segundos acho tolerável pra ser rodada 1 ou 2 vezes por dia, mas uma de 8 segundos que rode a cada 2 minutos é preocupante. Eu não creio que se ela vá demorar muito. Acho que o teto seria algo em torno de 15 segundos... isso sujeito a chuvas e trovoadas, porque estou falando sem ao menos saber a quantidade de desdobramentos médio de linhas por serviço, e nem para parcelamento.

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

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.
SandroLima escreveu:Muito obrigado novamente e tenha uma ótima semana.
Por nada!! Pra você também.

Jimmy

Re: Segregar dados em tabelas - Matriz VBA

Enviado: 07 Mai 2019 às 20:53
por Jimmy
SandroLima escreveu:E cujo valor da coluna [Item] seja "Paciente".
Esqueci de perguntar. Quais colunas devem ser copiadas? Registro, Sub, Valor, Código... alguma mais?

Re: Segregar dados em tabelas - Matriz VBA

Enviado: 07 Mai 2019 às 22:43
por SandroLima
Boa noite, Jimmy
Esqueci de perguntar. Quais colunas devem ser copiadas? Registro, Sub, Valor, Código... alguma mais?
Atualmente, vinha trazendo os registros através de fórmulas para cada tabela do mês respectivo, na Plan "ATENDIMENTOS" com a seguinte fórmula matricial:
Código: Selecionar todos
=SEERRO(ÍNDICE(TB_AtividadesDiarias[Registro];MENOR(SE(((TB_AtividadesDiarias[Item]="Paciente")*(TB_AtividadesDiarias[Status Pgto]="Pago")*(TB_AtividadesDiarias[Mês]=$V$8)*(TB_AtividadesDiarias[Ano]=AnoReferencia_ATD));LIN(TB_AtividadesDiarias[Registro])-LIN(TB_AtividadesDiarias[[#Cabeçalhos];[Registro]]));LINS($1:1)));"")
E a partir desse número de registro e fórmulas os dados das seguintes colunas:
- Registro
- Código
- Paciente
- CPF
- Data Nasc
- Idade
- Data Pgto (que se refere à coluna [Disponibilidade] da Plan "ATIVIDADES DIARIAS")
- Valor Pago (que se refere à coluna [Vlr Parcela] da Plan "ATIVIDADES DIARIAS")
- Intermediador
- Tarifas / Taxas
- Valor Final
- Recebimento (que deve ser desconsiderada ou excluída pois refere-se aos mesmo valores da coluna [Data Pgto]... farei a exclusão aqui na minha planilha) (ou melhor fazemos a substituição e o reordenamento das colunas já precisamos incluir a coluna Sub que eu ainda não tinha inserido nessa planilha)
- Competência
- Tipo de atendimento (essa não deve trazer nenhum valor da Plan "ATIVIDADES DIARIAS"... os valores dessa coluna são obtidos por fórmula)
Código: Selecionar todos
=SEERRO(ARRUMAR(ESQUERDA(SUBSTITUIR(ÍNDICE(TB_AtividadesDiarias[Descrição];CORRESP([@Registro];TB_AtividadesDiarias[Registro];0));" ";REPT(" ";100));200));"-")
- Responsável / Beneficiário
- CPF / CNPJ (Resp)
- Recibo / NF
- Data Registro (que se refere à coluna [Data] da Plan "ATIVIDADES DIARIAS")

É assim que eu faço atualmente... mas deixa de funcionar adequadamente nos casos em que é preciso fazer os desdobramentos para os procedimentos de um mesmo tratamento ou ocorrência.
Por isso que no início pensei na macro que trouxesse apenas "novos códigos" ou "códigos não repetidos" e os desdobramentos seriam feitos manualmente na Plan "ATENDIMENTOS".
E quando vc teve o "tino" que o certo seria fazer isso na Plan "ATIVIDADES DIARIAS" para manter um único Banco de Dados e principalmente quando afirmou que seria possível de se fazer assim aí pensei: "Eis a solução que eu preciso."

Mas voltando à pergunta inicial:
Acho que trazendo com a macro os dados da Coluna Sub e Código (que usados juntos serão únicos) acho que os demais campos posso continuar usando fórmulas para o retorno.
Não tenho noção ainda do que seria mais ágil...
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?