... Assinatura do site por 3 anos + Kit MontaRibbons + 3 Livros em PDF + Diversas Revistas (pdf) de brinde, por apenas R$182,00
(
podendo parcelar em até 10 vezes no cartão de crédito)...

Clique aqui e obtenha mais detalhes do nosso kit completo e de como comprar.


Macro de Segurança e o CurrentProject.isTrusted

Códigos do Visual Basic for Applications (VBA) e de alguns comandos de Macros, vêm bloqueados por padrão.  A liberação desses recursos fica a critério do usuário, através de um aviso de segurança, quando se carrega o aplicativo. 

Dependendo do tipo de configuração do programa,  poderá receber formatos de aviso diferentes.  Um deles é o que você vê abaixo (modo runtime):

Usando Access

Ao clicar em Abrir, o usuário estará autorizando o Banco de Dados a utilizar-se do VBA e das Macros que estão bloqueadas.

Toda vez que se carregar o aplicativo, a mensagem de advertência se abrirá para que o usuário,  novamente, autorize a abertura ou não.

O outro tipo de formato é esse abaixo:

Usando Access

 

Clicando no botão Opções..., do aviso de segurança é aberta a tela Alerta de Segurança, que permite habilitar os recursos bloqueados.

No Tutorial Configurando Macro de Segurança foi explicado, em detalhes, como configurar um Banco de Dados, de modo que ele se torne confiável e esse aviso deixe de existir, mas ficou de fora do tutorial uma outra alternativa de configuração "oportunista" e que irei explicar aqui.

Veja, é possível detectar, através da nova propriedade IsTrusted do objeto CurrentProject, se o usuário permitiu a abertura do banco de dados com os recursos de Macro e VBA habilitados.   True(-1), significa que foram habilitados e false(0) de que não foram.   Se habilitados, pode-se, então, executar uma função, através do VBA, que configure o aplicativo para o modo confiável, não permitindo mais esse bloqueio incômodo.

Vamos precisar:

- de uma função que altere as configurações de segurança do aplicativo, no registro do Windows;
- da Macro AutoExec para detectar, na inicialização do aplicativo, se a segurança de macro está ou não habilitada.

Abra o módulo global e copie as funções abaixo:

Option Compare Database
Option Explicit

Dim CaminhoLoc As String
'--------------------------------------------------------------------------
Public Function fncConfigMacro()
Dim reg As Object
On Error Resume Next
'------------------------------------------------------------
'Se encontrar uma das configurações já feitas, abortar função.
'------------------------------------------------------------
If fncJaConfigurado Then Exit Function
'------------------------------------------------------------

Set reg = CreateObject("wscript.shell")
'------------------------------------------------------------
'Configurando como confiável a pasta aonde se encontra seu BD
'------------------------------------------------------------
reg.RegWrite CaminhoLoc & "AllowSubfolders", 1, "REG_DWORD"
reg.RegWrite CaminhoLoc & "Date", Date, "REG_SZ"
reg.RegWrite CaminhoLoc & "Description", "Projeto exemplo", "REG_SZ"
reg.RegWrite CaminhoLoc & "Path", fncLocalBd, "REG_SZ"

Set reg = Nothing
End Function

'--------------------------------------------------------------------------
Public Function fncLocalBd() As String
On Error Resume Next
'-----------------------------------------------
'Localiza a pasta do Banco de Dados em execução
'-----------------------------------------------
fncLocalBd = Application.CurrentProject.Path
End Function

'--------------------------------------------------------------------------
Private Function fncJaConfigurado() As Boolean
Dim reg As Object
Dim CaminhoGravado As String

Set reg = CreateObject("wscript.shell")
fncJaConfigurado = False
On Error Resume Next
 
'---------------------------------------
'Captura o caminho da pasta no registro
'---------------------------------------
CaminhoGravado = reg.RegRead(CaminhoLoc & "\path")
'------------------------------------------------------------
'Compara o caminho da pasta do registro com o caminho atual
'------------------------------------------------------------
If CaminhoGravado = fncLocalBd Then fncJaConfigurado = True
Set reg = Nothing
End Function
 
'--------------------------------------------------------------------------
Private Function fncCaminhoLoc() As String
Dim caminho As String
Dim nomeBd As String

'-------------------------------------------------------
'Captura o nome do seu aplicativo para cria o nome da 
'pasta no trusted locations
'-------------------------------------------------------
nomeBd = CurrentProject.Name
nomeBd = Mid(nomeBd, 1, InStr(nomeBd, ".accd") - 1)

'--------------------------------------------------------------
'Monta caminho do registro em função da verão atual do Access 
'e do nome do seu aplicativo
'--------------------------------------------------------------
caminho = Replace("HKEY_CURRENT_USER\Software\Microsoft\Office _
\[v]\Access\Security\Trusted Locations\[bd]\", "[v]", Application.Version)
 
caminho = Replace(caminho, "[bd]", nomeBd)

'------------------------------------------
'Passa o caminho do registro para a função
'------------------------------------------
fncCaminhoLoc = caminho
End Function

Crie uma macro de nome AutoExec e configure conforme a imagem:

Usando Access

Observe a linha CurrentProject.isTrusted=-1 na coluna de condição, ou seja, só executa a função se for detectado pela propriedade IsTrusted,  que o usuário autorizou o uso do VBA.

Este código foi projetado para atender as versões do Access 2007, 2010 e 2013.

Download

Sucesso!


 

Artigos Relacionados
 
Macro de Segurança
 

 


43 comentários

paulo gesse da costa   28/05/2010 22:30:01

show de bola!

Juan   02/02/2011 14:04:46

Olá Avelino,
Muito Bom, uma pergunta, já uso sua AutoExc para Checar vínculo, como posso fazer para incluir?

Grato.

Avelino Sampaio   02/02/2011 14:27:16

Juan,

Na macro AutoExec, insira primeiro o código do istruted e na linha seguinte inclui o de Checar Vínculo

Sucesso

João Eduardo   11/02/2011 09:55:03

Ola Avelino
otimo o seu modulo mas deu erro de sintaxe,abre uma caixa pedindo para verificar o codigo e recompilar .Meu Ofice é 2007 .O que devo Fazer?

Avelino Sampaio   14/02/2011 08:12:03

João,

Vá na seção "Contato" do site e me passe mais detalhes.

no aguardo

Rogerio   27/10/2011 08:38:18

Primeiramente parabens pelo exemplo.

Baixei seu exemplo e vi que tem um formulário inicial que é aberto automaticamente.

A minha duvida é o seguinte: esse formulário é essencial para o funcionamento ou é apenas para ilustração/explicação, ou seja se eu quiser usar em meus projetos só tenho que copiar o macro e o modulo é isso?

Avelino Sampaio   27/10/2011 17:47:43

Rogerio,

só tem que copiar a macro e o módulo.

Sucesso!

Fabricio   20/11/2011 19:51:31

Eu abri o exemplo, mas mesmo assim aparece "Certos itens do conteúdo do banco de dados foram desabilitados", o que eu faço ?

Avelino Sampaio   21/11/2011 07:18:16

Fabricio,

lembrando, que ao rodar pela primeira vez, o Access irá abrir a tela de aviso. Da segunda vez em diante estará livre do aviso.

Vá na seção "contato" aqui do site e esclareça melhor a situação.

Grato

Eder Castro   05/12/2011 16:33:13

Avelino parabens sem palavras pelo site, vc e o Valdino estão de parabens, depois q conheci o site minhas aplicações nunca mais foram as mesmas melhoram muito graças ao conhecimento compartilhado de vcs, obrigado mesmo.

Avelino Sampaio   06/12/2011 08:20:41

Eder,

obrigado pelo feedback e sucesso!


Marcus Porfirio   09/01/2012 12:16:29

Avelino tenho uma pergunta a fazer (gostaria que vc me falasse se estou correto),
Se o meu banco estiver em um pendrive e se eu utilizar esta solução pode ser que ela não funcione sempre, pois é possível que em um micro o caminho do banco seja diferente de outro (nem sempre a letra do drive do pendrive é o mesmo, uma hora é f: em outro pode ser outra letra) e ainda, em cada micro que eu abrir o banco primeiramente terei que autorizar pelo menos na primeira abertura o uso de vba, é isso?

Avelino Sampaio   09/01/2012 12:36:54

Marcus Porfirio,

vc está correto. Na primeira abertura o usuário terá que autorizar se a letra for diferente ou se for em um novo micro.

Sucesso!


OLDRI   08/05/2012 10:24:00

Avelino, existiria uma forma de aplicar sua função no Access 2003?
Obrigado

Ivair Martins   25/08/2012 13:18:26

Boa tarde Amigos, eu baixei o exemplo anexado pelo Avelino e coloquei ele em rede, na maquina do servidor funciona perfeitamente mas na maquina do cliente aparece a Msg de Aviso aí eu clico em habitar ele habilita normalmente pq eu clico no Botao do Form aparece a msg 'O VBA esta liberado', mas quando eu fecho o arquivo e depois vou reabri-lo a Msg aparece novamente, já olhei no Editor de registro da Maquina Cliente e na pasta Trusted Localtions está o arquivo gravado e no nome do Caminho (Path) está ( \\198.162.0.1\MinhaPasta ) onde seria o caminho no meu Servidor, onde será que eu estou errando?
Obrigado...

Avelino Sampaio   25/08/2012 14:52:58

Ivan,

como o local é na rede, talvez tenha que ativar esta permissão.

Crie um variável para receber o caminho:

Exemplo para o Access 2007

CaminhoTrust = "HKEY_CURRENT_USER\Software\Microsoft\Office \12.0\Access\Security\Trusted Locations

Acrescente a gravação da chave (AllowNetworkLocations), que permite a liberação pela rede.

reg.RegWrite CaminhoTrust & "AllowNetworkLocations", 1, "REG_DWORD"


Sucesso!

Ivair Martins   26/08/2012 10:19:47

Bom dia Avelino, Tudo bem

Então no arquivo do exemplo que eu baixei já tem na 'Função fncConfigMacro' essa linha abaixo:
'libera pasta de rede
'-----------------------
reg.RegWrite fncCaminhoLoc(True) & "AllowNetworkLocations", 1, "REG_DWORD"
'-----------------------
Não seria isso?? Não sei o que estou fazendo de errado, estou testando esse exemplo na Rede para depois usar no meu programa.
Obs: Não entendi bem "criar uma variavel" vc poderia me explicar por favor e dar um exemplo é a primeira vez que eu vou colocar um programa em rede.

Obrigado...

José Donizeth Rodrigues   03/09/2012 12:16:35

Uso o access 2010, sendo que a aplicação roda em rede e mesmo com a adpatação do exemplo para minha aplicação, o access continua solicitando autorização de segurança de macro, toda vez que algum usuário abre a aplicação em suas máquinas.

José Donizeth Rodrigues   03/09/2012 12:37:19

Macro de segurança

Uso o access 2010, sendo que a aplicação roda em rede e mesmo com a adpatação do exemplo Tuto5 para minha aplicação, o access continua solicitando autorização de segurança de macro, toda vez que algum usuário abre a aplicação em suas máquinas. Só esclarecendo que minha aplicação é distribuida via access runtime, uma vez que os usuários não possuem access instalado em suas máquinas.

José Donizeth Rodrigues   03/09/2012 13:05:25

O front-end do meu BD está em rede, na máquina servidora.

Avelino Sampaio   03/09/2012 13:18:15

José,

Observe a orientação que passei para o amigo IVAN. Se não funcionar com o acrescimo no resgistro do AllowNetworkLocations , vc deverá deslocar seu front-end para a máquina local. Cada máquina deverá ter o seu front-end.

Sucesso!

Almir   08/11/2012 07:55:42

Avelino valeu por mais essa ajuda...

Andre   01/03/2013 18:57:45

Muito bom seu módulo! Ele só serve para aplicações no Access ou serveria também para aplicações no Excel?

Andre   01/03/2013 19:02:57

Muito bom seu módulo! Ele só serve para aplicações no Access ou serveria também para aplicações no Excel?

Avelino Sampaio   02/03/2013 07:31:41

Andre,

Não tenho conhecimento sobre como funciona o VBA para o Excel.

Por gentileza, visite o site do meu amigo Felipe Costa, que irá conseguir esta informação.

Copie e cole o endereço abaixo no seu navegador.

http://www.ambienteoffice.com.br

Sucesso!

Andre   05/03/2013 00:32:22

Olá Avelino. Já consegui uma solução bem parecida com a sua. Muito obrigado assim mesmo.

Andre   13/03/2013 07:13:34

Oi Avelino,
Por um acaso você já se deparou com um "Erro de tempo de execução '57121': Erro de definição de aplicativo ou de definição de objeto"? Bom estou me deparando com esse problema, mas o mais estranho é que ele não aparece logo da 1ª vez que abro o arquivo. Das primeiras vezes o arquivo abre normalmente e, de repente, o erro acontece e as macros e projeto em VB não funcionam mais. O arquivo abre, mas como se fosse uma Pasta de Trabalho do Excel normal e não a Habilitada para Macros como deveria ser.
Se puder me esclarecer algo sobre esta situação agradeço.

Erick Felix da Silva   04/06/2013 08:30:42

Olá amigo. Muito obrigado pela macro, vai quebrar um galho de muita gente ainda! Só uma pergunta, no access 2010 existe a opção "Ocultar painel de navegação" que oculta esse painel aonde aparece a macro. É necessário que o painel não esteja oculto para que a macro autoExec funcione? Agradeço desde já, abraço!

Avelino Sampaio   05/06/2013 08:05:11

Erick,

vá na seção "DICAS" aqui do site e leia o artigo "Desabilitando o Painel de Navegação"

Sucesso!

Muito obrigado Avelino   02/07/2013 13:12:42

este site tem sido muito util pra mim, inclusive faço agradecimentos na tela splash do aplicativo citando diretamente a colaboração de Avelino Sampaio

Muito obrigado Avelino   02/07/2013 13:17:25

este site tem sido muito util pra mim, inclusive faço agradecimentos na tela splash do aplicativo citando diretamente a colaboração de Avelino Sampaio

Filipe   06/05/2014 13:20:45

Ola Avelino,

não funciona tentei de tudo simplesmente parece que o código não existe.

Guto Ferrari   18/08/2014 17:16:54

Olá Avelino!
Parabéns pelo site! Excelente iniciativa que ajuda demais os desenvolvedores iniciantes!!!!

Copiei o autoexec e módulo, mas ele não faz nada no meu BD.
Porém quando eu o executo no seu arquivo de exemplo, roda perfeitamente.

O que pode estar havendo?

Guto Ferrari   18/08/2014 17:22:18

Só para complementar: inseri um Caixa de Mensagem para ter certeza que o autoexec estava mesmo executando e está. Acho que é algo com o código.

Atenciosamente

Guto Ferrari   18/08/2014 17:26:32

Matei o problema e acredito que seja o mesmo problema do Filipe, que postou acima de mim.

Uma das linhas do código extrai o caminho do BD, excluíndo o nome do arquivo com extensão .accdb.
O BD que eu utilizei o código era extensão .mdb. Bastou alterar a extensão e o código funcionou perfeitamente. Fica a Dica!

Abraços

Sidinei da Rosa   24/04/2015 10:00:54

Otimo funcionu perfeitamnte.

Só uma pergunta funciona para todas as versoes do access?
até 2013?

Avelino Sampaio   25/04/2015 06:50:12

Sidnei,

sim, funciona nas três versões (2007, 2010 e 2013).

Sucesso!

Gustavo   01/09/2015 14:06:35

Obrigado pelas explicações, já o acompanho uns 3 anos com os seus projetos, inclusive já comprei o seu monta ribbons que por sinal é de grande qualidade me ajuda em meus projetos até hoje.

Maria Isabel Costa   21/10/2015 10:48:00

Apliquei o seu código na minha BD e funcionou corretamente com o sistema operativo Windows 10, no entanto quando abro os formulários através de botões, uns consigo abrir bem noutros dá um erro e todas as tabelas, consultas desaparecem. Fecho a BD e volto a entrar e nesse formulário que deu erro já consigo entrar, mas ao abrir outros volta a acontecer o mesmo. Não sei se terá a ver com as macros de segurança, não consigo compreender o motivo, porque noutros pcs o programa funciona corretamente. Será que me pode dar uma ajuda. Obrigada

Nilson   02/03/2016 09:22:29

Bom dia,

Em caso de utilizar RUNTIME 2010... Como posso fazer funcionar meu sistema que estou criando? Utilizai o IsTrusted, mas ele me retorna que:

"Você tentou executar uma macro ou utilizou o objeto DoCmd no VisualBasic... etc etc..."

Se eu rodo o Maestro_v5 ele funciona normal no RUNTIME...
Outra coisa que noteié: Se deixar o caminho do be configurado (em access completo libero a habilitação do macro e defino um caminho e reproduz o mesmo caminho no PC com RUNTIME) ai o meu sistema abre normalmente...

Eu uso os códigos do Maestro para criar a conexão e vinculo com o caminho be...

O que poderia ocasionar esse erro no meu sistema sendo que é o mesmo código que funciona com o Maestro?

Grato,

Jose Carlos   06/04/2016 10:20:30

bom dia amigo no meu banco de dados esta dando este aviso
Aviso de segurança certo itens do contetudo do banco de dados foram desabilitados, noão consigo abrir o formulario, pode me ajudar, obrigado,um abraço

MS ACCESS 2016 E RUNTIME 2016   02/06/2016 14:25:13

Boa tarde Avelino o Access 2016 não reconhece a função =fncConfigMacro()

Caio Fábio   21/09/2016 08:43:27

Bom dia Avelino,

A minha pergunta está associada a pergunta João Eduardo, em 11/02/2011 as 09:55:03.

Nessa parte dá erro e pode para compilar, poderia me ajudar?

caminho = Replace("HKEY_CURRENT_USER\Software\Microsoft\Office _
\[v]\Access\Security\Trusted Locations\[bd]\", "[v]", Application.Version)


Uso Access 2010.


Envie seu comentário: