Página 4 de 7
Segregar dados em tabelas - Matriz VBA
Enviado: 24 Abr 2019 às 21:28
por Jimmy
Sandro, boa noite,
A próxima implementação acho que entendi,e parece fácil. Temos apenas que definir alguns critérios de comparação de textos, mas só vou iniciar quando você me mandar a planilha de volta, como combinamos pra evitar versões simultâneas.
Re: Segregar dados em tabelas - Matriz VBA
Enviado: 25 Abr 2019 às 17:19
por SandroLima
Boa tarde, Jimmy
Desculpe a demora... estou sem meu pc. Aguardando uma troca da fonte.
Acredito que a codificação para a Plan "LIVRO-CAIXA" está funcionando adequadamente. Acrescentei os critérios necessários.
Vamos adiante.
Segue a planilha com a estrutura atual.
Re: Segregar dados em tabelas - Matriz VBA
Enviado: 25 Abr 2019 às 21:40
por Jimmy
Olá Sandro,
Pronto, mas falta testar.
Você precisa revisar este IF, porque eu não sei se só as linhas PAGO são consideradas, ou se todas, ou se as linhas com tipo “-“ devem ser puladas, ou se a macro deve acusar erro.
Código: Selecionar todos If Dados(NumLinha, ColReg) <> "-" And Dados(NumLinha, ColReg) <> "" _
And (Dados(NumLinha, ColStatus) = "Pago" Or Dados(NumLinha, ColStatus) = "-") _
And Dados(NumLinha, ColDec) <> "-" _
And Dados(NumLinha, ColAno) + 0 = wshTipoDeclaracao.Range("AnoReferencia_TipoDeclaração").Value Then
A princípio, aponto erro quando o tipo não é nenhum dos 6, e também não é “-“. Você tem que avaliar se o critério é esse mesmo ou não.
Na comparação do Tipo eu usei o texto todo para comparar, assim, se na linha o tipo não for exatamente “Despesas com educação” vai dar erro, como por exemplo quando esquecerem de colocar a palavra “com”, ou se colocarem C em vez de Ç. Outra forma, mais flexível, é apenas procurar por uma palavra no texto. Por exemplo, se o texto digitado contiver a palavra “educação”, a macro já sabe em qual tabela lançar. Idem para “saúde”, “livro”, “outras”, “não-tributáveis”, e “classificadas”. Você tem que decidir se haverá ou não flexibilidade.
Avalie e dê retorno,
Jimmy
Re: Segregar dados em tabelas - Matriz VBA
Enviado: 26 Abr 2019 às 13:36
por SandroLima
Boa tarde, Jimmy.
Você precisa revisar este IF, porque eu não sei se só as linhas PAGO são consideradas, ou se todas, ou se as linhas com tipo “-“ devem ser puladas, ou se a macro deve acusar erro.
Código: Selecionar todosIf Dados(NumLinha, ColReg) <> "-" And Dados(NumLinha, ColReg) <> "" _
And (Dados(NumLinha, ColStatus) = "Pago" Or Dados(NumLinha, ColStatus) = "-") _
And Dados(NumLinha, ColDec) <> "-" _
And Dados(NumLinha, ColAno) + 0 = wshTipoDeclaracao.Range("AnoReferencia_TipoDeclaração").Value Then
Entendi o que vc falou.
Fiz o testes aqui... realmente não traz o esperado... era para retornar as linhas tanto com Status Pgto = "Pago" como com Status Pgto = "-" mas está trazendo somente as que possuem Status Pgto = "Pago".
Não sei como permitir as duas condições da mesma coluna.
Na comparação do Tipo eu usei o texto todo para comparar, assim, se na linha o tipo não for exatamente “Despesas com educação” vai dar erro, como por exemplo quando esquecerem de colocar a palavra “com”, ou se colocarem C em vez de Ç. Outra forma, mais flexível, é apenas procurar por uma palavra no texto. Por exemplo, se o texto digitado contiver a palavra “educação”, a macro já sabe em qual tabela lançar. Idem para “saúde”, “livro”, “outras”, “não-tributáveis”, e “classificadas”. Você tem que decidir se haverá ou não flexibilidade.
Não... o texto deve ser exato... da maneira como vc fez mesmo... ficou ótimo.
Os valores dessa coluna são retornados por fórmula e não digitados portanto serão exatos... Está excelente assim.
Achei ótimo o tratamento do erro onde continua a rotina e aponta as linhas para verificação. Não funcionou na minha planilha que está alimentada com as informações mas na que te enviei e que tem a mesma estrutura funcionou perfeitamente (vou verificar o motivo).
Fantástica a ideia... vou tentar usar em outras rotinas que possuo.
A macro atende perfeitamente... só tenho que ver a questão do bloco IF acima... não sei como permitir duas condições de uma mesma coluna.
Jimmy, mais uma vez obrigado... aguardamos a questão do bloco "IF" ou partimos para a próxima (e última) atividade?
Re: Segregar dados em tabelas - Matriz VBA
Enviado: 26 Abr 2019 às 19:01
por Jimmy
Oi Sandro,
SandroLima escreveu:Fiz o testes aqui... realmente não traz o esperado... era para retornar as linhas tanto com Status Pgto = "Pago" como com Status Pgto = "-" mas está trazendo somente as que possuem Status Pgto = "Pago".
Não sei como permitir as duas condições da mesma coluna.
Não vi esse erro ocorrer! O registro 119 é uma linha que tem status "-" e que vai parar na tabela de Livro-Caixa da planilha Tipo de Declaração. Eu filtrei os dados na planilha Atividades Diárias, segundo os mesmos critérios do IF, e resultou em 469 linhas que se encaixam. Depois rodei a macro e foram inseridas, no total, 469 nas tabelas da planilha Tipo de Declaração.
Tente me apontar qual linha, de qual código, que deveria estar nessas tabelas, e que a macro não coloca, ou as que não deveriam estar, mas estão nas tabelas. Assim fica mais fácil rastrear o bandido.
... não sei como permitir duas condições de uma mesma coluna.
If Dados(NumLinha, ColReg) <> "-" And Dados(NumLinha, ColReg) <> "" _
And (Dados(NumLinha, ColStatus) = "Pago" Or Dados(NumLinha, ColStatus) = "-") _
And Dados(NumLinha, ColDec) <> "-" _
And Dados(NumLinha, ColAno) + 0 = wshTipoDeclaracao.Range("AnoReferencia_TipoDeclaração").Value Then
O IF acima foi copiado da última versão da macro. As linhas verde e vermelha tratam de duas condições para a mesma coluna. A forma está correta.
Na verde essas duas condições são excludentes (tudo o que não seja "-"
e não seja "", tá valendo).
Na vermelha é includente, ou seja, só deixa passar os que forem "Pagos"
ou "-".
Primeiro vamos ter certeza de que há um erro, identificando a linha que apresenta anomalia. Depois rastreamos o erro e corrigimos.
... aguardamos a questão do bloco "IF" ou partimos para a próxima (e última) atividade?
Até faltando muito pouco pra encerrar essa etapa, se é que há mesmo erro. Proponho terminar pra iniciar a última etapa.
Jimmy
Re: Segregar dados em tabelas - Matriz VBA
Enviado: 26 Abr 2019 às 21:19
por SandroLima
Boa noite, Jimmy.
Obrigado pelo retorno e desculpe mas foi falha minha.
Primeiro vamos ter certeza de que há um erro, identificando a linha que apresenta anomalia. Depois rastreamos o erro e corrigimos.
Estava conferido com uma CONT.SES
Código: Selecionar todos=CONT.SES(TB_AtividadesDiarias[Status Pgto];"Pago";;TB_AtividadesDiarias[Ano];AnoReferencia_TipoDeclaração)
e esqueci da segunda parte da fórmula:
Código: Selecionar todos=CONT.SES(TB_AtividadesDiarias[Status Pgto];"Pago";TB_AtividadesDiarias[Ano];AnoReferencia_TipoDeclaração)+CONT.SES(TB_AtividadesDiarias[Status Pgto];"-";TB_AtividadesDiarias[Ano];AnoReferencia_TipoDeclaração)
Funcionando corretamente sim.
Também consegui simular o seu tratamento de erro. Na minha não acontecia pq tenho uma validação de dados na coluna "Tipo de Declaração" que não permite entrar opção diferente das tabelas... removi e simulei o erro.
Muito bacana.
Segregar dados em tabelas - Matriz VBA
Enviado: 27 Abr 2019 às 09:48
por Jimmy
Ótimo!!
Como tem validação na coluna, acha que devemos tirar o tratamento de erro? Eu opinaria que não, porque não custa nada deixa-lo, e sabe-se lá que mágicas o operador pode fazer e inserir dados errados... É como a válvula de segurança da panela de pressão: esperamos que nunca seja usada, mas a mantemos funcionando.
Vamos pra próxima fase.
Me passe maiores detalhes porque não entendi a sua mensagem
http://gurudoexcel.com/forum/viewtopic. ... 278#p43278.
Fiquei com dúvida sobre as inserções manuais, sobre os procedimentos agregados...
Jimmy
Re: Segregar dados em tabelas - Matriz VBA
Enviado: 27 Abr 2019 às 12:10
por SandroLima
Bom dia, Jimmy.
Eu opinaria que não, porque não custa nada deixa-lo, e sabe-se lá que mágicas o operador pode fazer e inserir dados errados... É como a válvula de segurança da panela de pressão: esperamos que nunca seja usada, mas a mantemos funcionando.
Kkkk... completamente de acordo.
Mas vamos lá...
Para a Planilha "ATENDIMENTOS" preciso de uma rotina um pouco diferente mas que acho que podemos aproveitar muito dos códigos anteriores.
Acho que para o que necessito a melhor opção nesse caso seria um botão de atualizar.
Pq o botão atualizar e não o evento change como nas situações anteriores?
Pq gostaria de que o código verificasse os códigos já copiados e trouxesse somente códigos novos/ainda não copiados da coluna "CÓDIGO" da Plan "ATIVIDADES DIARIAS" e da mesma forma separando em tabelas de MESES.
Os códigos da Planilha "ATIVIDADES DIARIAS" são únicos (não se repetem).
Nela o que preciso é que ao acionar a macro ela copie somente as linhas que possuem um "CÓDIGO" de letras e números existente na coluna "Código" da Planilha "Atividades Diárias" descartando os que tiverem o "-" como retorno.
Preciso que ele verifique somente os códigos ainda não copiados e copie somente os novos pois há a possibilidade de que uma vez copiados sejam acrescentadas linhas na Planilha "ATENDIMENTOS" para um determinado código já copiado de forma manual...
(
Lá vou eu bolando a implementação futura do código rsrs... mas isso posso tentar fazer mais para frente com sua ajuda se ainda estiver disposto a encarar o desafio)
Explico:
Existem situações em que um código foi copiado da Plan "ATIVIDADES DIARIAS" para a Plan "ATENDIMENTOS"... até aí tudo bem... as rotinas anteriormente resolveriam o problema mudando apenas os critérios para a seleção das linhas copiadas.
Porém, para um determinado código, por exemplo "03 - A06.0902.S18" ele tem como o valor pago R$ 2318,67 (Coluna Vlr Parcela da Plan "ATIVIDADES DIARIAS" que corresponde à Coluna Vlr Pago da Plan "ATENDIMENTOS" )
Na Plan "ATENDIMENTOS" pretendo discriminar os produtos ou serviços que compõem esse Código.
Explico melhor:
Suponha que esse código usado como exemplo acima no valor de R$ 2318,67 seja referente a realização de 3 procedimentos em um mesmo paciente.
A rotina verifica se o código já foi copiado anteriormente (ou se já existe na Plan "ATENDIMENTOS") e se não existir ela copia... se existir não faz nada e continua a verificação.
Depois com outro código (no caso, um botão de "Discriminar Código") pretendo através de uma Inputbox informar o Código a ser discriminado na Plan "ATENDIMENTOS" e uma segunda inputbox informar a quantidade de procedimentos para esse código.
A partir da quantidade de procedimentos informados pela segunda InputBox inserir a quantidade de linhas adicionais logo abaixo da linha desse código repetindo todas as informações da linha do código informado nas linhas adicionadas, porém dividindo o valor inicial pela quantidade de linhas do código informado.
PS: As duas Inputbox poderiam ser substituídas por um formulário com duas Combobox... a primeira onde o código é informado e a segunda com a quantidade de procedimentos que compõem o código.
Supondo que sejam 3 procedimentos que compõem ele deve gerar mais duas linhas adicionais repetindo as informações da linha do Código informado e dividir o valor de R$ 2318,67 por 3 e inserir no campo "Valor Pago" (os procedimentos não necessariamente tem o mesmo valor mas isso terá que ser corrigido manualmente, seria ótimo se ele mantivesse a informação do valor total e fosse diminuindo das demais "parcelas" a medida que fosse "corrigindo" o valor de cada procedimento.
Suponha que o primeiro procedimento desse código tenha sido 1000,00... ele deveria dividir o saldo restante (R$ 1318,67) pelos 2 procedimentos restantes e supondo que o 2º procedimento tenha sido de R$ 418,67... sobraria o valor final para o último procedimento no valor de R$ 900,00.
Mas isso complicaria demais o código eu sei... mas sonhar não custa né rsrs.
Enfim... seria essa a intenção... mas podemos ficar na etapa inicial da rotina... e eu vou me virando com a inserção manual das linhas adicionais.
Vou anexar novamente a planilha. Acrescentei os valores das colunas "Vlr Parcela" da Plan "ATIVIDADES DIARIAS" e identifiquei a coluna "Vlr Pago" da Plan "ATENDIMENTOS" para onde esses valores devem ser copiados. O resto continua o mesmo.
Segregar dados em tabelas - Matriz VBA
Enviado: 27 Abr 2019 às 18:23
por Jimmy
Sandro,
Já comecei, e já vou tirando dúvidas.
Você falou que o código nunca se repete na planilha ATIVIDADES DIARIAS. Pelo que eu entendi, o número de registro também não. Uma vez a linha lida, na hora de verificar se já foi copiada anteriormente para a planilha de ATENDIMENTOS, você acha mais conveniente procurar pelo número do registro ou pelo código? Ou quem sabe ambos: se achar o mesmo registro E mesmo código, desconsidera a linha. Se achar o mesmo registro, porém com código diferente, dá mensagem de inconsistência (ou vice-versa).
A possibilidade inconveniente que vejo, é se o operador lançar o código errado e só perceber após rodar a macro. Ai ele corrige o código, e roda novamente...
Oriente sobre essa questão.
Jimmy
Segregar dados em tabelas - Matriz VBA
Enviado: 27 Abr 2019 às 18:54
por Jimmy
Esse procedimento de ter uma base de dados que alimenta outra ok, mas se essa outra também assume o papel de base de dados com lançamento de novas informações, as chances de ter confusão são grandes.
Você já pensou na possibilidade de fazer o desdobramento dos lançamentos (no caso, os 3 atendimentos e seus valores e descrições) na própria tabela de ATIVIDADES DIARIAS? Essa tabela poderia ter uma coluna com número sequencia partindo de zero, onde zero é a linha principal, que contém todas as informações que hoje estão contempladas. A linha com valor 1 nessa nova coluna indicaria um desdobramento da linha zero, onde constaria o primeiro procesimento, e seu valor. A linha com valor 2 traria dados do segundo procedimento, e seu valor, e assim por diante.
Os procedimentos anteriores (FF e LC) podem filtrar as linhas desconsiderando todas as que tenham essa coluna diferente de zero. Assim, o resultado final seria o mesmo que já temos. A macro de Atendimento é que usaria essas linhas. Dessa forma, a fonte de informações é uma só. Quando há duas, há necessidade de pensar bem nas implicações pois é muito fácil que fiquem dessincronizadas e inconsistentes.
O procedimento de atendimentos pode até continuar de modo cumulativo, sempre acrescentando, mas a qualquer momento você sabe que se quiser jogar todos os dados de atendimento fora, e carrega-los tudo de novo a partir das ATIVIDADES DIÁRIAS, você pode fazer, pode ser que demore um pouco mais, mas pode ser feito.
Vou dar uma parada no desenvolvimento até definirmos isso, porque o caminho que estamos tomando estou achando que tem muitas curvas... sem guard rail.
Jimmy
Re: Segregar dados em tabelas - Matriz VBA
Enviado: 27 Abr 2019 às 19:49
por SandroLima
Esse procedimento de ter uma base de dados que alimenta outra ok, mas se essa outra também assume o papel de base de dados com lançamento de novas informações, as chances de ter confusão são grandes.
Pensando bem vc tem toda razão... como disse as ideias vão surgindo e nem sempre são as melhores alternativas.
Você já pensou na possibilidade de fazer o desdobramento dos lançamentos (no caso, os 3 atendimentos e seus valores e descrições) na própria tabela de ATIVIDADES DIARIAS? Essa tabela poderia ter uma coluna com número sequencia partindo de zero, onde zero é a linha principal, que contém todas as informações que hoje estão contempladas. A linha com valor 1 nessa nova coluna indicaria um desdobramento da linha zero, onde constaria o primeiro procedimento, e seu valor. A linha com valor 2 traria dados do segundo procedimento, e seu valor, e assim por diante.
Gostei bastante da ideia... estou tentando imaginar o funcionamento e me parece uma boa alternativa.
Mas então imagino também que cada linha com o desdobramento das descrições receberia um número na coluna registro e eu perderia minha sequência de "registros reais", sem os desdobramentos.
Apesar disso acho que não haveria tanto problema... podemos experimentar.
Também não sei como isso interferiria na macro que insere linha e com a qual vou alimentando a base de dados.
Vou colocar a macro na planilha para que vc possa avaliar o uso da macro que utilizo caso ela venha a interferir com a sua ideia .
Segue a planilha anexa e a macro no botão "Inserir Nova Linha" da Plan "ATIVIDADES DIARIAS"
E mais uma vez obrigado, Jimmy... tem me mostrado a cada dia novos horizontes no Excel... Sem palavras para agradecer.
Re: Segregar dados em tabelas - Matriz VBA
Enviado: 27 Abr 2019 às 20:53
por Jimmy
Olhei e estranhei o fato da coluna REGISTRO ser destruída e refeita a cada inclusão de linha. Normalmente, quando um evento (um atendimento, por exemplo) ganha um número de registro, esse número nunca mais vai mudar. Acompanhará esse mesmo evento até o final dos tempos.
Se uma linha da planilha de atividades for excluída, digamos a de registro 100, após inserir uma nova linha, a de registro 101 passará a ser 100, a 102 passará a 101, etc... todos, dali pra frente, mudarão de registro. Isso não é usual, e atrapalha um pouco a ideia de fazer o desdobramento nessa própria planilha. Se o registro passar a não ser refeito, dá pra incluir nova linha da mesma forma, bastando ver qual é o maior registro, e somar 1 para obter o registro da nova linha.
A ideia não era as linhas filhas do desdobramento ter registros diferentes. A ideia era terem o mesmo registro, mas um diferencial na coluna nova que propus. A de valor zero seria a linha mãe, e as filhas (procedimentos), com o mesmo registro, teriam os números 1, 2, 3, ...
Outro assunto, dentro da inclusão de linhas.
Não entendi a finalidade das linhas abaixo:
With Tabela_AtvDiarias
For Lin = 1 To ULinha
If .ListColumns("Item").DataBodyRange.Cells(Lin, 1).Value = "Paciente" And _
.ListColumns("Código").DataBodyRange.Cells(Lin, 1).Value <> "-" And _
.ListColumns("Código").DataBodyRange.Cells(Lin, 1).Value <> "" Then
With .ListColumns("Código").DataBodyRange.Cells(Lin, 1)
.Value2 = .Value2
End With
End If
Next Lin
End With
Parece que ela transforma em texto, o resultado de uma fórmula que haveria na geração do código, mas não vi nenhum código sendo gerado por fórmula. Ele é? Só pra saber, porque isso não atrapalha em nada.
Jimmy
Re: Segregar dados em tabelas - Matriz VBA
Enviado: 27 Abr 2019 às 22:20
por SandroLima
Olhei e estranhei o fato da coluna REGISTRO ser destruída e refeita a cada inclusão de linha. Normalmente, quando um evento (um atendimento, por exemplo) ganha um número de registro, esse número nunca mais vai mudar. Acompanhará esse mesmo evento até o final dos tempos.
Entendo, Jimmy... utilizo assim para manter a sequência de registros sem a ausência de nenhum número em sequência ... mesmo que alguma linha seja excluída.
Preferiria que pudesse ficar assim... se possível.
Se o registro passar a não ser refeito, dá pra incluir nova linha da mesma forma, bastando ver qual é o maior registro, e somar 1 para obter o registro da nova linha.
Isso eu consigo fazer também... apenas deixei assim por uma questão de gosto mesmo.
Aqui na planilha de trabalho, apenas para exemplificar pq mantenho assim, se um registro ultrapassou a data de vencimento ele saí da sequencia de ordenamento (mantendo a numeração) e vai para o topo da tabela assumindo formatação condicional com o preenchimento vermelho.
Ao ser regularizado o pagamento ele volta a condição normal de formatação e volta para a posição (sequência na tabela).
Preferiria manter assim... mas se não tiver como...
A ideia não era as linhas filhas do desdobramento ter registros diferentes. A ideia era terem o mesmo registro, mas um diferencial na coluna nova que propus. A de valor zero seria a linha mãe, e as filhas (procedimentos), com o mesmo registro, teriam os números 1, 2, 3, ...
Entendi isso e achei o máximo.
Não entendi a finalidade das linhas abaixo:
With Tabela_AtvDiarias
For Lin = 1 To ULinha
If .ListColumns("Item").DataBodyRange.Cells(Lin, 1).Value = "Paciente" And _
.ListColumns("Código").DataBodyRange.Cells(Lin, 1).Value <> "-" And _
.ListColumns("Código").DataBodyRange.Cells(Lin, 1).Value <> "" Then
With .ListColumns("Código").DataBodyRange.Cells(Lin, 1)
.Value2 = .Value2
End With
End If
Next Lin
End With
Parece que ela transforma em texto, o resultado de uma fórmula que haveria na geração do código, mas não vi nenhum código sendo gerado por fórmula. Ele é? Só pra saber, porque isso não atrapalha em nada.
Exatamente! Queria eu ter aptidão para interpretar códigos assim mesmo desconhecendo toda a plailha.
Lembra quando falei que os códigos para os pacientes são únicos??
Se a linha atende todos os critérios do código acima a macro "fixa" o código do paciente/atendimento.
Você falou que o código nunca se repete na planilha ATIVIDADES DIARIAS. Pelo que eu entendi, o número de registro também não. Uma vez a linha lida, na hora de verificar se já foi copiada anteriormente para a planilha de ATENDIMENTOS, você acha mais conveniente procurar pelo número do registro ou pelo código? Ou quem sabe ambos: se achar o mesmo registro E mesmo código, desconsidera a linha. Se achar o mesmo registro, porém com código diferente, dá mensagem de inconsistência (ou vice-versa).
Agora que li essa mensagem... como esclarecido agora com a maro e com a resposta acima:
Sim... o registro ele pode variar (Lembra que durante a confecção das macros anteriores sempre apagamos a tabela de destino e copiamos novamente os dados???)
O código é obtido por fórmula da tabela.
Estou à disposição, Jimmy... se achar que não tem jeito mesmo da maneira como está tenho que ser maleável e aceitar a alternativa proposta.
Novamente obrigado.
Segregar dados em tabelas - Matriz VBA
Enviado: 28 Abr 2019 às 08:14
por Jimmy
Bom dia Sandro,
Eu tinha falado que a planilha ATENDIMENTOS, por ter o caráter cumulativo, poderia causar problemas. Naquele momento eu não sabia que o registro poderia mudar. Agora que sei, troco o “poderia” por “certamente vai”, porque qualquer mudança na numeração dos registros na planilha de ATIVIDADES, não será refletida na ATENDIMENTOS. Você terá linhas com o mesmo código nas duas (referindo-se ao mesmo paciente, mesmo tratamento, etc), mas cada uma com um número de registro diferente.
Acho que dá pra manter como você quer, com o número de registro alterável, mas temos que tomar alguns cuidados. O primeiro é na inclusão de linhas e na regeração dos números de registro. Não vai dar mais pra usar uma fórmula e replicar porque as linhas mãe e filhas terão o mesmo número. Não vai dar mais pra deixar a planilha ATENDIMENTOS ser cumulativa, e terá que ser refeita a cada execução, assim como as demais. Pergunta: tendo todas as informações (incluindo as linhas de desdobramento) na planilha DIARIA, você ainda precisa da planilha ATENDIMENTO? Todas as linhas lançadas na DIARIA tem desdobramentos, ou apenas aquelas que tem mais de um procedimento no atendimento?
Não quero complicar sua vida. Se acha que as mudanças que proponho são muito traumáticas, seguimos o plano original, e você vai administrando os perigos.
Caso você decida que vamos em frente assim, peço que inclua a coluna nova na tabela DIÁRIA, e teste os procedimentos de inclusão de linha, geração FF e LC, etc, pra ver se tudo continua funcionando. Depois disso, me mande a planilha novamente pra eu alterar o necessário.
Jimmy
Re: Segregar dados em tabelas - Matriz VBA
Enviado: 28 Abr 2019 às 09:33
por SandroLima
Bom dia, Jimmy.
Naquele momento eu não sabia que o registro poderia mudar. Agora que sei, troco o “poderia” por “certamente vai”, porque qualquer mudança na numeração dos registros na planilha de ATIVIDADES, não será refletida na ATENDIMENTOS. Você terá linhas com o mesmo código nas duas (referindo-se ao mesmo paciente, mesmo tratamento, etc), mas cada uma com um número de registro diferente.
E se (apenas uma ideia) mudarmos a matriz da macro (para essa situação específica) para a coluna de "CÓDIGO" da Plan "ATIVIDADES DIARIAS"???
Os códigos são "fixados" com aquele bloco WITH que mencionamos anteriormente e portanto não mais seriam alterados.
Devemos apenas ter o cuidado de excluir da matriz as situações em que a coluna código retorna "-".
A coluna "Registro" da Plan "ATENDIMENTOS" eu posso obter o retorno através de fórmulas, não importando portanto se a numeração irá mudar na Plan "ATIVIDADES DIARIAS".
Com a diferença agora de que a macro não poderá mais apagar os dados já copiados das Planilhas de Destino, apenas copiando e inserindo "novos" códigos.
Adicionalmente precisarei de uma macro para a Plan "ATENDIMENTOS" que me permita fazer os desdobramentos somente nessa planilha.
Dessa forma acredito que posso manter minha macro de "inserir linha" como está atualmente.
Pergunta: tendo todas as informações (incluindo as linhas de desdobramento) na planilha DIARIA, você ainda precisa da planilha ATENDIMENTO?
A resposta é sim... preciso de uma Planilha específica somente com os atendimentos... tanto como por solicitação do escritório de contabilidade como para facilitar a geração e conferência de recibos.
Todas as linhas lançadas na DIARIA tem desdobramentos, ou apenas aquelas que tem mais de um procedimento no atendimento
Não... nem todas tem desdobramentos... a princípio seriam somente as que que tem o valor "Paciente" na coluna "Item" (justamente os que iriam para a Plan "ATENDIMENTOS"... por isso penso que os "desdobramentos" podem ser feitos especificamente nessa planilha).
Não quero complicar sua vida. Se acha que as mudanças que proponho são muito traumáticas, seguimos o plano original, e você vai administrando os perigos.

O que vc fez aqui nos últimos dias nessa pasta de trabalho me tirou vários traumas isso sim.
Caso você decida que vamos em frente assim, peço que inclua a coluna nova na tabela DIÁRIA, e teste os procedimentos de inclusão de linha, geração FF e LC, etc, pra ver se tudo continua funcionando. Depois disso, me mande a planilha novamente pra eu alterar o necessário.
Vou deixar você avaliar a sugestão acima antes de decidirmos sobre a adição da coluna.
À disposição e muito obrigado.
Segregar dados em tabelas - Matriz VBA
Enviado: 28 Abr 2019 às 11:29
por Jimmy
Vamos avaliando juntos, porque quem conhece o sistema todo é você; eu apenas uma pequena parte.
A escolha da solução deve levar pouco em conta as alterações a fazer, porque uma vez feitas, passou, e o sistema passa a atender melhor, enquanto que deixar de fazer algo pra não ter que alterar, é pagar o preço a cada dia de utilização do sistema.
Vou pensar na sua ideia mais tarde, mas entrei aqui rapidinho só pra te dar outra possibilidade, para ir pensando.
E se as colinas Registro e Código se transformassem em uma só? As linhas que já tem código definitivo gerado, não mudam. As que ainda não tem código gerado, em vez de ter "-", passariam a ter um número simples, sequencial, e gerado automaticamente, só pra identificar a linha, assim como é hoje o Registro. Essa coluna unificada seria a chave (ou key, que em banco de dados significa o campo que tem o valor que não se repete, e serve de referência para identificar uma linha de dados). Você teria que avaliar os impactos disso nas planilhas FF e LC, e também nas outras que não conheço.
Re: Segregar dados em tabelas - Matriz VBA
Enviado: 28 Abr 2019 às 15:33
por SandroLima
A escolha da solução deve levar pouco em conta as alterações a fazer, porque uma vez feitas, passou, e o sistema passa a atender melhor, enquanto que deixar de fazer algo pra não ter que alterar, é pagar o preço a cada dia de utilização do sistema.
Tem toda razão, Jimmy... se achar que o melhor é alterar a minha macro tudo bem..
Vc tem muito mais experiência... sabe bem mais do que eu o que funciona de verdade.
As linhas que já tem código definitivo gerado, não mudam.
Se há preocupação em perder os códigos já gerados não se preocupe... isso eu consigo contornar gerando novos códigos rapidamente... as demais informações não seriam perdidas por conta disso.
Para conhecimento uso a seguinte fórmula para gerar os códigos:
Código: Selecionar todos=SE(OU([@Data]="";[@Data]="-";[@Item]<>"Paciente";[@[Data Nasc / Compra]]="";[@[Data Nasc / Compra]]="-");"-";(CONCATENAR(DIREITA(TEXTO([@Registro];"00");2);" - ";MAIÚSCULA(ESQUERDA([@[Nome / Razão Social]];1));DIREITA(ANO([@[Data Nasc / Compra]]);2);".";TEXTO([@Data];"dd");TEXTO([@Data];"mm");".";ESQUERDA(CONCATENAR(ARRUMAR(DIREITA(SUBSTITUIR([@[Nome / Razão Social]];" ";REPT(" ";NÚM.CARACT([@[Nome / Razão Social]])));NÚM.CARACT([@[Nome / Razão Social]])))));TEXTO([@Data];"aa"))))
Onde:
60 - seriam os últimos 2 dígitos do número de registro desse cliente (e uma vez "fixado" o código pouco importa se o número de registro alterar... e justamente por isso não me preocupa tanto a coluna de registro ser atualizada.
F07 - Inicial do Nome mas o ano de nascimento do cliente
0506 - dia e mês da ocorrência/atendimento
B18 - Inicial do último nome e ano da ocorrência/atendimento
Você teria que avaliar os impactos disso nas planilhas FF e LC, e também nas outras que não conheço.
Acho que posso fazer isso sem problemas também.
Mas enfim... façamos como vc achar melhor... se não tiver como manter os registros dinâmicos mudemos então para que não se alterem mais.
Segregar dados em tabelas - Matriz VBA
Enviado: 28 Abr 2019 às 17:03
por Jimmy
Sandro,
Agora estou entendendo melhor o código.
Você diz que não há problema se o registro de uma linha já fechada (que teve seu código gerado, e passou a ser texto) tiver o seu registro alterado porque o que passa a valer é o código. Ok.
Creio então que podemos fazer o seguinte:
A) Deixamos os desdobramentos na própria planilha Diária
B) Será criada uma nova coluna (creio que pode ser a segunda coluna, entre REGISTRO e DATA, pois ela será um “complemento” do registro.
C) A linha principal (linha mãe) terá o valor zero nessa coluna nova, indicando que é a linha principal.
D) Os desdobramentos (linhas filhas) terão o mesmo registro da linha principal, mas terão, cada uma, um número sequencial iniciando em 1 (na coluna nova), e nas demais colunas terão o valor e descrição do procedimento. Caso a ordem dos atendimentos não seja importante, essa numeração pode ser substituída pela letra F de filha. Como é melhor? Lembre-se que a classificação dos dados feita pela rotina de inserção de linha nova, pode alterar a ordem que os procedimentos foram inseridos. Para respeitar essa ordem é que usaríamos número sequencial.
(aqui eu tenho uma pergunta: onde estará a descrição do procedimento das linhas que não contenham desdobramentos? Há coluna para isso?)
E) A macro de inserção de linhas novas irá:
1) inserir nova linha
2) renumerar os registros, mas levando em conta que poderá haver mais de 1 linha com o mesmo registro.
3) Transformar em texto os códigos já fechados.
F) A execução para as planilhas FF e LC deve desconsiderar as linhas filhas.
G) A execução para a planilha ATENDIMENTOS deixa de ser cumulativa, sendo regerada a cada solicitação via botão. Caso haja problemas de lentidão, pensamos em voltar a ser cumulativa.
H) Será criado novo botão na planilha DIARIA para fechamento de linhas (ter o código transformado em texto) e renumeração dos registros. Embora a inserção de linha já faça isso, pode ser que haja a necessidade de fazer isso SEM inserir linha alguma.
(O que você acha disso? Desnecessário?)
Acho que dessa forma atende, sem perigos de inconsistência, pois teríamos todos os dados em um único lugar, e as demais planilhas seriam derivadas desta.
Se concorda, mãos a obra. Crie a nova coluna e teste se as macros já existentes continuam rodando corretamente. Isso feito, vou alterar a parte de renumeração de registros. Depois acabo a macro de ATENDIMENTO. Vamos inicialmente criar as linhas filhas manualmente, pra testar a espinha dorsal, e depois fazemos uma macro pra isso.
Re: Segregar dados em tabelas - Matriz VBA
Enviado: 28 Abr 2019 às 19:36
por SandroLima
KKK... massa quando volta cheio de ideias.
Você diz que não há problema se o registro de uma linha já fechada (que teve seu código gerado, e passou a ser texto) tiver o seu registro alterado porque o que passa a valer é o código. Ok.
Basicamente isso rsrs.
A) Deixamos os desdobramentos na própria planilha Diária
Tudo bem.
B) Será criada uma nova coluna (creio que pode ser a segunda coluna, entre REGISTRO e DATA, pois ela será um “complemento” do registro.
Ok também... já criei a coluna e a denominei de "Sub" (até ver o funcionamento e encontrar uma melhor definição rsrs)
D) Os desdobramentos (linhas filhas) terão o mesmo registro da linha principal, mas terão, cada uma, um número sequencial iniciando em 1 (na coluna nova), e nas demais colunas terão o valor e descrição do procedimento.
Seria desejável que as linhas de desdobramento tivessem uma sequencia (já estou pensando mais adiante). Pode ser numérica ou alfabética.
A coluna nova ("Sub") receberia apenas a numeração ou seria a combinação de alguma coisa?
Se ela a coluna nova for receber o mesmo número de registro (por exemplo 134) penso que ficaria interessante (134 - A, 134 - B, 134 - C e etc) mas como acho que vc está considerando os registros com numeração dinâmica e deve usar os códigos para fazer o desdobramento talvez deva ficar "código" - A, "código" - B e etc (assim talvez até eliminassemos a coluna "Código" ou melhor, traríamos ela para a 2ª coluna da tabela.
C) A linha principal (linha mãe) terá o valor zero nessa coluna nova, indicando que é a linha principal.
Sem problemas...
Se for usar a ordenação com Letras (A, B, C....) a liha mãe etão fica apenas com o valor do código principal ok?
E) A macro de inserção de linhas novas irá:
1) inserir nova linha
2) renumerar os registros, mas levando em conta que poderá haver mais de 1 linha com o mesmo registro.
3) Transformar em texto os códigos já fechados.
Ok... excelente.
(aqui eu tenho uma pergunta: onde estará a descrição do procedimento das linhas que não contenham desdobramentos? Há coluna para isso?)
Identifiquei a coluna "Descrição" na tabela.
A linha mãe recebe um valor tal como "Tratamento de Saúde".
A mesma coluna nas "linhas filhas" podem receber um texto como "Descreva a ocorrência/procedimento ".
F) A execução para as planilhas FF e LC deve desconsiderar as linhas filhas.
Não... somente a linha mãe... seria informação demais em planilhas desnecessárias... talvez terei que adaptar as macros anteriores para isso. Mas não preocupemos com isso agora
G) A execução para a planilha ATENDIMENTOS deixa de ser cumulativa, sendo regerada a cada solicitação via botão. Caso haja problemas de lentidão, pensamos em voltar a ser cumulativa.
Tenho esse receio... mas vamos tentar... de qualquer forma o código será aproveitado... Gostei da ideia dos desdobramentos na Plan "ATIVIDADE DIARIA"
H) Será criado novo botão na planilha DIARIA para fechamento de linhas (ter o código transformado em texto) e renumeração dos registros. Embora a inserção de linha já faça isso, pode ser que haja a necessidade de fazer isso SEM inserir linha alguma.
(O que você acha disso? Desnecessário?)
Já pensei nisso e em tirar o trecho dó código que faz isso da macro de inserir linha... está deixando a rotina lenta.
Vc é genial. Enxerga na frente mesmo sem ter realizado a simulação das dificuldades.
Se concorda, mãos a obra. Crie a nova coluna e teste se as macros já existentes continuam rodando corretamente. Isso feito, vou alterar a parte de renumeração de registros. Depois acabo a macro de ATENDIMENTO. Vamos inicialmente criar as linhas filhas manualmente, pra testar a espinha dorsal, e depois fazemos uma macro pra isso.
Segue planilha anexa com as alterações aqui discutidas.
Apenas ainda não testei as macros anteriores porque não deu tempo.
Re: Segregar dados em tabelas - Matriz VBA
Enviado: 28 Abr 2019 às 21:24
por Jimmy
SandroLima escreveu:Seria desejável que as linhas de desdobramento tivessem uma sequencia (já estou pensando mais adiante). Pode ser numérica ou alfabética.
A coluna nova ("Sub") receberia apenas a numeração ou seria a combinação de alguma coisa?
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.
SandroLima escreveu:Se ela a coluna nova for receber o mesmo número de registro (por exemplo 134) penso que ficaria interessante (134 - A, 134 - B, 134 - C e etc)
Pensei apenas 1, 2, 3... porque na columa Registro das linhas filhas vai constar o mesmo registro da mãe.
SandroLima escreveu:... mas como acho que vc está considerando os registros com numeração dinâmica e deve usar os códigos para fazer o desdobramento talvez deva ficar "código" - A, "código" - B e etc (assim talvez até eliminassemos a coluna "Código" ou melhor, traríamos ela para a 2ª coluna da tabela.
Essa é a ideia que eu dei no post de 12:29h
Jimmy escreveu:E se as colinas Registro e Código se transformassem em uma só? As linhas que já tem código definitivo gerado, não mudam. As que ainda não tem código gerado, em vez de ter "-", passariam a ter um número simples, sequencial, e gerado automaticamente, só pra identificar a linha, assim como é hoje o Registro. Essa coluna unificada seria a chave (ou key, que em banco de dados significa o campo que tem o valor que não se repete, e serve de referência para identificar uma linha de dados). Você teria que avaliar os impactos disso nas planilhas FF e LC, e também nas outras que não conheço.
Você não comentou, achei que viu dificuldades. Vamos deixar as duas separadas mesmo pra ver se o resultado é bom.
SandroLima escreveu:Se for usar a ordenação com Letras (A, B, C....) a liha mãe etão fica apenas com o valor do código principal ok?
Não entendi. A coluna de códigos, nessa linha que estamos seguindo, não tem papel nessas alterações da planilha Diaria, de inserção das linhas de desdobramento. A geração do código fica como estava. A única alteração é que as linhas de desdobramento terão na coluna Código, uma fórmula pegando o código da linha mãe.
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.
Identifiquei a coluna "Descrição" na tabela.
A linha mãe recebe um valor tal como "Tratamento de Saúde".
A mesma coluna nas "linhas filhas" podem receber um texto como "Descreva a ocorrência/procedimento ".
ok
Jimmy escreveu:F) A execução para as planilhas FF e LC deve desconsiderar as linhas filhas.
SandroLima escreveu:Não... somente a linha mãe... seria informação demais em planilhas desnecessárias... talvez terei que adaptar as macros anteriores para isso. Mas não preocupemos com isso agora
Sim, eu coloquei
desconsiderar kkk
SandroLima escreveu:Já pensei nisso e em tirar o trecho dó código que faz isso da macro de inserir linha... está deixando a rotina lenta.
Vamos medir pra quantificar o quento está deixando lenta. Lembra dos Debug.Print? Podem ser usados para isso.
SandroLima escreveu:Segue planilha anexa com as alterações aqui discutidas.
Ok, bola comigo.
Jimmy