formatação condicio...
 
Notifications
Clear all

formatação condicional com função personalizada

12 Posts
2 Usuários
0 Reactions
1,290 Visualizações
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Ola

fiz uma função para que a partir de uma tabela me retorne uma ranger

.Z AN BC BO CA CK DI DU EE ER
AI AX BJ BV CF DD DP DZ EP FK

=RagSET(COL(AQ27);LIN(AQ27)) retornaria AN27:AX27, pq AQ27 está nesta range

 Function RagSET(klfd As Long, fgL As Long) As String

Dim i   As Long, Colo(2)  As Integer
On Error Resume Next
For i = 2 To 11
    Colo(0) = Cells(1, Cells(14, i).Value2).Column
    Colo(1) = Cells(1, Cells(15, i).Value2).Column
    If klfd >= Colo(0) And klfd <= Colo(1) Then
        RagSET = Cells(14, i).Value2 & fgL & ":" & Cells(15, i).Value2 & fgL
        Exit For
    End If
Next i
End Function

=MENOR(INDIRETO(RagSET(COL(AQ27);LIN(AQ27)));1) retorna o menor valor da range

Até aí está funcionando bem

mas não estou conseguindo fazer funcionar com formatação condicional

supondo que AQ27 possui o menor valor da range
=AQ27=MENOR(INDIRETO(RagSET(COL(AQ27);LIN(AQ27)));1)
na planilha dá verdadeiro, mas na formatação não acontece nada

já testei de todas as maneira possíveis e nada

até.

 
Postado : 24/06/2014 7:22 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Não sei se entendi, mas no teste que fiz aparentemente deu certo

 
Postado : 24/06/2014 8:20 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

é para trabalhar em uma planilha com ranges dinâmicos
tem vários setores
cada range é um setor diferente e a formula tem que marcar o menor valor da linha de cada setor

eu estava tentando fazer por formula comum, igual uma que fiz com cont.ses para verificar valores repetidos entre setores, mas não consegui.
fiz uma planilha de exemplo e coloquei a macro que altera a largura dos setores.
para falar a verdade nem sei como seria melhor fazer, se com formula padrão ou personalizada, mas está difícil das duas maneiras
se der para fazer com formula comum está bom tbm
=Z18=MENOR(INDIRETO($B$14&LIN()&":"&$B$15&LIN());1) <<apliquei essa formula em amarelo, mas não sei como fazer funcionar em todos os setores de maneira independente.

SENHA; lx300tel

 
Postado : 24/06/2014 9:10 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Estou tentando entender, a dinâmica da planilha.Veja se estou no caminho:
Deseja "criar" uma range baseado nos parametros: B10 (indica a coluna) -->na função e previsto um loop de 2 a 11.
Então na coluna 2 linha 14 inicio da range e coluna 2 linha 15 final da range, considerando a linha corrente
é isso??

 
Postado : 24/06/2014 10:27 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

sim, é basicamente isso mesmo, a formula vai retornar a range do setor ao qual a celula pertence
e a formatação deve testar se a celula em questão é a menor daquela linha e range.

na linha 1 tem umas celulas em azul escuro com texto em amarelo,
aqueles são os nomes dos setores
em T1 vc pode colocar o nome de algum setor e em U1 a quantidade de colunas que quer a macro está no botão 415

Se mudar os nomes ali o nome da tabela tbm muda.

Na tabela de setores que começa em B11 existem formulas que indicam os nomes e posição e limite de cada setor.
todas as minhas macros se guiam por essa tabela para funcionar

linha 6, 7,8 e 9 são linhas auxiliares, que algumas formulas e macros se guiam para não invadir outros setores e pegar os valores na possição certa do setor.

tipo essa que eu uso para saber se 2 setores ou mais tem valores repetidos, ela usa a linha 9
=E($J$1<>"n";CONT.SES($W18:$DK18;T18;$W$7:$DK$7;$M$1);CONT.SES($W18:$DK18;T18;$W$9:$DK$9;$L$1)>1)

att, e desculpe a confusão.

 
Postado : 24/06/2014 10:53 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

se colocar essa formula =RagSET(COL();LIN()) dentro de qualquer um dos setores vai ver que ela retorna a range do setor mas limitada a linha onde está a formula,
algo como AK24:AQ24
então
=menor(RagSET(COL();LIN());1) ............."sei que falta o indireto"
retornaria o menor valor dentro AK24:AQ24

a mesma coisa acontece com

A1=menor(RagSET(COL(AM24);LIN(am24));1)
seria igual a
A1=menor(AK24:AQ24;1)
por que am24 está dentro de AK24:AQ24

imaginar é fácil o difícil é explicar
até.

 
Postado : 24/06/2014 11:54 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

acho que vou desistir disso.

modifiquei a função de varias maneiras "no limite do meu conhecimento"
usei endereço no lugar de lin() e col() direto,
na planilha funciona legal mas na formatação não vai

Além de não conseguir fazer funcionar com formatação condicional,
cada teste acumulado faz a planilha ficar mais pesada. "mas não sei se foi essa formulas que fiz agora"

e isso em apenas 1000 linhas, imagina de 6000 para cima e mais de 100 colunas

fiz uma formula normal usando as linhas auxiliares e a tabela.

=Z19=MENOR(SE(E(ÉNÚM(Z$8);Z19<>"");INDIRETO(ÍNDICE($A$14:$K$14;1;CORRESP(Z$7;$A$11:$K$11;0))&LIN()&":"&ÍNDICE($A$15:$K$15;1;CORRESP(Z$7;$A$11:$K$11;0))&LIN());af);1)

Não sei se tem como melhorar ela, mas para isso provavelmente vou ter que abrir um novo tópico em formulas

Att.

 
Postado : 25/06/2014 12:18 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Já experimento iniciar com a função simplificada e ver se atende, e depois "tentar" algo mais??
Se utilizar assim:

Function RagSET(klfd As Long, fgL As Long) As String
Dim i   As Long
i = 2
    RagSET = Cells(14, i).Value2 & fgL & ":" & Cells(15, i).Value2 & fgL
End Function

O resultado (pelo menos parcial) atende a formatação esperada ?

 
Postado : 25/06/2014 9:57 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

ola.

parece que funções personalizadas não aceitam os valores voláteis da formatação condicional,
por isso que funciona na planilha, mas na formatação apenas com valores reais.

iria facilitar e muito a escrita das formulas,

Mas também não sei se a planilha fica mai pesada ou foi impressão minha.

acabei adicionando mais uma linha auxiliar para simplificar a formula.
"daqui a pouco eu vou estar com mais linhas de apoio do que dados :? "

=Z19=MENOR(INDIRETO(INDIRETO(Z$10&14)&LIN()&":"&INDIRETO(Z$10&15)&LIN());1)

obrigado aí Reinaldo
Att

 
Postado : 25/06/2014 9:58 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

postamos quase junto.
a função parece está funcionando bem,
o problema que eu reparei,
é que a formatação condicional não passa os valores relativos de col() e Lin() que muda a cada celula para a formula apenas funcionando valores constantes

tipo se eu colocar linha e coluna que represente a numeração da planilha
e colocar essa formula

=Z19=MENOR(INDIRETO(RagSET(Z$12;$W19));1)

Linha 12 com numeração das colunas substitui Col()
Coluna W com a numeração das linhas substitui Lin()

a formatação condicional funciona normalmente

eu pensei que era o indireto que estava quebrando o vinculo, mas nas funções internas do excel funciona normal.

até

 
Postado : 25/06/2014 10:29 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Ola.

Estava fazendo uma função para contar valores repetidos entre duas Range para alguém aqui do fórum
"não tenho capacidade para fazer formulas desse tipo"
viewtopic.php?f=20&t=12242

e me veio a resposta para essa aqui.
Fazer a própria função identificar a linha e coluna da célula

=RagSET(AA27) >>> Z27:AI27

Mas não sei se vou usar função, achei que a planilha ficou pesada

Será que fica pesada mesmo, ou eu fiz algo errado nessa planilha?

Até.

 
Postado : 26/06/2014 5:17 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Ola.

A função personalizada funcionou com formatação condicional.

Mas pelo tamanho da Range, 6000 Linhas x 120 Colunas, deixou a planilha pesada.
"isso por causa da troca de informação constante entre vba e excel".

Então não creio poder usar para esse propósito.
Vou usar formula comum mesmo.

usando uma linha auxiliar consegui essa formula.

=Z19=MENOR(INDIRETO(INDIRETO(Z$10&14)&LIN()&":"&INDIRETO(Z$10&15)&LIN());1)

mas cai no mesmo problema que tive na outra função "Lin()".

do jeito que está funciona, mas quando se adiciona mais regras para de funcionar.

então vou ter que abrir outro tópico em formatação para resolver essa nova questão.

Att.

 
Postado : 27/06/2014 2:34 am