Dúvidas sobre cálculos, funções simples e aninhadas, fórmulas matriciais, etc.
Por donrafy 09 Ago 2019 às 23:35
Membro 1 Estrela
Mensagens: 15
Reputação: 1
#46698
boa noite,

estou precisando de ajuda para resolver um problema.

A colunas (A, B e C) da esquerda representam meus vãos e onde eles começam e terminal.
As colunas L e M representam se posso acessar ou não o vão. (0 = não posso acessar e 1 = posso acessar)

Preciso verificar em quais linhas da coluna L e M o meu vão fazem parte.
Se qualquer linha tiver um binário = 0, o vão se torna zero. Se todas as linhas que o vão fazem parte for 1, o vão fica 1.


segue link da planilha:
https://drive.google.com/file/d/1nO5T47 ... sp=sharing

consegui fazer isso com vba mas não ficou bom. Demorou muito para chegar no resultado, se tornando inviável.
Avatar do usuário
Por Jimmy 10 Ago 2019 às 00:58
Membro 5 Estrelas
Mensagens: 1195
Reputação: 804
#46699
Olá,

Simpatizei com o problema, mas não entendi bem como funciona. Poderia explicar com mais detalhes e exemplos?

Não esqueça de anexar a planilha no post: clique no botão abaixo "+ Resposta", depois em "Adicionar um anexo", e depois em "Selecione o arquivo".

Jimmy San Juan
Avatar do usuário
Por Deciog 10 Ago 2019 às 10:20
Membro 5 Estrelas
Mensagens: 1309
Reputação: 673
#46702
donrafy, Bom Dia.

Confere se é desta forma que desejas

Se minha resposta foi útil, clique em obrigado é uma forma de agradecimento da ajuda

Decio
Apenas usuários registrados podem ver ou baixar anexos.
Por donrafy 10 Ago 2019 às 10:44
Membro 1 Estrela
Mensagens: 15
Reputação: 1
#46703
Pronto,

anexei o arquivo.

Detalhando mais o problema. Eu tenho vãos de passagem (Coluna A, B e C) e proprietários que autorizam (Coluna k = 1) ou não autorizam (Coluna k = 0) passar.

Então vamos aos exemplos:
Meu "vão 1" começa na progressiva zero e vai até a progressiva 78, ou seja ele está completamente dentro da propriedade "a" que libera minha passagem (coluna k = 1). Logo posso passar com meu vão 1 por completo e a "Resposta Nec" se torna 1.

Meu "vão 2" que começa do 78 e vai até o 499 está dentro da propriedade "a" e "b", onde o proprietário "a" deixa eu passar mas o proprietário "b" não deixa (binário = 0), logo minha resposta da coluna D é 0 (não consigo completar o vão)

Meu "vão 3" está completamente dentro da propriedade "b", que não me deixa passar, logo minha resposta da coluna D é 0 (não consigo completar o vão).

Meu "vão 4" está dentro da propriedade "b" e "c", mas como o proprietário b não deixa eu passar, minha resposta é 0 para esse vão também.

Meu "vão 5" está contido dentro das propriedade "c", "d", "e", "f" e "g" e todos deixam eu passar, logo, minha resposta (coluna D) é 1 .

Meu "vão 6" até o "vão 9" estão 100 % contidos na propriedade "g", que está liberada, por isso minha resposta é 1.

Meu vão "10" está dentro da propriedade "g" e "h", mas como "h" não está liberado minha resposta é 0.

o "vão 11" até o "vão 15" estão dentro das propriedades que não estão tenhuma liberadas, logo a resposta para todas é 0.

Eu so tenho meu processo completo se todos os proprietários estiverem 1, caso contrário vou completando a coluna D conforme exemplo detalhado.


Espero que a explicação tenha ficado boa. Parece um problema simples mas é bem complexo para conseguir resolver com função. Pelo menos estou tendo dificuldades.

Obrigado pela ajuda desde já.
Apenas usuários registrados podem ver ou baixar anexos.
Por donrafy 10 Ago 2019 às 11:09
Membro 1 Estrela
Mensagens: 15
Reputação: 1
#46704
Deciog escreveu:donrafy, Bom Dia.

Confere se é desta forma que desejas

Se minha resposta foi útil, clique em obrigado é uma forma de agradecimento da ajuda

Decio


Decio, muito elagente sua resposta.
Mas infelizmente atende 100 % o problema proposto.
Fiz um comentário no anexo mas o problema foi que sua resolução so analisa o proprietário que está no início e fim do vão.
Os proprietários que estão no meio do vão são os mais complicados, pois basta um não deixar passsar que o vão se torna zero.
Muitas vezes nos problemas que possuo isso acontece, um vão passa por vários proprietários e um ou mais não deixa o vão passar.
Apenas usuários registrados podem ver ou baixar anexos.
Avatar do usuário
Por Jimmy 12 Ago 2019 às 11:50
Membro 5 Estrelas
Mensagens: 1195
Reputação: 804
#46720
Olá,

Veja se a planilha anexa te atende.

Pra ficar mais fácil de verificar o resultado, inclui na coluna E a informação de quais são os proprietário envolvidos com cada vão, e entre parenteses está a informação se aquele proprietário permite ou não a passagem . Após fazer os testes, se achar que essa informação não é mais necessária, me avisa que eu limpo a macro no que refere a ela.

Procurei deixar as definições de colunas e linhas envolvidas nas primeiras linhas da macro, para caso queira trocar as tabelas de lugar.

Creio que essa planilha que você postou é uma planilha exemplo. Sobre a planilha real, peço que informe a quantidade aproximadas de linhas de vãos, e de linhas de proprietários, pois se for uma quantidade muito grande, é possível que tenhamos problemas de performance.

Jimmy San Juan
Apenas usuários registrados podem ver ou baixar anexos.
Por donrafy 12 Ago 2019 às 23:23
Membro 1 Estrela
Mensagens: 15
Reputação: 1
#46774
Jimmy San Juan,

ótima forma de verificar os detalhes e conferir todos os resultados, gostei muito.
Mas conforme você falou, está havendo um problema de desempenho MUITO grande.
No exemplo completo (em anexo: "dúvida completo") eu possuo 386 vãos e 207 proprietários. Isso resulta em mais 5 minutos de cálculos interativos por modificação que faço. Se esse fosse o resultado final de meu programa, era até aceitável, entretanto ainda existe uma segunda etapa (que já está resolvida) que é modificar o Binário de todos os proprietários para verificar aquele que mais libera vão para mim.
Existem problemas que possuo até 700 vãos e 500 proprietários, isso poderia demorar mais que 10 min para resolução do problema.

Eu consegui resolver o proglema com um VBA em 30 s, conforme código a seguir:

Código: Selecionar todosinicio = Cells(i, 6)
fim = Cells(i + 1, 6)
       
        For k = 4 To (Linha2 - 1)
       
        If (Cells(k, 20) <= inicio) And (Cells(k, 21) >= fim) Then
       
                If (StrComp(Cells(k, 24).Value, "0", vbTextCompare) = 0) Then
           
                tipo = 1 '
           
                Else
               
                'tipo = 0
               
                End If
               
        ElseIf (inicio <= Cells(k, 21)) And (fim >= Cells(k, 21)) Then
       
                If (StrComp(Cells(k, 24).Value, "0", vbTextCompare) = 0) Then
           
                tipo = 1 '
           
                Else
               
                'tipo = 0
               
                End If
               
        ElseIf (Cells(k, 20) <= fim) And (Cells(k, 21) >= fim) Then
       
                If (StrComp(Cells(k, 24).Value, "0", vbTextCompare) = 0) Then
           
                tipo = 1 '
           
                Else
               
                'tipo = 0
               
                End If
               
        End If
       
        Next k
       
        If (tipo = 1) Then
       
            Cells(i, 17).Value = "0"
           
            Else
           
            Cells(i, 17).Value = "1"
       
        End If

Next i





Em que Cells(k, 20) é o inicio do proprietário e Cells(k, 21) é o fim do proprietário.
Já Inicio e fim é o inicio e fim do vão, respectivamente.

Mas mesmo assim o código fica inviavel. Preciso de uma solução mais rápida. Por isso estava vendo como resolver isso com uma função direta do excel.
Apenas usuários registrados podem ver ou baixar anexos.
Avatar do usuário
Por Jimmy 12 Ago 2019 às 23:59
Membro 5 Estrelas
Mensagens: 1195
Reputação: 804
#46777
Donrafy,

O código que você postou está incompleto, logo, não dá pra testar.

Eu rodei em meu PC todas as linhas em 0,3 segundos. Já quanto rodei apenas 1 vão, deu 0,07 segundos.

Há algo de muito errado no teste que você fez. Foi exatamente essa planilha que você postou, a que serviu de testes e demorou minutos?

Para processar tudo faça assim.
- Apague o conteúdo da coluna E para se certificar que todas as linhas de vãos serão processadas.
- Altere o valor de um proprietário qualquer. Na verdade nem precisa alterar, edite a célula e tecle ENTER.
- Verá que foi tudo reprocessado porque a coluna E será toda refeita.
- A execução é quase instantânea.

Porém, se você está transportando a macro para outra planilha de testes, então preciso analisar aquela planilha pra reproduzir a demora aqui no meu PC. Só assim pra pegar o problema.

Qual o tempo de execução que você julga satisfatório pra você, quando tiver as 700 linhas de vãos e 500 proprietários?

Jimmy San Juan
Por donrafy 14 Ago 2019 às 01:10
Membro 1 Estrela
Mensagens: 15
Reputação: 1
#46835
Desculpa a demora de responder,

segue a planilha completa com o meu código em vba (o da resposta anterior) em funcionamento ("duvida-meu-codigo"). Acho que ela ficou um pouco mais rápido do que seu código.
a planilha "dúvida(completo)" é a que você usou para fazer o código com todos os vãos.

Estou achando incrível, você conseguiu executar os 386 vãos em 0,3s?
Pelas suas contas de 0,07 s por linha o código ia demorar 27s, sem considerar que o número de proprietários cresceu também.
Após reiniciar o pc e deixar a memória o mais vazia possível demorei 1,1 minutos para execução do código.

Enquanto menos tempo melhor. Minha meta era tentar se algo instantâneo.

Acho que consegui fazer por somases/cont.ses, estou represetando na planilha em anexo ("dúvida(Completo-fc excel)"). Estou revisando para ver se está realmente correto. MAs acho que é a solução mais rápida.

Agora eu vi seu código em VBA para resolver o problema. Achei incrível sua soluçã e muito organizado. Consigo faze-lo em forma de executável, possuindo as informações de proprietários e vãos em planilhas diferentes?
Se puder dar alguma orientação de como modificar isso ficaria muito grato. Muito obrigado Jimmy San Juan
Apenas usuários registrados podem ver ou baixar anexos.
Avatar do usuário
Por Jimmy 14 Ago 2019 às 03:44
Membro 5 Estrelas
Mensagens: 1195
Reputação: 804
#46838
Olá Donfaty,

O ponto chave no momento é desvendar a questão do tempo de execução. No meu PC, testei novamente, e deu 0,28s.

Os 0,07s não são precisos, porque meço o tempo pela diferença do timer inicial e final. A resolução é de aprox 0,03, mas hora demora o dobro (um passo de resolução a mais), e hora marca zero (1 passo de resolução a menos). Eu te passei 0,07 porque foi o máximo que deu. Por isso não dá pra multiplicar 0,07 pela quantidade de linhas a processar para obter o tempo total.

Segue abaixo a planilha novamente. Note que a coluna E está em branco, indicando que nada está processado.
Te peço que a abra, não altere nada, apenas edite um vão e sem alterar tecle enter.
Em seguida faça o mesmo para um proprietário.

No editor do VB, na tela do Debug estarão os tempos gastos com esses 2 processamentos.

Se continuar a demorar, faça o mesmo teste em outro computador, porque lhe garanto que aqui roda completo em 0,3s.

Se alguém estiver acompanhando o tópico e puder testar para nos passar os resultados de tempo gasto, agradeceremos.

Jimmy San Juan
Apenas usuários registrados podem ver ou baixar anexos.
Por donrafy 14 Ago 2019 às 23:28
Membro 1 Estrela
Mensagens: 15
Reputação: 1
#46882
Dessa vez ficou praticamente instantâneo. Não precisou fazer nenhuma modicação?
Agradeço muito. Resolveu meu problema da melhor forma possível. E da forma mais estilosa também, eu diria. MUITO obrigado Jimmy San Juan.

Desculpa incomodar mais um pouco mas consegui modificar facilmente as colunas em que às análises serão feitas, mas também consigo mudar a planilha que a análise é feita?
gostaria de colocar restrição de acesso às duas planilhas. Em uma so ia possuir a planilha vão e na outra os proprietários (conforme planilha em anexo).

Não consegui vizualizar como fazer isso de forma simples no seu código. É tranquilo fazer essa modificação?
Apenas usuários registrados podem ver ou baixar anexos.