Notifications
Clear all

comparar célula selecionada com tabela

15 Posts
3 Usuários
0 Reactions
1,577 Visualizações
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

como sempre estou procurando a ajuda dos mais sábios...

Tenho uma tabela que acompanha mudanças da planilha e por onde as macros se guiam

No momento apenas preciso comparar a coluna da Célula Selecionada com a tabela
e saber em qual faixa está, e retornar o nome do setor ao qual pertence

{ Mas se alguém tiver uma ideia de como substituir essa tabela e continuar acompanhado as mudanças das planilhas. Aceito opiniões.}

{A tabela está na posição exata e com as formulas , os nomes de setores mudam de uma planilha para outra e os tamanhos tambem.
a tabela serve para informar para as macros onde estão os setores, tamanho, nome primário e essas coisas}
Att

 
Postado : 08/05/2014 11:35 pm
(@wagner-morel-vidal-nobre)
Posts: 4063
Famed Member
 

Edcronos,

Bom Dia!

Não sei se entendi corretamente sua necessidade. De qualquer forma, segue. Para testar, basta selecionar qualquer célula da faixa verde.

 
Postado : 09/05/2014 6:22 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

DEsculpe, não soube explicar direito,
Tipo:
O Setor "SG" vai de "DG100" até "DW5000"
mas essa posição pode variar e o tamanho tbm,
então as formulas dentro da tabela acompanham as mudanças, para informar para as macros.

de algum modo consegui,mas estou enfrentando problemas com as faixas em branco,
está essa bagunça pq ainda estou verificando de qual maneira vai me atender melhor

Sub area()
SetPosC = 2     '   Coluna inicial tabela de setores
SetPosL = 11    '  Linha inicial tabela de setores >>nomes
c = Selection.Column
Inilin = Selection.Row

For n = SetPosC To 15
fd = Cells(SetPosL + 1, n).Value2
fd2 = Cells(SetPosL + 5, n).Value2

   'fd = Range(fd & 1).Column
   'fd2 = Range(fd2 & 1).Column
   'If c >= fd And c <= fd2 Then Setor = Cells(SetPosL, n).Value2: MsgBox " Setor =" & Setor: Exit Sub

If Not Intersect(Cells(1, c), Range(fd & 1, fd2 & 1)) Is Nothing Then

Ci = Cells(SetPosL + 3, n).Value2
Cf = Cells(SetPosL + 4, n).Value2
Exit For

     End If
Next
If Plan_Aq <> Plan_Princ Then Range(Ci & Inilin, Cf & Inilin) = Range(Ci & Inilin, Cf & Inilin).Offset(0, -1).Value2: Lat
End Sub

melhorei um pouco o exemplo "eu acho"

 
Postado : 09/05/2014 12:17 pm
(@wagner-morel-vidal-nobre)
Posts: 4063
Famed Member
 

É... desculpe por não poder ajudá-lo. Meus conhecimentos são insuficientes nesse caso.

Espero que outros colegas aqui do fórum possam lhe ajudar.

 
Postado : 09/05/2014 5:41 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Tudo bem, obrigando por tentar,
apesar de achar que é a minha explicação que está confusa,
já que já vi vc resolver problemas bemmmm mais complicados que esse.
Vou usar da maneira que postei,
a tabela era para ter referencias numéricas das colunas, mas como 80% das macros que tenho é da época que não sabia usar Cells(), acabei fazendo assim.

vou manter o tópico em aberto durante um tempo para vê se aparece alguém com uma solução melhor ou até mesmo com uma maneira de eliminar essa tabela.

Até.

 
Postado : 09/05/2014 5:57 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

Edcronos,

Eu fiz esse código com base na primeira planilha que vc mandou. Ve se ajuda:

Sub localiza_GT()

Dim Endereço    As String
Dim LinCol()    As String
Dim Coluna      As String
Dim Linha       As Integer
Dim i           As Integer 'loop linha
Dim j           As Integer 'loop coluna
Dim Setor       As String

Endereço = Mid(Selection.Address, 2, Len(Selection.Address))
LinCol = Split(Endereço, "$")
Coluna = LinCol(0)
Linha = LinCol(1)

For j = 2 To 17
    For i = 12 To 16
        If Cells(i, j).Text = Coluna Then
            If Linha >= Cells(21, j).Value2 And Linha <= Cells(22, j).Value2 Then
                Setor = Cells(11, j).Text
                GoTo ENDfor
            End If
        End If
    Next i
Next j

ENDfor:

MsgBox (Setor)

End Sub
 
Postado : 11/05/2014 11:53 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

tinha até esquecido desse aqui...

não sei oq estou fazendo de errado, mas está voltando em branco.
e como não entendi muito bem como faz referencia com as coluna não pude modificar.

na maneira que consegui que está lá em cima e de certa forma é igual a sua
nesse caso converti as letras da tabela em numero de coluna

    Sub area()

    c = Selection.Column
    Inilin = Selection.Row

    For n = 2 To 15
          fd = Cells(12, n).Value2
          fd2 = Cells(16, n).Value2

       fd = Range(fd & 1).Column
       fd2 = Range(fd2 & 1).Column
       
       If c >= fd And c <= fd2 Then
          Setor = Cells(11, n).Value2
               MsgBox " Setor =" & Setor
       Exit Sub
       End If
    Next
     End Sub

Aqui fiz uma interseção de area com as letras da tabela numa range " ainda não me habituei com esse "Is Nothing""

Sub area()
          c = Selection.Column
 For n = 2 To 15
          fd = Cells(12, n).Value2
          fd2 = Cells(16, n).Value2

 If Not Intersect(Cells(1, c), Range(fd & 1, fd2 & 1)) Is Nothing Then
               Setor = Cells(11, n).Value2
                MsgBox " Setor =" & Setor
                    Exit Sub
End If   
      
    Next
End Sub

no momento estou usando esse por ser menor.
como falei estava tendo problemas com espaços em branco,
então tive que modificar as macros que geram os setores provisórios para repetir os valores do meio nas beiradas
e em setores nulos, entra a letra de uma linha oculta que tenho pra controle, portanto não vai ser selecionada.

'as variaveis são publicas e os valores vão ser usados por outras macros

bem, o ideal seria não ter essa tabela, mas como não achei uma maneira de acompanhar mudanças na planilha de maneira automática

obrigado pela ajuda, vou tentar entender a sua macro .

 
Postado : 11/05/2014 3:48 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

Edcronos,

Mas o código que eu passei funcionou?

Eu não entendi porque vc está usando várias colunas (de W a DJ) no teu código.

Mas, o que eu fiz, foi pegar o endereço da célula ativa, separar em:
- string da coluna
- número da linha

E lopei a tua tabela em B12:Q16 procurando a string da coluna. Quando encontrada, confere se a linha está dentro do interva apresentado nas linhas 21:22.

Para facilitar o entendimento do código, acompanhe com F8.

Abs

 
Postado : 11/05/2014 4:32 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

o que vc postou deu valores em branco,

a tabela faz referencia a Range de cada setor

Setor SA:
Range("W100:Ai5000"

colunas :
W ... = titulos ....................................= variavel Ti
X ... = datas....................................... = variavel CData
Z ... = coluna inicial de dados ..................= variavel Ci
AH... = coluna final de dados ....................= variavel Cf
Ai ... = coluna auxiliar "formulas e outros ..... = variavel Fc

se uma macro adicionar ou excluir colunas as formulas da tabela vai informar as novas posições

Setores Proa, Prob... são setores provisórios,
eles podem ser setores independentes ou ser uma range de um setor já existente.

AuxA , AuxB setores auxiliares " para trabalho com os dados (realocar, ajustar, organizar ...)depois da macro trabalhar faz o ajuste de colunas se necessário e os dados são levados de volta. ela ficam longe de formatações e formulas, "estou pensando em usar uma planilha separada para esse serviço"

Desculpe a confusão que eu faço.

 
Postado : 11/05/2014 5:24 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

Então eu não entendi.

Por exemplo, com o me código:

Se a célula DJ2000 estiver selecionada, a macro vai retornar SH, porque:

DJ está na célula H13, que é o setor SH.
(e a linha 2000 está entre 100 (H21) e 5000 (H22).

Porém, se a célula selecionada for Y300, vai retornar em branco, porque Y não está no intervalo B12:Q16.

Onde eu errei?

 
Postado : 11/05/2014 7:20 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

bem, aqui retornou branco em tudo,
sei que é meio difícil entender minhas ideias e explicações "as vezes nem mesmo eu me entendo"

If Not Intersect(Cells(1, "y"), Range("W" & 1, "Ai" & 1)) Is Nothing Then
vai retonar "SA" pq "Y" está entre "W" e "Ai"

a tabela só faz referencia as principais colunas do setor,
mas a primeira e ultima referencia saão os limites da RAnge nesse caso W e Ai
tenho macro que somente trabalham os dados Ci e Cf "coluna "A" outras na range toda Ti e Fc

todas as minhas macros são baseadas nessa tabela

melhor eu fazer um exemplo de como funciona,

 
Postado : 11/05/2014 7:52 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

Bem, alterei o código segundo o que vc falou.

Tb anexei a planilha dessa vez, ja que vc disse que estava dando tudo em branco.

[]

 
Postado : 11/05/2014 8:41 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

funcionou perfeito,

mas não entendi muito bem o funcionamento
Cells(1, Cells(16, i).Text).Column
nem sabia que dava para colocar um cel dentro do outro e que dava para fazer retorno de column com ele

Pelo que entendi
"Cells(16, i).Text " faz referencia ao conteudo da celula em modo texto
se for W seria como "Cells(1,"W").Column"

mas pq usar o .Text ?

e para encerrar o topico. "já que um substituto para a tabela não vai ter :("
qual maneira é melhor esse ou por Intersect

já estava montando a planilha com um monte de macro :P

 
Postado : 11/05/2014 9:12 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

Isso mesmo, vc entendeu corretamente.

Poderia usar o .value, porém, eu dei a preferência pra buscar a informação como texto, simplesmente porque não declarei variável nesse caso.

Sobre usar o intersect ou essa forma que usei, eu particularmente não gosto do intersect e evito usá-lo. Não sei se muda algo em desempenho.

 
Postado : 11/05/2014 9:34 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Valeu pela ajuda.
sobre o primeiro ficar em branco pode ser pq Setor está entre parênteses
MsgBox (Setor)
eu deixei do jeito que vc postou, e como não entendi não modifiquei
mas bem, não adianta ficar prolongando um assunto resolvido.

valeu mesmo.

 
Postado : 11/05/2014 9:56 pm