Notifications
Clear all

Conflito entre códigos VBA

14 Posts
2 Usuários
0 Reactions
1,701 Visualizações
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Bom dia a todos!

Estou com um pequeno problema de conflito entre 2 códigos e gostaria de pedir a ajuda para resolvê-lo. Talvez o Mauro Coutinho possa me ajudar também.

O primeiro código busca na linha do título da planilha específica pelo caracter "*", ao encontrar faz o bloqueio da coluna onde tem o asterisco. está funcionando perfeitamente bem.

Ao bloquear a coluna, também faz o bloqueio da planilha. Ao bloquear a planilha, o usuário fica sem algumas funcionalidades, principalmente o AUTOFILTRO.

Para resolver o problema do AUTOFILTRO, entra em cena o segundo código, que habilita o AUTOFILTRO em planilhas bloqueadas.

O primeiro código, o de bloqueio, é inserido na planilha a ser bloqueada no evento "Private Sub Worksheet_Activate()".

O segundo código, o do autofiltro, é inserido na planilha "ESTA PASTA DE TRABALHO", pois ele seleciona a planilha a ser habilitado o autofiltro. Ele é ativado no evento "Private Sub Workbook_Open()".

Ocorre que, ao abrir o arquivo o autofiltro é ativado permitindo seu uso, mas ao ativar o bloqueio, pelo ativamento da planilha, o autofiltro volta a ficar indisponível.

Preciso da proteção e também preciso usar o autofiltro. Como resolver?.

Ainda com relação ao código do autofiltro, ele permite apenas a seleção para a filtragem. Caso eu aplique o filtro em mais de uma coluna, para retirar tem que fazê-lo um a um...a opções MOSTRAR TODOS continua indisponível. Poderiam ver isso tanbém?.

Agradeço muito!

Código de bloqueio:

Private Sub Worksheet_Activate()
Dim lgTtColunas As Long
Dim iCol As Long
Dim myCol As String

  ActiveSheet.Unprotect ("gplan211127")

  Cells.Locked = False

  'Conta as colunas preenchidas
  lgTtColunas = Cells(1, Columns.Count).End(xlToLeft).Column

    For iCol = 1 To lgTtColunas

        'Condição
        'If Cells(1, iCol).Value = "VALOR ATUAL" Then
       If InStr(1, Cells(1, iCol), Chr(42)) > 0 Then
       myCol = GetColumnLetter(iCol)

      Range(myCol & "1:" & myCol & "318").Locked = True

      End If

   Next iCol

    ActiveSheet.Protect ("gplan211127")

End Sub

Function GetColumnLetter(colNum As Long) As String
    Dim vArr
    vArr = Split(Cells(1, colNum).Address(True, False), "$")
    GetColumnLetter = vArr(0)
End Function

Código do autofiltro:

Private Sub Workbook_Open()
'check for filter, turn on if none exists
With Worksheets("Proposta_Mapp")
  If Not .AutoFilterMode Then
    .Range("A1").AutoFilter
  End If
  .EnableAutoFilter = True
  .Protect Password:="gplan211127", _
  Contents:=True, UserInterfaceOnly:=True
End With
End Sub
 
Postado : 29/04/2015 7:24 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Nas suas linhas onde ocorre a proteção, permita o uso do filtro... assim:

Worksheets("NomeDaPlan").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFiltering:=True

ou seja, AllowFiltering:=True passa a permitir o filtro mesmo com a plan protegida... inclua nas linhas de .Protect, e boas !

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

 
Postado : 29/04/2015 7:27 am
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Oi Fernando,

Entendi a alteração, mas não identifiquei onde no código devo inserir a linha...

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

Use então esses códigos, *seus, já editados para incluir a permissão*:

Private Sub Worksheet_Activate()
Dim lgTtColunas As Long
Dim iCol As Long
Dim myCol As String

  ActiveSheet.Unprotect ("gplan211127")

  Cells.Locked = False

  'Conta as colunas preenchidas
  lgTtColunas = Cells(1, Columns.Count).End(xlToLeft).Column

    For iCol = 1 To lgTtColunas

        'Condição
        'If Cells(1, iCol).Value = "VALOR ATUAL" Then
       If InStr(1, Cells(1, iCol), Chr(42)) > 0 Then
       myCol = GetColumnLetter(iCol)

      Range(myCol & "1:" & myCol & "318").Locked = True

      End If

   Next iCol

    ActiveSheet.Protect Password:="gplan211127", AllowFiltering:=True

End Sub

Function GetColumnLetter(colNum As Long) As String
    Dim vArr
    vArr = Split(Cells(1, colNum).Address(True, False), "$")
    GetColumnLetter = vArr(0)
End Function

E esse:

Private Sub Workbook_Open()
'check for filter, turn on if none exists
With Worksheets("Proposta_Mapp")
  If Not .AutoFilterMode Then
    .Range("A1").AutoFilter
  End If
  .EnableAutoFilter = True
  .Protect Password:="gplan211127", Contents:=True, UserInterfaceOnly:=True, AllowFiltering:=True
End With
End Sub

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

 
Postado : 29/04/2015 8:01 am
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Fernando,

Perfeito!Parabéns e muito obrigado.

 
Postado : 29/04/2015 9:09 am
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Fernando,

Está dando um erro na linha 26, "ActiveSheet.Protect ("gplan211127"), AllowFiltering:=True"

Parecia funcionar, mas agora...

Erro em tempo de execução '1004';

Erro de definição de aplicativo ou de definição de objeto

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

Vacilo meu...

use:

ActiveSheet.Protect Password:="gplan211127", AllowFiltering:=True

*(sem os parêntese... e com a palavra Password)

p.s.: já alterei na minha resposta lá em cima tb, a marcada como resolvido. Só pra focar certinho ! *(poderes de moderador)

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

 
Postado : 29/04/2015 10:19 am
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Continua o erro...

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

Cole novamente a linha de código, a que aparece em aparelo quando o erro acontece!
E tb o texto do erro...

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

 
Postado : 29/04/2015 10:42 am
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Erro em tempo de execução '1004':

Erro de definição de aplicativo ou definição de objeto.

a linha do erro:

ActiveSheet.Protect Password:="gplan211127", AllowFiltering:=True

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

Aqui eu testei e retestei, e funcionou...
Compacte seu arquivo e disponibilize por favor.

p.s.: qual a versão do Excel vc está usando... eu estou com 2013... *(se bem que, desculpe para o allowfiltering a versão aqui é irrelevante...)

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

 
Postado : 29/04/2015 10:55 am
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Versão 2000

Estou usando apenas o código de bloqueio com a sua linha. O erro ocorre ao ativar a planilha.

Segue o arquivo.

A planilha é "Proposta_Mapp".

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

Ops, eu havia dito que a versão é irrelevante, pois o AllowFiltering foi inserido na versão 2003. E nunca que eu ia imaginar que vc está usando um Excel que tem 15 anos de idade.

Se vc está no Excel 2000, não há o que vc pode fazer. O AllowFiltering não existia, não existe.

Nem vou abrir o anexo. Sua solução é em atualizar o Office para qquer versão com menos de 10 anos de vida.

https://www.google.com.br/webhp?sourcei ... excel+2000

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

 
Postado : 29/04/2015 11:04 am
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Ok, Infelizmente a empresa aqui é governamental e essa atualização não está nas prioridades!

Em todo caso, obrigado.

 
Postado : 29/04/2015 11:30 am