Notifications
Clear all

Segurança de um Workbook (discussão / opiniões / sugestões)

14 Posts
4 Usuários
0 Reactions
3,344 Visualizações
(@finaljustice)
Posts: 91
Trusted Member
Topic starter
 

Boa noite,

Estou prestes a concluir um projeto que fiz para minha empresa, basicamente uma interface para vendedores realizarem pedidos através do excel, consultarem histórico de compras do cliente, escolher formas de pagamento. Enfim, tentei fazer o que chamo de ferramenta a mais completa possível e estes pedidos são enviados automaticamente através do outlook do vendedor para o faturista gerar uma nota fiscal em cima do pedido do vendedor.
Já coloquei para utilizarem e ainda estou aperfeiçoando essa "ferramenta" mas acho que tomei uma decisão equivocada para proteger as informações contidas no workbook aos funcionários.

Com a intenção de restringir o acesso as informações contidas nas planilhas, utilizo a userforms para interagir com o usuário e essas informações transitam pelo workbook etc. Para que o usuário não possa roubar as informações ou alterar por má índole utilizei duas maneiras para proteger tudo (além de travar o VBA com senha), usei
Com intenção de só permitir que a Userform seja acessada:

Application.Visible = False

Tentando restringir acesso as planilhas ao esconder elas assim como exemplo:

Sheets("Sheet1").Visible = xlVeryHidden 

Fiz algumas modificações que os usuário me solicitaram e eles estão usando uma primeira versão em que erros começaram a aparecer que não ocorrem comigo pois eu sei o que estou fazendo e sempre repito a "logica" que montei afinal foi eu quem fiz tudo sozinho (com ajuda deste fórum e Mr.Excel muito obrigado diga-se de passagem).

Estou suspeitando que esses erros são advindos da decisão que tomei de fazer com que o Excel ficasse invisível para os usuário, levando eles a minimizar tudo e "perder" a userform e tentar reabrir o arquivo novamente gerando conflitos.

Gostaria de sugestões de como restringir o acesso do usuário as planilhas, se há alguma maneira mais inteligente/ elegante de se fazer isso e se alguém poderiam me ajudar com os tratamentos de erros, posso disponibilizar o workbook aqui (só que sem as informações originais né...) mas o código para entendimento da userform aberto, até para quem quiser usar esse modelo para alguma futura empreitada.

Caso alguém possa me fazer sugestões de como modificar essa opção de segurança de esconder o aplicativo do excel do usuário e possa me ajudar a "brincar" no workbook e testar para ver os erros que são gerados ficaria muito agradecido. Não tenho ninguém que trabalhe comigo ou que eu conheça pessoalmente que tenha essa aptidão com VBA, então estou procurando ajuda externa.

Favor não entender de maneira errada, não estou solicitando que refaça ou façam algum trabalho por mim, é mais para se alguém tiver interesse e puder me ajudar a testar o que fiz e puder sugerir como torna-la mais seguro ficaria agradecido.

O que se precisa saber para tentar entender o projeto:
- Módulos 3 ao 7 estão com as rotinas relacionadas a userform
- Planilha chamada "BDNF" iria conter as informações importadas em xml das notas fiscais eletronicas da empresa (20k linhas que deixei 75 linhas como exemplo)
- Planilha chamada "BDCadastro" é aonde o usuário irá cadastrar clientes que ainda nao fizeram compras, os que fizeram compras já estariam colocados nesta planilha no formato para que o usuário não tenha que refazer cadastro de clientes que já compraram. É com base nessas informações que o pedido é gerado e enviado para o faturista.
- Planilha "Pedido" é exatamente o que ela quer dizer... é neste formato que ela será enviada para o faturamento
- No módulo 7, deixei em branco os campos de destino de email, então na insiram o seu email para testar receber (envio através do OUTLOOK, é necessário pra funcionar)
- Userform5 que seria a forma de pagamento não está 100% finalizada, mas a opção VISA já deixei funcionando só falta inserir essa informação na planilha de pedido antes de enviar por email.

Sugestão para que for tentar usar, abra uma instancia do VBA com um arquivo em branco e em seguida abra o arquivo que estou disponibilizando, assim você irá conseguir interromper as rotinas e olhar com calma a programação.

Mais uma vez, o projeto está 98% concluído basta eu aperfeiçoar a segurança que acredito que seja esse o ponto que esteja resultando em erros e talvez algum tratamento de erro que eu não esteja vendo pois não consigo gerar ele por saber exatamente como e o que deve ser feito.

Ficaria muito agradecido se alguém puder me ajudar e discutir nesse ponto de segurança e teste desse projeto que fiz e para quem tiver baixando ele para tentar usar e aprender e não entendeu o que foi feito, coloque suas perguntas aqui que responderei assim que tiver uma oportunidade.

Muito obrigado pela atenção.
FJ

 
Postado : 29/07/2013 6:43 pm
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

finaljustice,

Boa Tarde!

Antes de mais nada, parabéns pelo esforço e dedicação na elaboração do seu projeto. Somente quem conhece pode realmente saber o trabalho que da para se fazer algo assim.

Bom... quanto ao seu arquivo, baixei e abri o arquivo normalmente, todavia, não ocorreu nenhum tipo de erro por aqui.

Quanto à questão da segurança, você está correto na sua idéia. Entretanto, para evitar, por exemplo, que quando o usuário tenha outra planilhas abertas em seu micro, as mesmas também sejam fechadas quando eles executarem sua ferramenta, você deve, antes de utilizar "Application.Visible = False", checar, com o comando IF (por exemplo) se o arquivo que será fechado é realmente o arquivo referente à ferramenta. Ou seja, fechar apenas a ferramenta e não os demais arquivos abertos que o usuário está trabalhando. Para isso, você pode utilizar algo como o código abaixo:

    Dim Existe As Boolean
    
    For Each wk In Workbooks
        If wk.Name = "Configuração de Rf´s.xlsm" Then
            Existe = False
        Else
            Existe = True
            Exit For
        End If
    Next
    
    If Existe = True Then
        Application.Windows("Configuração de Rf´s.xlsm").Visible = False
    Else
        Application.Visible = False
     End If

No mais, não querendo desistimular a sua criatividade, todavia, na obrigação de esclarecer a verdade e contribuir com seu trabalho, gostaria de lhe dizer que nada que você faça em matéria de programação (principalmente com VBA) é 100% seguro e inviolável. Basta um usuário um pouco mais curioso do que os outros, com o mínimo de conhecimento de consultas na internet que ele vai descobrir um "sem número" de soluções (inclusive, desenvolvidas com VBA mesmo), gratuitas ou pagas, destinadas a quebrar qualquer tipo de senha. Fora isso, ele pode ainda saber que basta abrir seu arquivo com o aplicativo Calc do pacote BROffice para seus código (e a senha do VBA e de proteção das planilhas) estar completamente escancarado e disponível.

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 30/07/2013 1:29 pm
(@finaljustice)
Posts: 91
Trusted Member
Topic starter
 

finaljustice,

Boa Tarde!

Antes de mais nada, parabéns pelo esforço e dedicação na elaboração do seu projeto. Somente quem conhece pode realmente saber o trabalho que da para se fazer algo assim.

Bom... quanto ao seu arquivo, baixei e abri o arquivo normalmente, todavia, não ocorreu nenhum tipo de erro por aqui.

Quanto à questão da segurança, você está correto na sua idéia. Entretanto, para evitar, por exemplo, que quando o usuário tenha outra planilhas abertas em seu micro, as mesmas também sejam fechadas quando eles executarem sua ferramenta, você deve, antes de utilizar "Application.Visible = False", checar, com o comando IF (por exemplo) se o arquivo que será fechado é realmente o arquivo referente à ferramenta. Ou seja, fechar apenas a ferramenta e não os demais arquivos abertos que o usuário está trabalhando. Para isso, você pode utilizar algo como o código abaixo:

    Dim Existe As Boolean
    
    For Each wk In Workbooks
        If wk.Name = "Configuração de Rf´s.xlsm" Then
            Existe = False
        Else
            Existe = True
            Exit For
        End If
    Next
    
    If Existe = True Then
        Application.Windows("Configuração de Rf´s.xlsm").Visible = False
    Else
        Application.Visible = False
     End If

No mais, não querendo desistimular a sua criatividade, todavia, na obrigação de esclarecer a verdade e contribuir com seu trabalho, gostaria de lhe dizer que nada que você faça em matéria de programação (principalmente com VBA) é 100% seguro e inviolável. Basta um usuário um pouco mais curioso do que os outros, com o mínimo de conhecimento de consultas na internet que ele vai descobrir um "sem número" de soluções (inclusive, desenvolvidas com VBA mesmo), gratuitas ou pagas, destinadas a quebrar qualquer tipo de senha. Fora isso, ele pode ainda saber que basta abrir seu arquivo com o aplicativo Calc do pacote BROffice para seus código (e a senha do VBA e de proteção das planilhas) estar completamente escancarado e disponível.

Olá Wagner,
Muito obrigado pela atenção e feedback, realmente deu bastante trabalho para fazer funcionar e fiquei bem contente que alguém reconheceu a dificuldade de fazer isso... sou engenheiro de materiais mas aprendi o potencial que o vba e o excel tem na raça e agora quando apresento projetos assim nas empresas que passo, chefes ficam impressionados mas eles acham que é não seria tão difícil achar alguém com minhas aptidões embora eu desconheça alguém pessoalmente. Mas enfim obrigado!

A respeito da segurança, sei que não há nem um sistema 100% seguro, estou somente querendo dificultar, até porque acredito que os usuários que vão usar não tem tanto conhecimento para tentar se dar ao trabalho de "hackear" essa ferramenta, caso consigam ok não vou ficar sabendo mas pelo menos tentei.

Há outras alternativas que talvez eu desconheça para mitigar essa restrição do excel aberto fechando todas as janelas? Enfim... rodando mais de um workbook ao mesmo tempo na mesma instância. (reparei que caso os usuários queiram usar excel ao mesmo tempo que usam a ferramenta teriam que abrir outra instância do excel)

A respeito de erros, também não estive tendo problemas mas por incrível que pareca os usuários tem conseguido fazer com que ocorra algum erro... mas vale lembrar que é uma versão mais antiga, essa versão que disponibilizei ainda não entreguei, quis testar e aperfeiçoar antes de enviar. (mas as alterações são detalhes o corpo é o mesmo)

Finalmente, achei interessante essa opção de check que você sugeriu, mas está dando erro (O método 'Sheets' do Objeto '_Global' falhou)... acredito que seja porque o workbook da ferramenta deixe de ser o workbook ativo. Segue a rotina que modifiquei para tentar realizar o que sugeriu:

Private Sub UserForm_Initialize() 'start to load for userform
Dim Existe As Boolean
Dim wk As Workbook

Call ShowSheets
Sheets("BDCadastro").Select
Call loadinfos
UserForm1.ComboBox1.RowSource = "listanomes"
UserForm1.ComboBox2.RowSource = "listacpf"
UserForm3.ComboBox1.RowSource = "listacodprd"
UserForm1.MultiPage1.Value = 0
'UserForm1.ScrollTop = 0
'UserForm1.ScrollBars = 2
'UserForm1.ScrollHeight = UserForm1.Height * 1.1
'UserForm1.MultiPage1(2).ScrollBars = 2
'UserForm1.MultiPage1(2).ScrollHeight = MultiPage1.Height * 1.25
UserForm1.CommandButton7.Caption = "Salvar Conversa"
UserForm1.CommandButton8.Caption = "Realizar Pedido"

For i = 3 To 6
UserForm1.Controls("CommandButton" & i).Caption = "Editar"
Next
For Each wk In Workbooks
    If wk.Name = "Ferramenta_Para_Teste.xlsm" Then
        Existe = False
    Else
        Existe = True
        Exit For
    End If
Next
If Existe = True Then
    Application.Windows("Ferramenta_Para_Teste.xlsm").Visible = False
Else
    Application.Visible = False
End If

Como estou muito cansado no momento irei testar/ tentar corrigir amanhã, caso tenha uma sugestão aceito!!
Uma dúvida, embora não tenha parado para analisar com calma, esta último "Application.Visible = False" não deveria ser "Application.Visible = True" ?
Pois pensei,
Se o valor da variável Existe mudou para True então esconda, caso contrário deixe visível

Correto?

Mais uma vez Wagner muito obrigado e espero que outro participem da discussão.

Att,
FJ

 
Postado : 30/07/2013 5:05 pm
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

finaljustice,

Bom Dia!

A lógica é essa mesma que está no código. Aqui eu coloquei dentro do evento Workbook_Open. Ou seja, quando o arquivo que eu quero que apresente somente o formulário é carregado, eu verifico, através do For Each logo o primeiro nome dos arquivos abertos. Se o primeiro nome encontrado não for igual ao nome que dei ao arquivo, ele já pula para o else e seta a variável booleana para TRUE me informando que existem outros arquivos abertos. No passo seguinte do código, através do IF ele já cai de primeira, pois a variável booleana é verdadeira. Aí o que acontece? Como já sei que existem outros arquivos abertos, seto para FALSE a visibilidade apenas o meu arquivo e em seguida mostro o formulário que quero. Se a variável booleana fosse FALSE, no teste do IF o VBA iria para o ELSE e, então, como eu sei que não existem outros arquivos abertos, eu seto normalmente a visibilidade do Application para FALSE (pois só tem o meu arquivo) e carrego o formulário.

Para ilustrar, segue o arquivo onde coloquei esse tipo de código. Observe, que quando o usuário clicar no botão fechar do formulário, também é feito um teste para ver qual arquivo deve ser fechado.

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 31/07/2013 5:21 am
(@finaljustice)
Posts: 91
Trusted Member
Topic starter
 

finaljustice,

Bom Dia!

A lógica é essa mesma que está no código. Aqui eu coloquei dentro do evento Workbook_Open. Ou seja, quando o arquivo que eu quero que apresente somente o formulário é carregado, eu verifico, através do For Each logo o primeiro nome dos arquivos abertos. Se o primeiro nome encontrado não for igual ao nome que dei ao arquivo, ele já pula para o else e seta a variável booleana para TRUE me informando que existem outros arquivos abertos. No passo seguinte do código, através do IF ele já cai de primeira, pois a variável booleana é verdadeira. Aí o que acontece? Como já sei que existem outros arquivos abertos, seto para FALSE a visibilidade apenas o meu arquivo e em seguida mostro o formulário que quero. Se a variável booleana fosse FALSE, no teste do IF o VBA iria para o ELSE e, então, como eu sei que não existem outros arquivos abertos, eu seto normalmente a visibilidade do Application para FALSE (pois só tem o meu arquivo) e carrego o formulário.

Para ilustrar, segue o arquivo onde coloquei esse tipo de código. Observe, que quando o usuário clicar no botão fechar do formulário, também é feito um teste para ver qual arquivo deve ser fechado.

Muito obrigado mais uma vez!

Interessante, estou olhando aqui e surgiu algumas dúvidas.
Percebi que usar:

Application.Windows("Excel Invisível.xlsm").Visible = False

Esconde "melhor" o workbook desejado do que somente:

Application.visible = false

Até me atrapalhei pois quando quero mexer na programação da minha ferramenta para acessar tenho que abrir um workbook novo em branco e dai o VBA editor deste workbook em branco e só ai abrir minha ferramenta para poder acessar o VBA editor da ferramenta, e dai para tentar alterar os dados dos bancos de dados tentando fazer com que o workbook reapareça estava usando somente Application.Visible = True a nada acontecia, precisei usar no formato de "Application.Windows("Excel Invisível.xlsm").Visible = False" para que o workbook reapareça.

Vou tentar adaptar os códigos que passou no exemplo para a minha ferramenta, mas para isso preciso tentar entender como está sendo feito. Tentei procurar no google rapidamente, mas para mim não está claro o que "vbModeless" faz.

Tentei utilizar o código abaixo, porém estou tendo um erro: "Subscrito fora do intervalo"

Private Sub Workbook_Open()
Dim Existe As Boolean
    For Each wk In Workbooks
        If wk.Name = "Ferramenta Tahaa3.xlsm" Then
            Existe = False
        Else
            Existe = True
            Exit For
        End If
    Next
    
    If Existe = True Then
        Application.Windows("Ferramenta Tahaa3.xlsm").Visible = False
        UserForm1.show vbModeless
    Else
        Application.Visible = False
        UserForm1.show vbModeless
    End If
End Sub

Tentei criar uma variável pública "wba" para ser o este workbook e dai todos os lugares aonde tinha:

Sheets("nome da planilha").Range("A1").select

Aonde eu selecionava alguma coisa e que talvez fosse necessário apontar o workbook adicionei o wba antes assim:

wba.sheets("nome da planilha").Range("A1").select

Mas o erro persiste, você poderia me ajudar por gentileza?

Abraços,
FJ

 
Postado : 31/07/2013 1:33 pm
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

finaljustice,

VbModeless é uma constante do VB/VBA que informa ao processador se o formulário que está ativo deve ou não permitir que se trabalhe com outros aplicativos. Ou seja, de acordo com o estado dessa constante, o usuário precisa efetivar suas ações somente naquele formulário que está sendo exibido e depois fechá-lo para poder trabalhar em outra coisa qualquer. A situações, em que não se quer que o usuário dique preso a essa condição (formulário). Aí, é possível seta a constante para que o usuário possa ficar com o formulário aberto mas também possa abrir um outro aplicativo, por exemplo).

Com relação ao erro que você está encontrando, é proque o código não está achnado o seu arquivo.

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 01/08/2013 9:05 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Já experimentou "Compartilhar a Pasta de Trabalho"?

pode parecer estranho, mas deixe-me explicar...
Ao compartilhar a pasta de trabalho, mesmo que esta não seja utilizada por várias pessoas simultaneamente, o código VBA fica por padrão invisível simplesmente pq a pasta está compartilhada

ou seja, eu protegeria assim, para ter mais uma camada de proteção...

1) proteja seu código, com uma senha complicada (isso já dificulta pros programas que tentam com tentativa e erro);
2) proteja a pasta de trabalho e a(s) planilhas que precisar;
3) esconda as planilhas que devem ser muito bem escondidas com o xlSheetVeryHidden (e não xlVeryHidden);
4) compartilhe a pasta de trabalho, uma mensagem aparecerá na tela dizendo que será impossível visualizar o VBA, e se deseja continuar, diga que sim, continue;
5) feche e reabra seu xlsm, vá no vba e tente visualizar código... não conseguirã;

Seu programa está legal, mas há coisas que eu sugeriria algumas melhorias, por favor não se ofenda, é q 10 anos de experiência me fizeram meio chato, então segue outras dicas para melhorar seu código:

5) evite ao máximo esconder a aplicação, é certo que tudo bem, não é tão ruim assim, mas, porém contudo todavia, se seu código der um pau no meio da execução, seu Excel ficará aberto (será possível vê-lo pelo Gerenciador de Tarefas), mas inacessível. PRocure esconder somente a aplicação que está usando, ou, tornando o Windows("SeuPrograma.xlsm").Visible = False, ao invés de toda aplicação
6) evite ao máximo em seu código usar o ".select" ao final das linhas seguido na linha seguinte de "Selection." no início da linha. Consequentemnte, evite usar ActiveCell e ActiveSheet. Essa dica é toda voltada a desempenho.
7) Evite ao máximo usar o número 1048576 escrito no código, substitua por Sheets("BDCadastro").Rows.count (assim evita problemas de compatibilidade com Offices mais antigos e/ou mais novos, quando o numero de linhas aumentar...)
8) o invés de usar múltiplas condições IF ELSEIF ELSEIF ELSEIF ENDIF, use Select case, quando tem mais de 3, o select case tem uma performance MUUUITO mehor;
9) aprenda a usar referencias completas a objetos, exemplo:
linha q começa com

Range(ActiveCell, Cells(1048576, ActiveCell.Column).End(xlUp)).Select
Selection.Value = 1000

Eu faria

Dim QquerEndereco as string
with thisWorkbook.Worksheets("Pedido") 'sim, prefira o THISWORKBOOK ao ACTIVEWORKBOOK
     QquerEndereco = .Range("A" & .Cells(.rows.count,1).end(xlup).row+1).Address
     .Range(QquerEndereco).Value = 1000 '(exemplo tá)
end with

10) evitar ao máximo o tão famigerado On Error Resume Next, só usar em casos específicos em que uma justificativa plausível seja apresentada
11) saber editar códigos gravados com gravador de macros, mantendo somente o que você precisa, e tornando reutilizável

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 01/08/2013 10:28 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

E respondendo a dúvida:

wba.sheets("nome da planilha").Range("A1").select

só funcionará se a planilha "nome da planilha" estiver visível e selecionada

por isso que eu digo que selecionar planilha ou célula é problemático.... ;-)`

é possível fazer TUDO sem usar .Select....

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 01/08/2013 10:31 am
(@finaljustice)
Posts: 91
Trusted Member
Topic starter
 

Já experimentou "Compartilhar a Pasta de Trabalho"?

pode parecer estranho, mas deixe-me explicar...
Ao compartilhar a pasta de trabalho, mesmo que esta não seja utilizada por várias pessoas simultaneamente, o código VBA fica por padrão invisível simplesmente pq a pasta está compartilhada

ou seja, eu protegeria assim, para ter mais uma camada de proteção...

1) proteja seu código, com uma senha complicada (isso já dificulta pros programas que tentam com tentativa e erro);
2) proteja a pasta de trabalho e a(s) planilhas que precisar;
3) esconda as planilhas que devem ser muito bem escondidas com o xlSheetVeryHidden (e não xlVeryHidden);
4) compartilhe a pasta de trabalho, uma mensagem aparecerá na tela dizendo que será impossível visualizar o VBA, e se deseja continuar, diga que sim, continue;
5) feche e reabra seu xlsm, vá no vba e tente visualizar código... não conseguirã;

Seu programa está legal, mas há coisas que eu sugeriria algumas melhorias, por favor não se ofenda, é q 10 anos de experiência me fizeram meio chato, então segue outras dicas para melhorar seu código:

5) evite ao máximo esconder a aplicação, é certo que tudo bem, não é tão ruim assim, mas, porém contudo todavia, se seu código der um pau no meio da execução, seu Excel ficará aberto (será possível vê-lo pelo Gerenciador de Tarefas), mas inacessível. PRocure esconder somente a aplicação que está usando, ou, tornando o Windows("SeuPrograma.xlsm").Visible = False, ao invés de toda aplicação
6) evite ao máximo em seu código usar o ".select" ao final das linhas seguido na linha seguinte de "Selection." no início da linha. Consequentemnte, evite usar ActiveCell e ActiveSheet. Essa dica é toda voltada a desempenho.
7) Evite ao máximo usar o número 1048576 escrito no código, substitua por Sheets("BDCadastro").Rows.count (assim evita problemas de compatibilidade com Offices mais antigos e/ou mais novos, quando o numero de linhas aumentar...)
8) o invés de usar múltiplas condições IF ELSEIF ELSEIF ELSEIF ENDIF, use Select case, quando tem mais de 3, o select case tem uma performance MUUUITO mehor;
9) aprenda a usar referencias completas a objetos, exemplo:
linha q começa com

Range(ActiveCell, Cells(1048576, ActiveCell.Column).End(xlUp)).Select
Selection.Value = 1000

Eu faria

Dim QquerEndereco as string
with thisWorkbook.Worksheets("Pedido") 'sim, prefira o THISWORKBOOK ao ACTIVEWORKBOOK
     QquerEndereco = .Range("A" & .Cells(.rows.count,1).end(xlup).row+1).Address
     .Range(QquerEndereco).Value = 1000 '(exemplo tá)
end with

10) evitar ao máximo o tão famigerado On Error Resume Next, só usar em casos específicos em que uma justificativa plausível seja apresentada
11) saber editar códigos gravados com gravador de macros, mantendo somente o que você precisa, e tornando reutilizável

Poxa muito obrigado por responder e magina que eu ficaria ofendido, tenho apenas 2 anos que mexo com vba na "raça" para resolver problemas que encontro e o único pouco de programação que tive foi com C++ no primeiro semestre da faculdade engenharia.... então acho que já caminhei bem mas quero aprender mais.

Acho que você tocou em um dos pontos mais importantes e difíceis para mim para ser sincero... já ouvi muitas vezes em forums quando procuro ajuda seja aqui ou no Mr.Excel, que não é necessário usar .select mas eu realmente não saberia como mudar isso... (Acho que é porque deve ser mais facil ou é mais "lógico" para mim). Eu realmente gostaria de evitar fazer isso mas não saberia como...

Eu já vi alguns exemplos da utilização de CASE mas nunca usei por estar familiarizado com o raciocínio do IF.

Estou começando a tentar fazer referências completas como disse porém as vezes eu me complico mais do que resolvo então volto para o feijão com arroz que acho que sei fazer... mas quero melhorar bastante.

A respeito de compartilhar a pasta de trabalho e esconder o código VBA, embora seja uma boa dica, acho que para a finalidade que irei usar essas macros não preciso me preocupar com tentativas de quebra para obtenção do meu código (até pq coloquei ele todo aki :P aberto) mas minha maior preocupação é nas planilhas em pois quero dificultar ao máximo furto de informações que infelizmente perante a alta rotatividade de funcionários e aparentemente costume do mercado de varejo que me encontro é uma constante.

Para evitar a utilização do valor 1048576 você sugeriu a utilização de Rows.count. Então tentando contar o número total de linhas de uma planilha contando tudo que está na coluna A tentei fazer o seguinte: (para ver se entendi, mas não deu muito certo)

Sub teste()
n = ThisWorkbook.Sheets(1).Range("A" & Rows.Count)
MsgBox "Total de linhas: " & n, vbOKOnly
End Sub

Vou com certeza tentar implementar essas melhorias e sugestões que fizeram, se me derem liberdade de continuar postando aki para tirar dúvidas sobre esse projeto/ desafio pessoal ao tentar implementar essas melhorias ficaria agradecido se puderem tirar minhas dúvidas. Assim que for ficando melhor e eu aperfeiçoar o código vou postando aqui e vou tentando deixar o projeto bem explicado no VBE assim que pegar para aprender vai estar descrito qual a intenção do código.

Mas já antecipadamente obrigado por responder, tanto você quanto ao Wagner Morel que estão me auxiliando!
Att,
FJ

 
Postado : 01/08/2013 12:57 pm
(@finaljustice)
Posts: 91
Trusted Member
Topic starter
 

E respondendo a dúvida:

wba.sheets("nome da planilha").Range("A1").select

só funcionará se a planilha "nome da planilha" estiver visível e selecionada

por isso que eu digo que selecionar planilha ou célula é problemático.... ;-)`

é possível fazer TUDO sem usar .Select....

Uma coisa que havia esquecido de perguntar é:
Qual diferença entre xlveryhidden e xlsheetsveryhidden?

Se você puder também me mostrar um exemplo de uma das rotinas que fiz sem a utilização do .select ajudaria bastante eu para eu tentar replicar.
Obrigado.
FJ

 
Postado : 01/08/2013 1:07 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Desculpe a demora, vamos lá:
Exemplo de código sem usar o .Select

1) suponha que vc tem Plan1, Plan2 e Plan3
2) Preencha Plan2 como quiser, as células b2:b30
3) deixe a Plan1 selecionada e ativa
4) rode este código:

Worksheets("Plan2").Range("B2:B30").Copy WorkSheets("Plan3").Range("a1")

viu só, vc não dependeu da planilha ativa. Esqueça o que parece lógico só pq no Excel interativo você faria assim, e pense como programador. Tire completamente o .Select do seu cardápio e verá que vc costuma rapidinho.

O Select Case tem um semelhante no C, entao nao vai ser dificil entender (mas eu nao lembro, é switch acho....)

dim Palavra as string
Palavra = worksheets("Plan2").Range("B5").Value
Select Case Palavra
Case "Uva"
msgbox "a palavra é uva"
Case "Pera"
msgbox "pera é bom"
Case "Maça"
msgbox "vc pode usar qquer código aqui"
Case Else
msgbox "qualquer que seja a palavra que vc nao previu, este pedaço pode ser pulado ou nao utilizado"
End Select

Qto ao arroz feijão, tudo bem voltar, mas pense que toda vez que você volta pro beabá, vc perde uma oportunidade de ir mais adiante ;-)

Qto ao compartilhamento, entendi, vc quer proteger as planilhas e não o código. MAS, se vc esconde a planilha com VeryHidden, ainda é possível reabri-la pelo VBA, bastando dar duploclique na planilha e selecionar Vivible como xlSHeetVisible, ou seja, o seu problema continua. Ao compartilhar a pasta de trabalho, o usuário não conseguirá chegar nem no código, nem na estrutura de objetos do arquivo, ou seja, nao conseguirá tornar as planilha visíveis através do VBE...

Qto ao número de linhas....
seu código correto ficaria:

Sub teste()
n = ThisWorkbook.Sheets(1).Rows.Count
MsgBox "Total de linhas: " & n, vbOKOnly
End Sub

Fui pesquisar, e não há diferença mesmo, pensei que havia, pode usar qualquer um deles, xlSheetVeryHidden ou xlVeryHidden, ambos resultam em 2, número interno que o Excel usa para esconder a planilha.

É isso.... Divirta-se...

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 03/08/2013 1:05 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Poxa muito obrigado por responder e magina que eu ficaria ofendido, tenho apenas 2 anos que mexo com vba na "raça" para resolver problemas que encontro e o único pouco de programação que tive foi com C++ no primeiro semestre da faculdade engenharia.... então acho que já caminhei bem mas quero aprender mais.

Magina, que isso, estamos todos aprendendo. Obrigado por voltar mesmo dps de tanto tempo, kkkk

Qquer coisa tâmos aê !
Abs,

FF

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 20/01/2015 12:24 pm
(@ooigor)
Posts: 22
Eminent Member
 

Todos links off, como faco para ter acesso?

 
Postado : 04/09/2015 7:29 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Todos os links off? Sò há um anexo numa das postagens deste forum.... Favor detalhar o que vc está tentando acessar sem sucesso.

Valeu

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 24/09/2015 9:54 am