Tópicos relacionados a códigos VBA, gravação de macros, etc.
Avatar do usuário
Por Jimmy 17 Mai 2019 às 15:09
Membro 5 Estrelas
Mensagens: 601
Reputação: 380
#43948
Isso mesmo. Você parte do VALOR (bruto), aplica um desconto, se houver, e terá o VLR C/ DESCONTO. Esse valor com desconto divide pelas parcelas (se não houver ou for inválido, será considerada 1 parcela.

Da forma que está sua fórmula, ou você dá desconto, ou parcela. Se resolver praticar os 2, não poderá.
Ex.: Valor = 2000 / desconto = 50% / Vlr com desconto = 1000 / parcelas = 4 / Valor da parcela 500 (este último deveria ser 250.
Avatar do usuário
Por Jimmy 17 Mai 2019 às 15:16
Membro 5 Estrelas
Mensagens: 601
Reputação: 380
#43949
Sandro, não estou querendo me entrometer, apenas estou dando sugestões.

Eu também passaria a coluna PARCELAS para depois da coluna Vlr c/ Desconto, antes da coluna Vlr Parcela. Acho que a sequencia fica mais natural: o valor é V, o desconto é de W, então o valor com desconto fica X, a quantidade de parcelas Y, e o valor da parcela Z.
Avatar do usuário
Por Jimmy 24 Mai 2019 às 22:40
Membro 5 Estrelas
Mensagens: 601
Reputação: 380
#44170
Olá Sandro,

Acho que terminamos!! Faltam, é claro, testes mais rigorosos, que deixo pra você.

Eu criei uns botões de classificação (uns roxos) que me ajudaram no desenvolvimento, mas no final podemos apagarar todos.

Esvaziei ao máximo a macro de desdobramentos, assim como a de inserção de linhas. A parte mais pesada ficou pra macro Ordena e Acerta, que deverá ser executada a critério do operador.

Segue a planilha.

Jimmy
Apenas usuários registrados podem ver ou baixar anexos.
Por SandroLima 26 Mai 2019 às 18:23
Membro 5 Estrelas
Mensagens: 553
Reputação: 9
#44205
Boa tarde, Jimmy.

Estou de volta.
Acho que terminamos!! Faltam, é claro, testes mais rigorosos, que deixo pra você.

Eu criei uns botões de classificação (uns roxos) que me ajudaram no desenvolvimento, mas no final podemos apagarar todos.

Esvaziei ao máximo a macro de desdobramentos, assim como a de inserção de linhas. A parte mais pesada ficou pra macro Ordena e Acerta, que deverá ser executada a critério do operador.

Seguirei com os testes... por enquanto e mais uma vez muito obrigado.
Logo dou o retorno.
Por SandroLima 31 Mai 2019 às 14:12
Membro 5 Estrelas
Mensagens: 553
Reputação: 9
#44361
Bom dia, Jimmy.

Continuo testando a planilha e por enquanto fiquei restrito à macro de desdobramentos.
Percebi que ao executar na minha planilha a macro inseriu as linhas filhas mas não copiou os dados da linha mãe e a coluna Sub está recebendo a numeração do tipo A-99, por exemplo.
Também percebi que as linhas foram inseridas acima da linha mãe diferente do que aconteceu na sua planilha... Inicialmente achei que era por causa da macro "Ordenar Tabela" mas vi que ela está na forma comentada... o que fiz de errado?

Trouxe também algumas outras dúvidas para que eu possa fazer melhor entendimento do código.

Comentei algumas partes e vou anexar a planilha para que vc verifique se estou escrevendo alguma bobagem. Ainda não fiz os testes com as demais macros (inclusive a macro que organiza a tabela)... Fiquei somente na macro "Desdobramentos" por enquanto.
Vamos lá.

Dúvidas:

Onde entra a Macro Desdobramento2 ? Quado ela é executada? Vi que a macro Desdobra está vinculada ao botão.... e a macro Desdobramento 2?


O que seria a Variável TipoT (uma nomenclatura para eu entender e deixarcomentado)? TipoM entendi que seria tipo "mãe".


O que seria a Variável Idx ?


E o que significam as linhas de código: (também para me ajudar no aprendizado)
1- For Idx = LinhaM To 2E+22 ?
2- No código "RngTabela.Range(Cells(LinIni + 1, ColReg), Cells(LinIni + Qtd, ColQtd)).Formula = _
RngTabela.Range(Cells(LinMae + 0, ColReg), Cells(LinMae + --0, ColQtd)).Formula" o que significa o "--0"?


Continuo em testes por aqui.... devagar... mas sempre. Passado a etapa de entendimento e testes da macro "Desdobramento" vou para os testes da macro "Ordenar Tabela".
E somente depois volto para as macros anteriores (de extração de dados para as demais planilhas Fluxo Financeiro, Livro-Caixa, etc) para realizar ajustes necessários conforme os dados que devem ser extraídos... pode ser assim?

Ahhh... percebi que removeu a parte do código que "fixa" os códigos das linhas de pacientes...
Código: Selecionar todosWith Tabela
        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
            Else
            End If
        Next Lin
End With


foi por causa da lentidão que essa etapa provoca?

Segue a planilha com alguns comentários que fiz para o meu entendimento.

Alterei algumas nomenclaturas de variáveis (para facilitar minha leitura) mas na estrutura do código não realizei alterações.
Ah comecei a tentar declarar algumas variáveis... se puder verificar se está correto... de qualquer forma removi o "Option Explicit" para não atrapalhar a execução da Macro

Muito obrigado pela atenção e paciência.

Abç.
Apenas usuários registrados podem ver ou baixar anexos.
Avatar do usuário
Por Jimmy 15 Jun 2019 às 12:45
Membro 5 Estrelas
Mensagens: 601
Reputação: 380
#44768
Boa tarde Sandro,

Desculpe a demora em resposnder. Fiquei uns dias sem entrar no forum.

Amanhã lerei com calma seu post e re responto.

Até

Jimmy San Juan
Por SandroLima 15 Jun 2019 às 13:43
Membro 5 Estrelas
Mensagens: 553
Reputação: 9
#44770
Bom dia, Jimmy.

Desculpe a demora em resposnder. Fiquei uns dias sem entrar no forum.

Amanhã lerei com calma seu post e re responto.

Sem problemas... Obrigado por responder.

Bom final de semana.
Avatar do usuário
Por Jimmy 20 Jun 2019 às 14:45
Membro 5 Estrelas
Mensagens: 601
Reputação: 380
#44931
Olá Sandro,

SandroLima escreveu:Continuo testando a planilha e por enquanto fiquei restrito à macro de desdobramentos.
Percebi que ao executar na minha planilha a macro inseriu as linhas filhas mas não copiou os dados da linha mãe e a coluna Sub está recebendo a numeração do tipo A-99, por exemplo.
Também percebi que as linhas foram inseridas acima da linha mãe diferente do que aconteceu na sua planilha... Inicialmente achei que era por causa da macro "Ordenar Tabela" mas vi que ela está na forma comentada... o que fiz de errado?

O motivo disso é o que você apontou. A macro responsável por acertar numerações e ordenar a planilha de Atividades é a Ordena_AtivDiarias. Por isso, é necessário descomentar a linha que a aciona. Eu não sei porque, mas a tabela de atividades nessa planilha última que você postou, teve ser nome alterado de TB_AtividadesDiarias, para TB_AtivDiarias. Isso não está refletido na macro Ordena_Diaria. Logo, é necessário entrar nessa macro e mandar substituir todos os errados para os corretos.

Onde entra a Macro Desdobramento2 ? Quado ela é executada? Vi que a macro Desdobra está vinculada ao botão.... e a macro Desdobramento 2?

A Macro Desdobramento2 é lixo, guardado apenas até que os testes estejam concluídos. Ai pode ser apagada. Aliás, recomendo que você inclua um módulo chamado LIXO e mova tudo pra lá, pra sabermos o que estamos guardando apenas temporariamente, e o que está em produção.

O que seria a Variável TipoT (uma nomenclatura para eu entender e deixarcomentado)? TipoM entendi que seria tipo "mãe".

O TipoM será o tipo da linha mãe, a princípio, baseado no tipo escolhido no formulário. O TipoT é o tipo que consta na Tabela. Se TipoT é vazio, então TipoM fica com o tipo escolhido no formulário mesmo, porém, se TipoT tiver conteúdo, isso quer dizer que já havia um Tipo na Tabela quando a rotina da desdobramento foi acionada, já havia sido feito um desdobramento. Assim, se o tipo que já existia na tabela é diferente do que está sendo inserido agora, o TipoM não pode continuar a ter A ou P, e deve passar a ter #.

O que seria a Variável Idx ?

IDX é um mnemónico que eu uso para Indexador. Quando, por exemplo, você define uma matriz de 10 elementos, e usa MAT(5) = “aaa”, o 5 é o indexador (o que dá o endereço) da matriz MAT. No Excel, há vários objetos que possuem indexadores, por exemplo:
rows(5); Columns(22); Sheets(2); etc.
Se eu tenho que percorrer as colunas da planilha, por exemplo, geralmente eu uso a variável COL, mas as vezes uso de uma forma mais genérica IDX.

For Idx = LinhaM To 2E+22 ?

Código: Selecionar todosFor Idx = LinMae To 2E+22
    If RngTabela.Cells(Idx + 1, ColReg).Value <> ValRegistro Then Exit For
Next

Isso é um FOR que faz a variável Idx iniciar em LinhaM e não ter valor final de parada. Não ter valor de parada porque eu encerro o FOR usando o Exit For, quando o Registro muda. Como eu não sei quando o Registro mudará, não tenho como colocar valor final do IDX no próprio FOR, e encerro o FOR pelo Exit For.
O problema é que o FOR exige valor final, o que eu não quero colocar. Assim coloco como valor final um valor bem grande, que jamais será atingido, pois fatalmente, o Exit For encerrará o FOR.

Uma forma de digitar rapidamente um valor bem grande é usar a notação científica. O número 2E22 significa 2 seguido de 22 zeros. Então, com 4 digitadas eu escrevo um número enorme. Mas porque 2E22 e não 8E17 ou 3E24, que também seriam números grandes? Porque durante a digitação, como já estou com o dedo no 2, e a tecla E é próxima ao 2, digitar 2e22 é rápido. Parece meio ridículo, mas é assim que faço kkkkkkkk. Detalhe: 1E11 também é fácil de digitar, mas o Excel expande para 100000000000, e eu acho esteticamente feio ter isso na macro. Kkkk

2- No código "RngTabela.Range(Cells(LinIni + 1, ColReg), Cells(LinIni + Qtd, ColQtd)).Formula = _
RngTabela.Range(Cells(LinMae + 0, ColReg), Cells(LinMae + --0, ColQtd)).Formula" o que significa o "--0"?

Agora vem a pior parte kkkkkkk. Você encontrou o meu TOC.

Na verdade não é bem um TOC, mas uma estética nas macros que eu uso, e que me ajuda a bater o olho e rapidamente ver a diferença entre 2 linhas.
Compare:
Código: Selecionar todos        RngTabela.Range(Cells(LinIni + 1, ColReg), Cells(LinIni + Qtd, ColQtd)).Formula = _
        RngTabela.Range(Cells(LinMae + 0, ColReg), Cells(LinMae + --0, ColQtd)).Formula

e
Código: Selecionar todos        RngTabela.Range(Cells(LinIni + 1, ColReg), Cells(LinIni + Qtd, ColQtd)).Formula = _
        RngTabela.Range(Cells(LinMae, ColReg), Cells(LinMae, ColQtd)).Formula


Na primeira forma, eu rapidamente vejo que algo está sendo copiado para algum lugar, e que as colunas são as mesmas, a tabela é a mesma, de Fórmula para Fórmula, e as únicas diferenças estão nas linhas. Na segunda forma enxergar isso, pra mim, não é tão automático, embora seja também muito fácil de ver.

LinMae + 0 é igual a LinMae, porque somar zero não altera nada, e faz com que + 0 fique alinhado com + 1 da linha de cima. Porém, no segundo Cell, o valor somado na linha de cima é + QTD. Se eu colocar + 0 ainda assim não fica alinhado. Se colocar + 000 ou + 0.0 o Excel troca pra + 0, e não fica alinhado. Então coloquei + --0, pois somar o negativo do negativo de zero não altera nada, mas fica alinhadinho. Foi só uma forma inócua de alinhar.
Editado pela última vez por Jimmy em 20 Jun 2019 às 15:17, em um total de 1 vez.
Avatar do usuário
Por Jimmy 20 Jun 2019 às 15:14
Membro 5 Estrelas
Mensagens: 601
Reputação: 380
#44934
SandroLima escreveu:Ahhh... percebi que removeu a parte do código que "fixa" os códigos das linhas de pacientes...
foi por causa da lentidão que essa etapa provoca?


Sim, por causa da lentidão. Inicialmente você estava prevendo 10 mil lançamentos, se não me falha a memória, e depois passou pra uns 30 mil. Comentamos num post passado em deixar as macros de inserir linha e desdobramento o mais enxutas possível, e passar algumas funções para a macro de Ordena e Acerta, que seria acionada pelo operador conforme seja necessário.

Não sei como você está fazendo para testar, mas parece que está incorporando à planilha final, apenas algumas macros, e outras não. Pode ser que essa mistura de macros de uma versão com de outra, te traga algumas dificuldades.

Jimmy San Juan
Por Edcronos 23 Jun 2019 às 11:07
Membro 1 Estrela
Mensagens: 47
Reputação: 22
#45003
desculpe perguntar, essa planilha é pra uso profissional ou é para aprendizado?
para uso profissional é muito arriscado ficar fazendo tentativas quando nao se sabe , e o ideal seria pagar um profissional para fazer ou comprar algo pronto que atenda as necessidades, eu particularmente nem coloco a mao já que riscos de erros podem trazer mais prejuízos do que o valor pago para um profissional,
se for para aprender oq duvido tem vários pontos na planilha que devia ser mudados para falcil automação , dinamicidade , eficiencia , uso e manutenção futura
Avatar do usuário
Por Jimmy 23 Jun 2019 às 15:19
Membro 5 Estrelas
Mensagens: 601
Reputação: 380
#45018
Edcronos,

A finalidade de aprendizado existe sim por parte do autor do tópico, disso eu não tenho dúvida alguma, e eu coloco esse conhecimento como a importância maior nesse processo.

A planilha, aqui neste tópico, iniciou seu desenvolvimento de uma forma bastante pontual, com a solução de problemas específicos, mas com o passar do tempo, após o encerramento de etapas anteriores, novas demandas foram sendo acrescentadas, muitas informações foram sendo dadas penas posteriormente (acredito que por questões de confidencialidade), e tudo foi crescendo, de fato, de forma pouco planejada. Dessa forma, não há como ter sido seguindo o melhor caminho, pois este só poderia ser definido quando o quadro todo é analisado, os objetivos definidos e claros, as perspectivas futuras conhecidos, etc, o projeto desenhado, e só então o desenvolvimento iniciado (talvez nem em Excel!).

Mesmo com tudo isso exposto, não me dou o direito de julgar o caminho que o autor escolheu seguir, pois mesmo com a participação que tive nesse desenvolvimento, ainda não posso dizer que conheço a realidade da empresa, nem suas limitações ou não com verbas para contratar desenvolvimentos, nem a autonomia administrativa que o autor tem, nem seus interesses em termo de desenvolvimento profissional, e sequer a importância que esta planilha desempenha nos processos da empresa.
Creio que sempre há motivos para as escolhas que todos fazem, e ele deve ter os dele.


De uma forma ou de outra, eu vejo como papel principal do fórum a transmissão de conhecimento, o que creio ter ocorrido neste nosso caso. O conhecimento adquirido pelo autor, não terá se apagado daqui há 2 anos, mesmo que a planilha não esteja mais em operação.

Jimmy
Por Edcronos 23 Jun 2019 às 22:22
Membro 1 Estrela
Mensagens: 47
Reputação: 22
#45026
Jimmy
desculpe a critica, mas quando se quer aprender nao se usa algo já voltado para o lado de negócios em andamento,
se faz pesquisas e começa com algo simples
existem coisas que só se aprende com a experiência
outro ponto é o fato de que mesmo já tendo novos conhecimentos e sabendo que devia fazer diferente fica bastante dificil refazer algo já em uso e que se tornou um mutante a ser domado , falo isso por experiência própria

planejamento existe e existe noções basicas que devem ser seguidas
de onde vem os dados
que tipo de dados
qual a relação entre eles
daí se monta o banco de dados que pode ser na propria planilha dependendo do fluxo
se monta o coletor desses dados que vai ficar responsavel pelo controle de entrada no banco de dados
antes desse ponto nao adianta passar para o resto

não se usa formatações em bancos de dados tem que ser o mais simples e limpo possivel , se forem muito pesados definir oq pode ser indexado em outras tabelas
não use tabelas do excel para bancos de dados , ficam pesados e de difícil controle apesar de que quando são pequenas facilitam as coisas

olhei as macros, acho que ficar comentado tudo e todos somente atrapalha , comente somente blocos chaves ,
se ele quer aprende tem que pesquisar e testar , comentários não ensinam a programar apenas servem para indicar a logica do trecho do codigo
sobre o restante eu descartaria tudo e faria novamente com nova perspectiva , isso depois de refazer o banco de dados
Por SandroLima 23 Jun 2019 às 23:15
Membro 5 Estrelas
Mensagens: 553
Reputação: 9
#45027
Boa noite, usuários e colaboradores do fórum.

Que pena fazer disso uma polêmica e deixar tomar tamanha proporção.

Mas para esclarecer (embora acho que eu não precisasse fazer isso) a planilha é sim para aprendizado (principalmente meu mas acho que muitos estão acompanhando o tópico pela quantidade de visualizações que o mesmo já atingiu).

E sim... também utilizo para meu uso profissional sim... tendo sempre o cuidado de salvar as informações antes de qualquer nova etapa e minimizando, portanto, os riscos.

Sou profissional autônomo, atuo em uma área nada correlata com o excel mas sou um leigo curioso e encantado pelo programa faz algum tempo.

Para quem fazia tudo manualmente tive grandes avanços... muitos com a ajuda de vários colaboradores do fórum e com rotinas que fui adaptando para a minha necessidade (e por isso falo que serve sim para o aprendizado... uma única rotina pude utilizar para várias aplicações na planilha e em outras).

O tópico está aberto para sugestões que possam melhorar o desempenho e o manuseio da planilha.

A planilha, como foi colocado, começou com pedido de ajuda para questões pontuais simples e tive muitas ideias e sugestões de melhorias no caminho o que fico prontamente agradecido. Com isso mais e novas ideias foram surgindo e com isso novas demandas o que me agregou muito.

De uma forma ou de outra, eu vejo como papel principal do fórum a transmissão de conhecimento, o que creio ter ocorrido neste nosso caso. O conhecimento adquirido pelo autor, não terá se apagado daqui há 2 anos, mesmo que a planilha não esteja mais em operação.

Também vejo esse como o papel do fórum... e a planilha continua em uso, claro... mesmo eu engatinhando e sempre buscando tirar as dúvidas em outras necessidades que vão surgindo adjuntas.

Não sei nem como agradecer o quanto me ajuda participar de fóruns como esse e mensurar o quanto de conhecimento adquiri graças a ajuda dos colaboradores. E mesmo usuários que quantas vezes que se prontificaram a ajudar com uma macro que possuem que talvez tivesse função semelhante à necessidade requisitada.

Sobre a parte comentada... por vezes eu que pedi... e somente quando era algo que eu ainda não conhecia ou não entendia em partes de um determinado código. E isso sempre me ajudou. Nunca vi ninguém reclamar também.

Se não tivesse interesse no conhecimento deixaria por isso mesmo após a solução pronta.
Mas não... sempre que preciso peço explicação em partes do código que desconheço... desde que o colaborador possa é claro... sei que cada um tem a sua correira do dia a dia.
Inclusive eu mesmo anoto ou "comento" em alguns códigos de onde veio a ajuda ou a informação para que eu possa tirar dúvidas posteriormente caso precise.

Enfim... espero que tenha esclarecido.
Sou muito grato pela ajuda que tenho recebido de vários membros desse fórum e não muito mas no que posso tento ajudar às vezes.
Espero que continuem o fórum da maneira como sempre tem sido... sei que muito como eu gostam muito e usufruem bastante desse fórum.

E como disse antes... sugestões de melhorias ou vista de outras perspectivas serão sempre bem vindas.
Fiquem à vontade aqueles que quiserem colaborar nesse tópico e também aqueles que estão usando para agregar conhecimento ou aplicações no seu dia a dia.

Tenham uma semana abençoada e vamos em frente que esse projeto não pode parar assim rsrs.
Por Edcronos 24 Jun 2019 às 10:39
Membro 1 Estrela
Mensagens: 47
Reputação: 22
#45030
SandroLima e Jimmy
De uma forma ou de outra, eu vejo como papel principal do fórum a transmissão de conhecimento, o que creio ter ocorrido neste nosso caso. O conhecimento adquirido pelo autor, não terá se apagado daqui há 2 anos, mesmo que a planilha não esteja mais em operação.

Jimmy

sim transmitir informação e compartilhar conhecimento, não fazer o trabalho dos outros, é a mesma coisa o cara na faculdade o professor dá um teste e ele leva para um forum pedindo para outros resolver , não é ético
tambem não é papel do forum servir de curso particular , existem muitos bons cursos e tutoriais gratuitos pela internet
por isso falei que se quer aprende começar com algo simples e depois se se sentir capacitado para atribuir tal funcionalidade na planilha do trabalho ok sem passar esse papel para outros
os riscos não são nos testes mas quem mexe com programaçãi sabe que os bugs sempre aparecem no uso por fatores desconhecidos

e como falei tabelas de excel são horriveis para trabalhos maiores, são muito boas para uso simples pequenos e apenas para facilitar formulas , se for usar macros nao existe motivos para usar tabelas do excel
para que aquilo de adicionar a linha em cima e ainda por cima em uma tabela, isso se faria apenas em tela e dados de apresentação e não de dados basicos, reparou o tempo que leva para adicionar uma simples linha em branco?
o projeto em sí é simples , mas está preste a se tornar um mamute que ninguem vai querer chegar perto quando mais precisar
se estiver disponível tente usar uma tabela dinâmica e se pode usar até os slices para filtrar e criar os relatórios dependendo da versão do excel , simples e facil
use um aba separada para entrar os dados no banco de dados e coloque a consolidação dos dados ali e nao no banco de dados
bancos de dados foram feito para colocar e tirar informação apenas e não para trabalhar os dados, esses se trabalha depois de tirar pegar no banco e colocar em outro lugar
Avatar do usuário
Por Jimmy 12 Ago 2019 às 14:59
Membro 5 Estrelas
Mensagens: 601
Reputação: 380
#46732
Boa tarde Sandro,

Acabamos não escrevendo mais neste tópico. Como ficou ele?

Não há mais nada a ser feito, ou ainda restou alguma pendência?

Jimmy