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