Página 1 de 1

Segurança de macros com Private - dúvida

Enviado: 18 Ago 2017 às 10:41
por gilbertjuniors
Galera, bom dia.

Desenvolvi uma planilha, separei em módulos, cada um agrupando funcionalidades por características similares.
A questão é a seguinte: Não quero que o usuário possa acessar as Subs e Functions, pensei em colocar como Private porém, quero que macros (Subs) internas possam acessar.

Códigos de exemplo ilustrativo abaixo:

Código acessado pelo usuário
Código: Selecionar todos
Option Explicit

Sub Acesso()
    Call Rotina
End Sub
Código interno
Código: Selecionar todos
Option Explicit

Private Sub Rotina()
    MsgBox "acessou"
End Sub
A chamada Call dá erro, como posso resolver?

Segurança de macros com Private - dúvida

Enviado: 18 Ago 2017 às 11:20
por wesleyribeiro123
Gilbert
Bom dia,

Amigo, existe uns caras feras aqui no Forum, mas a principio acredito que não seja possível fazer o que deseja... O único bloqueio de acesso que tenho conhecimento é para o VBAProject e este bloqueia toda a tua estrutura, a questão da Sub ser Private ou Public é apenas para controle das Classes, ou seja, se você declara uma Sub como Private não pode acessar nem ela nem as variáveis que nela contém por outra Classe, foi este o motivo da chamada Call ter dado erro... Apenas para teste, altere a Private Sub Rotina() para Public Sub Rotina() e verá que o Call funcionará corretamente...

Resumindo, Private e Public Sub não é para bloqueio de acesso do usuário final, serve como um controlador para definição das Classes...

Re: Segurança de macros com Private - dúvida

Enviado: 18 Ago 2017 às 11:25
por gilbertjuniors
Galera, já encontrei a solução no site http://wellsr.com/vba/2015/excel/3-ways ... er-module/

Seguem os códigos de exemplo que criei baseado na explicação deste site, por módulo

Module1
Código: Selecionar todos
Option Explicit

Private Sub PrivateCallDemo1()
    Application.Run "Module2.HelloWorld1"
End Sub

Private Sub PrivateCallDemo2()
    Call Module3.HelloWorld2
End Sub

Private Sub PrivateCallDemo3()
    Call Module4.HelloWorld3
End Sub
Module2
Código: Selecionar todos
Option Explicit

Private Sub HelloWorld1()
    MsgBox "Hello World 1", , "wellsr.com"
End Sub
Module3
Código: Selecionar todos
Option Explicit
Option Private Module

Public Sub HelloWorld2()
    MsgBox "Hello World 2", , "wellsr.com "
End Sub
Module4
Código: Selecionar todos
Option Explicit

Public Sub HelloWorld3(Optional byDummy As Byte)
'Module 1
    MsgBox "Hello World 3", , "wellsr.com "
End Sub
Alguém sabe dizer as vantagens e desvantagens de cada um dos métodos Application.Run, Option Private Module e (Optional byDummy As Byte) ?

E, conforme mencionado pelo wesleyribeiro123, eu já havia protegido com senha no VBAProject mas, as macros eram acessadas pelo usuário usando Alt + F8, o que eu queria era impedir este acesso direto. Agora está resolvido, o acesso é somente via botão ou por macro publica.