Notifications
Clear all

Worksheet_SelectionChange em outra aba

7 Posts
4 Usuários
0 Reactions
1,221 Visualizações
(@suggos)
Posts: 111
Estimable Member
Topic starter
 

Olá, esta é minha primeira mensagem aqui.
Eu tenho uma macro (usei Worksheet_SelectionChange) que faz dez formatações condicionais nas células que o usuário seleciona na aba "Mapa". Como a macro deixa o processamento mais devagar, pensei em gravar em outra aba todas as células que já foram formatadas. Desse modo, antes de fazer as formatações condicionais, eu verificaria na aba "Plan1" se as células selecionadas já foram formatadas pela referida macro. O problema é que não consigo selecionar nem atribuir valor, na aba "Plan1", para as mesmas células selecionadas na aba "Mapa". Usei as opções abaixo, dentre outras semelhantes, mas nada deu certo. Retorna o Erro 5. Alguém sabe me dizer o que está errado?
Sheets("Plan1").Range(Target.Address(False, False)).Value = 1
Sheets("Plan1").Range(Target.Row, Target.Column).Value = 1

Não se esqueça de marcar o tópico como resolvido se a resposta for satisfatória.

 
Postado : 09/11/2015 6:52 pm
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

suggos,

Boa noite!

Confesso que não entendi o que você quer realmente!

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 : 09/11/2015 7:08 pm
(@edivan)
Posts: 119
Estimable Member
 

Olha eu também não entendi não....

Mas se você quer executar o código verificador ao selecionar uma célula você deve usar o evento Change da planilha...

 
Postado : 09/11/2015 8:11 pm
(@suggos)
Posts: 111
Estimable Member
Topic starter
 

Esta é minha macro. O erro 5 ocorre na última linha. Veja meus comentários em verde dentro da macro. Se substituir todos os Selection por Target, o resultado é o mesmo.

Public Sel As Range

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Column > 50 Or Target.Row > 110 Then Exit Sub

'Aqui eu faço uma formatação condicional em uma aba chamada "Mapa". A macro é executada
'sempre que o usuário altera a(s) células selecionadas. Por exemplo, o usuário seleciona
'a célula A1 e isso executa automaticamente esta macro. Como isso consome bastante o
'processamento, coloquei na primeira linha da macro uma verificação que só executa a macro
'se a célula selecionada estiver dentro de alguns limites.

'Agora vamos ao problema: da maneira como está a macro, se o usuário selecionar a célula
'A1 cinco vezes, essa macro será executada INTEIRA por cinco vezes, consumindo o processamento
'e tornado a macro ineficiente. Para evitar isso, quero inserir na aba "Plan1" um valor
'qualquer nas mesmas células de Target. Ou seja, se o usuário alterar a célula "A1" na
'aba "Mapa", a macro insere o número 1 em "A1". Daí antes de executar a macro, eu faria
'uma verificação se "A1" contém o valor 1.

ActiveSheet.Unprotect Sn
With Selection.Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With

Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=0"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
Selection.FormatConditions(1).Font.ThemeColor = xlThemeColorDark1

Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=""x"""
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
Selection.FormatConditions(1).Interior.Color = 255

Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=1"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
Selection.FormatConditions(1).Interior.Color = 16772300

Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=2"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
Selection.FormatConditions(1).Interior.Color = 6736896

Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=3"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
Selection.FormatConditions(1).Interior.Color = -6684673

Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=4"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
Selection.FormatConditions(1).Interior.Color = -26317

Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=5"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
Selection.FormatConditions(1).Interior.Color = -6697729

Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=6"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
Selection.FormatConditions(1).Interior.Color = -16750900

Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=7"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
Selection.FormatConditions(1).Interior.Color = -6279056

Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=8"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
Selection.FormatConditions(1).Interior.ThemeColor = xlThemeColorDark1
Selection.FormatConditions(1).Interior.TintAndShade = -0.349986266670736

ActiveSheet.Protect Sn

Sel = Selection.Address(False, False)

Sheets("Plan1").Cells(Sel).Value = 1
End Sub

Não se esqueça de marcar o tópico como resolvido se a resposta for satisfatória.

 
Postado : 09/11/2015 8:37 pm
(@suggos)
Posts: 111
Estimable Member
Topic starter
 

Edivan, permita-me discordar, mas o evento Change da planilha é para quando se altera valores na planilha. Quando se altera seleção, é SelectionChange.

Não se esqueça de marcar o tópico como resolvido se a resposta for satisfatória.

 
Postado : 09/11/2015 8:46 pm
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Olá, esta é minha primeira mensagem aqui.
Eu tenho uma macro (usei Worksheet_SelectionChange) que faz dez formatações condicionais nas células que o usuário seleciona na aba "Mapa". Como a macro deixa o processamento mais devagar, pensei em gravar em outra aba todas as células que já foram formatadas. Desse modo, antes de fazer as formatações condicionais, eu verificaria na aba "Plan1" se as células selecionadas já foram formatadas pela referida macro. O problema é que não consigo selecionar nem atribuir valor, na aba "Plan1", para as mesmas células selecionadas na aba "Mapa". Usei as opções abaixo, dentre outras semelhantes, mas nada deu certo. Retorna o Erro 5. Alguém sabe me dizer o que está errado?
Sheets("Plan1").Range(Target.Address(False, False)).Value = 1
Sheets("Plan1").Range(Target.Row, Target.Column).Value = 1

Acredito que o erro esteja na passagem dos parâmetros. No início do tópico vc passou para o objeto Range dois parâmetros, o Target.Row e o Target.Column separados por vírgula, ou seja, ao avaliar
Sheets("Plan1").Range(Target.Row, Target.Column).Value = 1
ficaria algo do tipo Sheets("Plan1").Range(2,3).Value = 1
Esta forma não é a correta para o objeto Range. Teria que ser da forma Range("A1") ou Range("A1:B5") ou Range(Cells(1,3)) por exemplo.
Se, ao invés disso tivesse usado Sheets("Plan1").Cells(Target.Row, Target.Column) aí Ok.

Já no final do seu código maior, vc fez exatamente ao contrário, o que também não deu certo, pois vc passou para a propriedade Cells um argumento tipo "A1" pois sua variável Sel retorna um endereço tipo A1, quando deveria ser tipo linha, coluna.
Sel = Selection.Address(False, False)
Sheets("Plan1").Cells(Sel).Value = 1

Aqui é que, ao contrário, vc deveria ter usado Range em vez de Cells.

Tente alterar prá ver se não é isso. Qualquer coisa retorne.

 
Postado : 09/11/2015 9:18 pm
(@suggos)
Posts: 111
Estimable Member
Topic starter
 

EdsonBR, realmente estava errada a sintaxe. Só que o problema não era este. Eu testei com Cells e com Range. Eu inseri desta forma aqui no site para exemplificar que eu testei ambas, mas esqueci de fazer essa correção.
A solução que eu usei foi a seguinte: em vez de inserir o número 1 em outra aba, inseri na mesma aba algumas células abaixo.

Public Sel As Range

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

'Interrompe a macro se a seleção estiver fora do limite ou a célula já estiver com as formatações condicionais
If Target.Column > 100 Or Target.Row > 50 Or _
Target.Offset(Sheets("Plan.").Range("DH51") + 5, 0).Value = 1 Then Exit Sub

'Aqui eu faço uma formatação condicional em uma aba chamada "Mapa". A macro é executada
'sempre que o usuário altera a(s) células selecionadas. Por exemplo, o usuário seleciona
'a célula A1 e isso executa automaticamente esta macro. Como isso consome bastante o
'processamento, coloquei na primeira linha da macro uma verificação que só executa a macro
'se a célula selecionada estiver dentro de alguns limites.

'Agora vamos ao problema: da maneira como está a macro, se o usuário selecionar a célula
'A1 cinco vezes, essa macro será executada INTEIRA por cinco vezes, consumindo o processamento
'e tornado a macro ineficiente. Para evitar isso, quero inserir na aba "Plan1" um valor
'qualquer nas mesmas células de Target. Ou seja, se o usuário alterar a célula "A1" na
'aba "Mapa", a macro insere o número 1 em "A1" na aba "Plan1". Daí antes de executar a macro,
'eu faria uma verificação se "A1" da outra aba contém o valor 1.

ActiveSheet.Unprotect Sn
With Target.Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With

Target.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=0"
Target.FormatConditions(Target.FormatConditions.Count).SetFirstPriority
Target.FormatConditions(1).Font.ThemeColor = xlThemeColorDark1

Target.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=""x"""
Target.FormatConditions(Target.FormatConditions.Count).SetFirstPriority
Target.FormatConditions(1).Interior.Color = 255

Target.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=1"
Target.FormatConditions(Target.FormatConditions.Count).SetFirstPriority
Target.FormatConditions(1).Interior.Color = 16772300

Target.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=2"
Target.FormatConditions(Target.FormatConditions.Count).SetFirstPriority
Target.FormatConditions(1).Interior.Color = 6736896

Target.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=3"
Target.FormatConditions(Target.FormatConditions.Count).SetFirstPriority
Target.FormatConditions(1).Interior.Color = -6684673

Target.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=4"
Target.FormatConditions(Target.FormatConditions.Count).SetFirstPriority
Target.FormatConditions(1).Interior.Color = -26317

Target.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=5"
Target.FormatConditions(Target.FormatConditions.Count).SetFirstPriority
Target.FormatConditions(1).Interior.Color = -6697729

Target.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=6"
Target.FormatConditions(Target.FormatConditions.Count).SetFirstPriority
Target.FormatConditions(1).Interior.Color = -16750900

Target.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=7"
Target.FormatConditions(Target.FormatConditions.Count).SetFirstPriority
Target.FormatConditions(1).Interior.Color = -6279056

Target.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=8"
Target.FormatConditions(Target.FormatConditions.Count).SetFirstPriority
Target.FormatConditions(1).Interior.ThemeColor = xlThemeColorDark1
Target.FormatConditions(1).Interior.TintAndShade = -0.349986266670736

Target.Offset(55, 0).Value = 1

ActiveSheet.Protect Sn

End Sub

Não se esqueça de marcar o tópico como resolvido se a resposta for satisfatória.

 
Postado : 10/11/2015 3:30 am