Notifications
Clear all

Trabalhando com célula ativa e celulas ao redor

9 Posts
2 Usuários
0 Reactions
1,784 Visualizações
(@gtsalikis)
Posts: 2373
Noble Member
Topic starter
 

Amigos, estou tentando estudar um pouco de VBA, indo aos poucos, e mexendo numa planilha fictícia onde vou implementando funções.

Encontrei o código abaixo, o qual destaca a célula ativa em amarelo, e retira a formatação ao selecionar outra célula.

Option Explicit
Public celAnt As String
Public corAnt As Integer

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub

On Error Resume Next 
        If celAnt = "" Then
                 celAnt = Range("A2").Value 
                   corAnt = Range("A1").Value 
                    Range(celAnt).Interior.ColorIndex = corAnt
                     corAnt = Target.Interior.ColorIndex
                     Range("A1").Value = corAnt
                    Target.Interior.Color = vbYellow
                  celAnt = Target.Address
                Range("A2").Value = celAnt
        
        Else
        
                Range(celAnt).Interior.ColorIndex = corAnt
                  corAnt = Target.Interior.ColorIndex
                   Range("A1").Value = corAnt 
                   Target.Interior.Color = vbYellow
                  celAnt = Target.Address
                Range("A2").Value = celAnt 
        End If

End Sub

Fonte

Eu consegui adaptar o código para que, em vez de formatar a célula, digite algo nela. Porém, eu queria limitar o campo de ação, somente sendo possível executar se a nova célula for adjacente à célula atual, por exemplo:

Se eu estiver na célula C3:
O código só vai executar se eu tentar clicar nas células B2, B3, B4, C2, C4, E2, E3, E4 (só ao redor).

Então, estou tentando entendr o código para tentar usar o comando offset, mas não consigo.

Alguém poderia me explicar o que as linhas desse código representam?

Grato

 
Postado : 19/06/2013 2:40 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Gt, eu só não entendi esta colocação :
"Se eu estiver na célula C3:
O código só vai executar se eu tentar clicar nas células B2, B3, B4, C2, C4, E2, E3, E4 (só ao redor).
"

De qualquer forma, já que está querendo aprender, acho mais fácil visualizando do que explicar tudo aqui, fiz este modelo utilizando a Propriedade Offset, que faz exatamente o que você quer, lógicamente deixei o range inicial fixo "C3", mas pode ser utilizado com uma Variável e tambem ajustar no evento definindo em Target.

De uma olhada se ajuda, e vá colocando as duvidas que por ventura surgirem.

Offset Adjacentes

[]s

 
Postado : 19/06/2013 5:17 pm
(@gtsalikis)
Posts: 2373
Noble Member
Topic starter
 

Na verdade, Mauro, eu me expressei mal.

Em anexo, está uma parte da planilha que estou usando para estudar.

Coloquei 3 abas.

Na primeira, é o que eu consegui adaptar do código até o momento.

Na segunda, Um problema que eu tive por não entender o código (quando sai da célula, ela fica com um "0", isso eu resolvi com formatação de célula, mas não era bem o que eu queria);

Na terceira aba, o que eu não consigo implementar. Note que na primeira aba, o boneco pode "andar" para qualquer lugar da planilha, como se ele se teleportasse. O que eu quero é limitar esse movimento, fazendo com que o código só funcione se for selecionada uma das células adjacentes, as que eu destaquei dentro da borda.
Como estou tentando aprender, eu pensei que, sabendo o que cada linha daquele código faz, eu seria capaz de continuar com o que eu quero.

 
Postado : 20/06/2013 8:38 am
(@gtsalikis)
Posts: 2373
Noble Member
Topic starter
 

Consegui chegar onde eu queria com o seguinte código:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

' Coloca o caractere definido na célula selecionada, e o exclui quando seleciona-se outra célula (simula que está caminhando).
Dim inter
Dim iTbl
Dim fTbl
Dim char As String
    iTbl = Range("CN62").Value
    fTbl = Range("CO62").Value
    Set inter = Intersect(Target, Range(iTbl, fTbl))
    char = Range("CM61").Value

    If Target.Count > 1 Then Exit Sub
     If inter Is Nothing Then 'não faz nada
      Else
      On Error GoTo Nao_anda
       Range(Range("CM62").Value).ClearContents
        Target.Value = char
         Range("CM62").Value = ActiveCell.Address
         Range("CN62").Value = ActiveCell.Offset(-1, -1).Address
         Range("CO62").Value = ActiveCell.Offset(1, 1).Address
            
      End If

Exit Sub

Nao_anda:

Call MsgBox("You cannot go further.", vbOKOnly, "Action denied")

End Sub

A tua ajuda com o Offset já me ajudou, combinei com o Intersect e deu certo. Obrigado, Mauro.

 
Postado : 20/06/2013 1:31 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!!

sendo assim, seu tópico será marcado como resolvido!!

Att

 
Postado : 20/06/2013 5:08 pm
(@gtsalikis)
Posts: 2373
Noble Member
Topic starter
 

Ah, obrigado, Alexandre.

Eu ia fazer essa marcação, só tinha esperado um pouco pra ver se o Mauro ia responder algo.

 
Postado : 21/06/2013 8:34 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Ah, obrigado, Alexandre.

Eu ia fazer essa marcação, só tinha esperado um pouco pra ver se o Mauro ia responder algo.

Ops, peço desculpas pelo não retorno, cheguei a ver que tinha resolvido, mas como estava no final do expediente e a internet, pra variar, deu problema acabei não postando nada e mais tarde comecei fazerr outras coisas e nem me lembrei.

Mas valeu pela consideração, eu só não consgui testar ainda, aqui no serviço temos excel 2003 e as vezes consigo abrir algum da v 2007 atraves de um path ou por excel portable, isto quando não bloqueiam.
Mas no 2003 deu erro nos ranges com intersect e não descobri ainda em que momento são inserido os endereços nas celulas.
De qualquer forma, se para o que quer está funcionando, é o que importa, parabens pela dedicação e esforço em aprender.

 
Postado : 21/06/2013 10:09 am
(@gtsalikis)
Posts: 2373
Noble Member
Topic starter
 

Mas no 2003 deu erro nos ranges com intersect e não descobri ainda em que momento são inserido os endereços nas celulas.
De qualquer forma, se para o que quer está funcionando, é o que importa, parabens pela dedicação e esforço em aprender.

Tem razão. O código faz com que o caractere que eu defini seja movimentado pela planilha, mas não tem um "endereço inicial". Isso eu ainda não consegui definir. Testei aqui, apagando os endereços das células, e dá erro.

Por outro lado, eu ainda posso manipular isso no projeto, através de um outro evento inicial, o que acredito, será mais útil, visto que eu pretendo trabalhar com várias planilhas. Se não der certo, eu penso resolver esse problema direto no código. ;)

 
Postado : 21/06/2013 12:43 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

No caso e um endereço Inicial, como irá trabalhar com varias abas e se cada uma for um endereço diferente, é só defini-los no Evento "Worksheet_Activate()" de cada uma.

[]s

 
Postado : 21/06/2013 1:52 pm