Notifications
Clear all

[Resolvido] Como verificar se n°s estão sequenciados e começando por 1?

8 Posts
3 Usuários
4 Reactions
1,236 Visualizações
(@fefo32br)
Posts: 44
Eminent Member
Topic starter
 

Olá,

por favor, como consigo verificar via fórmula (em apenas UMA célula) se um range contém n°s sequenciados corretamente (1, 2, 3, 4, 5...etc) e iniciando pelo 1?

*observação, haverão células em branco entre os dados.

Exemplo do resultado esperado no anexo em excel

Obrigado

 
Postado : 07/07/2022 11:40 am
(@Anônimo)
Posts: 0
 

Boa noite, Brother!

 

Aproveitei seu problema para ter o meus primeiros contatos com VBA então o código da função criada está com uma cara meia ruim mas está funcional:

Function IsSequence(ParamArray values() As Variant) As String
    
    Dim total1 As Double
    
    Dim total2 As Double
    
    Dim rng As Variant
    
    Dim n As Integer
    
    Dim Cond1 As String
    
    Dim Cond2 As String
    
    Dim Cond As String
  
    Cond1 = "OK - Números sequenciados e começam pelo 1"
    
    Cond2 = "ERRO - Números não sequenciados ou não começam pelo 1"
    
    n = 1
    
    ' Ciclo nos diferentes parâmetros indicados
    For Each rng In values
    
            'Novo ciclo nas células do Range
            Dim cell As Range
            For Each cell In rng

                    'Verifica se é um número, por exemplo k, se for calcula-se total  = total_anterior + n * 2^k
                    If (IsNumeric(cell)) And (Not (IsEmpty(cell))) Then
                    
                        total1 = total1 + n * WorksheetFunction.Power(2, (cell.Value))
                        
                        n = n + 1
                        
                    End If
                    
            Next
    Next
    
    'Devemos retirar 1 unidade de n, para que ele indique corretamente a quantidade de celular não vazias.
    n = n - 1
    
    'Calcula quanto deve dar o total1 se os numeros estiverem sequenciados e começando pelo 1 usando o fato que 1*2^1 + 2*2^2+ 3*2^3 + ...+ n*2^n = (n-1) * 2^(n+1) + 2
    
    total2 = (n - 1) * WorksheetFunction.Power(2, n + 1) + 2
    
    'Compara total1 com total2
        If total1 = total2 Then
                
        Cond = Cond1
    
    Else
    
        Cond = Cond2
    
    End If
    
    IsSequence = Cond
    


End Function

 

Para verificar se está em sequencia, na ordem correta, e começando por 1, desenvolvi uma formula para calcular a soma dos termos de uma sequência dada por a_n  = n * 2^n. Assim,

 

1*2^1+2*2^2+...+n*2^n = (n-1)*2^(n+1)+2.

 

Como esse resultado só vale nas condições corretas, se a soma, a_1+a_2+a_3+...+a_n  = total 1 for diferente de (n-1)*2^(n+1)+2 = total 2. Então, não está em sequência ou não começa com 1.

 

Meio complicado mas se precisar de mais esclarecimentos estou à disposição.

 

Att

CirimuH  

 

 
Postado : 08/07/2022 9:22 pm
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Olá, @fefo32br

Para a primeira linha, tente a seguinte fórmula matricial, depois arraste para as demais. Lembre-se de finalizar com CTRL SHIFT ENTER ao invés de apenas ENTER:

=SE(E(MODO.MULT(SE(B2:I2 <> "" ;{1;1} * B2:I2 ) ) = LIN( INDIRETO( "1:" & CONT.VALORES(B2:I2))));"OK";"ERRO")

A fórmula vai retornar apenas "OK" ou "ERRO" pois imaginei não ser necessário diferenciar o tipo de erro (fora da sequência, não começando com 1 ou ambos). Se desejar fazer essa diferenciação, é só incrementar ela com essas restrições (nos avise se sim).

Se seu Excel for o mais novo (365), dá pra simplificar com outras funções mais novas.

 

 
Postado : 10/07/2022 3:25 am
fefo32br and P@tropi reacted
(@fefo32br)
Posts: 44
Eminent Member
Topic starter
 

@cirimuh10 muito obrigado!!!
funcionou direitinho!!!

Abs

 
Postado : 11/07/2022 9:23 am
(@fefo32br)
Posts: 44
Eminent Member
Topic starter
 

@edsonbr Incrível...
quarta ou quinta vez que vc me ajuda aqui... seu conhecimento do excel é incrível. Tenho uma "inveja" boa de vc rsrsrsr
MUITO obrigado novamente.
Abs

 
Postado : 11/07/2022 9:25 am
EdsonBR reacted
(@fefo32br)
Posts: 44
Eminent Member
Topic starter
 

@edsonbr Meu excel é sim 365... por curiosidade, como vc simplificaria? pensei em usar a =SEQUÊNCIA. É isso?
sem querer abusar da sua boa vontade, pode por favor colocar a versão simplificada para eu estudar?

Obrigado!!

 
Postado : 11/07/2022 2:09 pm
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Combine a nova função FILTRO com a função que você citou (SEQUÊNCIA). A primeira irá filtrar apenas números (É.NÚM), deixando de fora as vazias, e a segunda irá gerar a sequência de 1 até a CONT.NÚM do intervalo:

=SE(E(FILTRO(B2:I2; ÉNÚM(B2:I2 )) = SEQUÊNCIA(1; CONT.NÚM(B2:I2 ))); "OK"; "ERRO")

 
Postado : 11/07/2022 2:26 pm
fefo32br reacted
(@fefo32br)
Posts: 44
Eminent Member
Topic starter
 

@edsonbr Verdade!! MUITO obrigado de novo... me ajudou demais

 
Postado : 11/07/2022 6:12 pm