Notifications
Clear all

Compartilhando Conhecimento

24 Posts
3 Usuários
0 Reactions
3,014 Visualizações
(@trindade)
Posts: 0
New Member
Topic starter
 

Boa noite, Srs.

Estou aqui compartilhar o conhecimento dessa vez.
Vi alguns tópicos, quanto a dificultar a planilha com senhas e tudo mais, em meu caso foi diferente a necessidade, a planilha tem um limite de vezes a ser utilizada, e para atender a minha necessidade montei um algoritmo que gera uma chave.

Lógica da Chave:
1. Identifica o mês atual
2. Fatia o mês letra por letra
3. Identifica qual a posição de cada letra no alfabeto
4. Encontra a posição(J = 10, A = 1 ...) , multiplica por 7 (ou qualquer outro número de sua escolha) deixando a com três casa decimais (J= 070, A = 007 ...)
5. Concatena letra a letra montado uma sequência com a posição da letra (070007...)
6. Pega a data atual em número serial, insere no inicio da sequência gerada acima (42422070007...)
7. Feito tudo isso deixa a sequencia com 32 caracteres (42422070007...)

Chave: 42423720602640602160601082161800
Data = 42423
F = 720
E = 602
V = 640
E = 602
R = 160
E = 601
I = 082
R = 161
O = 800

Obs.: A chave e valida para o dia, se for digitado no dia seguinte não vale mais, e necessário um nova chave para aquele dia.

O arquivo que montei é coisa bem simples, na Plan1 na célula A1 esta sendo incrementada a cada vez que o arquivo é aberto conforme evento Workbook_Open executado em EstaPasta_de_trabalho, a minha necessidade era limitar a quantidade de vezes a serem aberto o arquivo, para isso declarei uma variável com a quantidade que desejo que ela solicite a renovação de chave, e a cada vez que o arquivo for aberto alem de incrementar a celula A1, realiza a comparação com o valor da célula A1 com a quantidade da variável.
Quando aplicação esta estiver faltando 3 utilizações o usuário será notificado por uma mensagem que a renovação da chave esta próxima.

Após expirar a chave de utilização da aplicação será solicitado uma nova chave, onde o usuário terá três tentativa de digitar uma chave valida.

Em seguida será solicitado a nova chave de ativação da aplicação através de um inputbox

O algoritmo verifica se a chave corresponde com os parâmetros da lógica e valida a utilização pela quantidade definida.
Geração da chave e realizada via UserForm

Ao clicar em "Ok" copia a chave, para ser enviar ao usuário.

Galera como disse no inicio é coisa bem simples que montei, estou aqui compartilhando com todos o conhecimento, sei muito bem que pode ser melhorada a lógica e a ideia, anexo tem o arquivo para ser melhorado.

É isso ai galera, espero que tenha conseguido, passar algo de produtivo, agradeço a todos pelo tempo e ajuda que nos fornece.

 
Postado : 22/02/2016 6:30 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde Trindade,

Dá uma olhada e vê se ajuda.

• Altera a contagem internamente no código;
• Limita a alteração do nome do arquivo;
• Limita a quantidade de vezes que o arquivo pode ser aberto;
• Possibilita a digitação de uma senha para zerar a contagem caso seja atingido o limite...

Resumindo, é isso. A senha é "123"
Não fiz muitos testes...

Qualquer coisa da o grito.
Abraço

 
Postado : 25/02/2016 11:18 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Pois é Edson,

Pensei em fazer no registro do Windows, mas bastava abrir a planilha em outra máquina, fora a questão de segurança, não somente do windows como você disse, mas tem a questão do anti vírus também.

Dá uma olhada no último arquivo que postei... Mais algumas maneiras né... Somente para dificultar, pois segurança é complicado.

Trindade, tem como disponibilizar a UDF PreencherZeros()?

Comecei a analisar aqui, mas pode ser que não chegue no resultado correto.

Ela seria algo como:
Format(vDia * vMult & VSenha, Application.WorksheetFunction.Rept(0, 32))
??

Os dias 16 de cada mês do ano de 2016 retornam "0000000", já no ano de 2017 é o dia 17 de cada mês.
Isso se dá pelo fato de que o valor atribuído ao "Multiplicador", se resulta da diferença da subtração do dia com o ano (em dois dígitos) e tudo que multiplica por zero, dá zero.

Fora que é muito preenchimento com zeros... Tem conta aí que é preenchida por 16 dígitos por exemplo. Pega a chave do dia 14/05/2016, 15/05/2016 ...

Qualquer coisa da o grito.
Abraço

 
Postado : 25/02/2016 12:47 pm
(@trindade)
Posts: 0
New Member
Topic starter
 

Boa tarde, Bernardo.

Trindade, tem como disponibilizar a UDF PreencherZeros()?

O código é esse:

' FUNCAO PREENCHER COM ESPACO A ESQUERDA E/OU DIREITA
Function PreencherEspaco(nPar As Variant, nOccurs As Integer, L_R As Boolean) As String

    Dim nSize As Integer
    Dim nParticle As String
    
    Let nSize = Len(Trim(nPar))
    
    ' Informa se será preenchido na frente (LEFT) ou atrás (RIGHT).
    If L_R Then
        Let nParticle = Space(nOccurs - nSize) & Trim(nPar)
    Else
        Let nParticle = Trim(nPar) & Space(nOccurs - nSize)
    End If

    Let PreencherEspaco = nParticle
    
End Function

' FUNCAO PREENCHER COM ZERO A ESQUERDA E/OU DIREITA
Function PreencherZeros(nPar As Variant, nOccurs As Integer, L_R As Boolean) As String

    Let PreencherZeros = Replace(PreencherEspaco(nPar, nOccurs, L_R), " ", "0")
    
End Function

Peguei na internet mas não me lembro o site pra dar os créditos.
Vou baixar seu arquivo para fazer teste, e verificar a questão das datas, conforme falado ...

 
Postado : 25/02/2016 2:38 pm
(@trindade)
Posts: 0
New Member
Topic starter
 

Bernardo

Fui testar seu arquivo apresentou o seguinte erro:

 
Postado : 25/02/2016 3:16 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Trindade, como disse lá rm cima...

Você terá que "Confiar no acesso ao modelo de objeto do projeto do VBA" dentro da "Central de Confiabilidade".

To no celular, então é bem complicado ajudar muito... Só amanhã de manhã... Kkkkk

Mas é no mesmo lugar onde habilida as macros automaticamente, sem ter a necessidade de habilitar a cada abertura do arquivo. Terá um CheckBox no final. Dá uma olhada lá.

Qualquer coisa da o grito.
Abraço

 
Postado : 25/02/2016 3:18 pm
(@edsonbr)
Posts: 0
New Member
 

Pois é Edson,

... Dá uma olhada no último arquivo que postei... Mais algumas maneiras né... Somente para dificultar, pois segurança é complicado...

Essa solução é genial! Muito criativa mesmo, alterando o valor da variável dentro do próprio código "durante o vôo" é show de bola.

Mas que ela também é meio "Frankestein" ah, isso também é, hehehe! . É como um neurologista ficar fazendo uma cirurgia no próprio cérebro, hehehe. O que a gente não se obriga a fazer, tudo em nome da segurança...!

É uma pena que, do lado de lá do teclado o usuário mal-intencionado também use ao máximo sua criatividade, num ciclo sem fim.

 
Postado : 26/02/2016 4:50 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Trindade, dá uma olhada.

[EDIT]
Devido a dois históricos de arquivos em anexos inválidos, segue abaixo o código usado.

Option Explicit

Public Function CRIPT(ByVal key As String) As String
Dim i                   As Long
Dim j                   As Long
Dim nChar               As String
Dim vSenha              As String
Dim vConvert            As String
Dim Resto               As Long
Dim RestoCaract         As Long
Dim RestoQualificador1  As Long
Dim RestoQualificador2  As Long
Dim ChaveElevadora      As Long
Dim ChaveMultiplicadora As Long
On Error GoTo zero
    
    RestoCaract = Len(key)
    RestoQualificador1 = RestoCaract Mod 2 + 1
    RestoQualificador2 = RestoCaract Mod 3 + 2
    
    For i = 1 To RestoCaract: nChar = nChar & Asc(Mid(key, i, 1)): Next i
    ChaveElevadora = Application.WorksheetFunction.Max(2, Digito(nChar)) + RestoCaract Mod 11
    ChaveMultiplicadora = Format(Left(ChaveElevadora ^ (RestoQualificador1 * RestoQualificador2), 2), "00")
    
    vConvert = nChar
    For i = 1 To Application.WorksheetFunction.Max(0, 32 - Len(Left(Len(vConvert), 32)))
        vConvert = vConvert & Digito(Mid(vConvert * ChaveMultiplicadora, i, 1))
    Next i
    
    For i = 1 To 32: vSenha = vSenha & Digito(Asc(Mid(vConvert, i, 1)) * ChaveMultiplicadora): Next i
    CRIPT = vSenha
    
    Exit Function
zero:
    CRIPT = "#ERR/CRIPT!"

End Function

Public Function Digito(ByVal nDV As String) As String
Dim nValid  As Variant
Dim nValor  As Variant
Dim i       As Long
Dim DV      As Long
Dim Mult1()
On Error Resume Next

    Mult1 = Array(7, 4, 1, 8, 5, 2, 1, 6, 3, 7, 4)
    nValor = Mid(nDV, 1, Application.CountA(Mult1))
    For i = 1 To Application.CountA(Mult1): DV = DV + Mid(nValor, i, 1) * Mult1(i - 1): Next i

    If DV Mod 11 = 10 Or DV = 0 Then
        Digito = 1
        Else: Digito = DV Mod 11
    End If

End Function

[/EDIT]

Qualquer coisa da o grito.
Abraço

 
Postado : 03/03/2016 11:22 am
(@trindade)
Posts: 0
New Member
Topic starter
 

B-A-R-A-L-H-O

Ficou muito top seu código velho.
Vou estudar ele pra tentar implementar na minha aplicação!!
Top, top, top.

 
Postado : 03/03/2016 7:22 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

8-)

E a edição do código automática, conseguiu?

 
Postado : 04/03/2016 6:23 am
Página 2 / 2