Blog Archive

About Me

A minha fotografia
JRod - PORTUGAL
Microsoft [MVP] - Excel (10º ano consecutivo)
Ver o meu perfil completo
Com tecnologia do Blogger.

Seguidores

Estatisticas

Free Blog Counter

eXTReMe Tracker
Ocorreu um erro neste dispositivo
2007-12-17

Num newsgroup, colocaram a seguinte questão (adaptada): "Numa folha e na célula B1 temos um valor que é um somatório de valores de células. Ora, na célula A1 pretendia o cálculo automático de um valor percentual em função do resultado obtido em B1. O valor percentual é diferente conforme o intervalo de valores de referência (os valores de referência e respectivas percentagens encontram-se nas colunas D, E e F). Será possível? Como?
 
O exemplo:
 
Como possível solução, a seguinte fórmula, em C1, para obter a percentagem em função do valor contido em B1:
 

=VLOOKUP(B1;D1:F3;3)

 

e em A1, como resultado pretendido:

=B1*C1

 

Tópicos relacionados:

2007-11-15
209: VBA - Application.InputBox()
Num newsgroup, colocaram a seguinte questão:
"Numa macro, o comando:
Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select, selecciona todas as células com informação.
Esta informação pode depois ser copiada com o comando:
Selection.Copy
O que pretendia era usar o primeiro comando, mas de forma que ele só me seleccionasse os dados contidos numa coluna especifica.

Por Exemplo, a coluna "C" tanto pode ter 10 linhas com dados como 20 e só pretendo a selecção desses dados, todos os outros são secundários para o efeito.

Será que é possível?"


Através do seguinte exemplo, podemos equacionar a questão e ver o resultado:










O Código do exemplo:

'---------------------------------------------------------------------------------------
' Procedure : Copia_Range_Variavel
' DateTime  : 15-11-2007 19:04
' Author    : JRod
' Purpose   : Copiar um Range Variável
'---------------------------------------------------------------------------------------
'
Sub Copia_Range_Variavel()

    Dim myCel1, myCel2, myCel3 As Range
    Dim Str1, Str2, Str3 As String

    On Error Resume Next
    Set myCel1 = Application.InputBox _
                 (prompt:="Confirme a célula activa, ou seleccione outra célula" _
                  & Chr(10) & "Cancel: Sai !", _
                  Title:=" Copia Range", _
                  Default:=ActiveCell.Address, Type:=8)
    On Error GoTo 0

    If myCel1 Is Nothing Then
        MsgBox "Desistiu"
        Exit Sub
    End If

    Set myCel2 = Application.InputBox _
                 (prompt:="Confirme a célula activa, ou seleccione outra célula" _
                  & Chr(10) & "Cancel: Sai !", _
                  Title:=" Copia Range", _
                  Default:=ActiveCell.Address, Type:=8)
    On Error GoTo 0

    If myCel2 Is Nothing Then
        MsgBox "Desistiu"
        Exit Sub
    End If

    Str1 = myCel1.Address
    Str2 = myCel2.Address

    Range(Str1 & ":" & Str2).Select
    Selection.Copy
    Range("F1").PasteSpecial (xlPasteValues)
    Application.CutCopyMode = False

End Sub


Para colocar o código, acede-se ao editor do VB do Excel, com ALT + F11, cria-se um módulo e copia-se o código para lá. Depois, para o executar, podemos utilizar ALT + F8.


A imagem do que se pretende:



Tópicos relacionados:




2007-11-05

Há dias, colocaram-me a seguinte questão (adaptada): "Tenho uma tabela em que uma determinada combinação de 2 variáveis, corresponde a um código. Numa outra tabela, onde tenho estas variáveis, preciso colocar o código que corresponde a cada combinação de 2 variáveis. Preciso de preencher a coluna M com o código da 1ª tabela associada a A + B (exemplo: B5=a, C5=2 - Código: III -, a que corresponde o conjunto das variáveis C + D( exemplo: G6 + H6 -- resultado em M6: III).
 
O exemplo, nas imagens:
 

 

Se alterar em H6, de 2 para 3, então em M6 o resultado será IV

 

A fórmula, em M6 (copiada para as células pretendidas da coluna M):

{=INDEX($D$2:$D$10;MATCH(G6&H6;$B$2:$B$10&$C$2:$C$10;0))}

NOTA: Ctrl + Shift + Enter na célula activa, para obter como um array,ou seja, com {}.

 

Tópicos relacionados:

2007-10-28

Depois de se ter instalado o Microsoft Office Service Pack 3 (SP3), não é possível abrir, no Microsoft Excel 2003, workbook files do Microsoft Excel 5.0/95 que contenham macros do Visual Basic for Applications (VBA) .

 

Ver mais em: Ajuda e Suporte Técnico Microsoft

2007-10-20

 

Clicar no banner para aceder ao link.

Na próxima semana: 5 webcasts, um por dia, sempre às 15h

 
2007-10-17

Para aceder ao link, clicar no banner.

2007-10-06

Se pretendermos verificar o número de ocorrências num determinado Range, sejam as ocorrências "MG", "VM", "PR" e "MD", como no seguinte exemplo:

podemos utilizar a seguinte fórmula, adaptada a cada uma das ocorrências:

="MG" & " " &SUMPRODUCT(--(RIGHT(A1:F2;2)="MG"))

="MV" & " " &SUMPRODUCT(--(RIGHT(A1:F2;2)="VM"))

="PR" & " " &SUMPRODUCT(--(RIGHT(A1:F2;2)="PR"))

="MD" & " " &SUMPRODUCT(--(RIGHT(A1:F2;2)="MD"))

 

Tópicos relacionados:

2007-10-05

Se pretendermos apagar a Row que contém a célula activa na Sheet1 e, de igual modo, a Row na Sheet2 que contenha a primeira ocorrência igual à célula activa da Sheet1, podemos utilizar o seguinte Código:


'---------------------------------------------------------------------------------------
' Procedure : Test
' DateTime  : 05-10-2007 17:57
' Author    : JRod
' Purpose   : Apagar Row da célula activa na Sheet1 e 1ª Row da Sheet2
'           : cuja entrada seja igual à célula activa
'---------------------------------------------------------------------------------------
'
Sub Test()
    Dim c As Range, myRange As Range
    On Error Resume Next
    Set myRange = Sheets(2).Range("A1:A100")

    For Each c In myRange
        If c.Value = ActiveCell.Value Then
            c.EntireRow.Delete
        End If
    Next c
    ActiveCell.EntireRow.Delete
End Sub

 

Se quisermos executar o código, a partir do menú que se acede a partir do clicar no botão direito do rato, podemos incluir o seguinte código no Workbook:
 
'---------------------------------------------------------------------------------------
' Procedure : Workbook_Open
' DateTime  : 05-10-2007 18:00
' Author    : JRod
' Purpose   : Abre Macro com click no botão direito do rato
'---------------------------------------------------------------------------------------
'
Private Sub Workbook_Open()

    Dim MyMenu As Object

    Set MyMenu = Application.ShortcutMenus(xlWorksheetCell) _
                 .MenuItems.AddMenu("A minha Macro", 1)

    With MyMenu.MenuItems
        .Add "Test", "Test", , 1, , ""

    End With

    Set MyMenu = Nothing

End Sub

 

Tópicos relacionados:

2007-10-02

Recebi hoje a seguinte mensagem da Microsoft:

" Dear Jorge Rodrigues, 
Congratulations! We are pleased to present you with the
2008 Microsoft® MVP Award!".

 

Ou seja, fui galardoado, pelo 3º ano consecutivo, Microsoft MVP Excel!!!

 

URRA!!!

2007-09-25

Clicar no banner para aceder ao link


Data: 24 de Outubro (15h00-18h30)
Local: Auditório dos Oceanos, Casino de Lisboa - Parque das Nações
Produtos: Microsoft Expression, Silverlight
Destinatários: Designers

2007-09-14
Por mail, formularam a seguinte questão (adaptada): "Tenho uma folha em excel e gostaria de, quando eu digitasse o código de um trabalhador numa coluna de outra folha, fosse efectuada uma verificação na primeira folha, e, se a coluna com o nome "BAIXA", correspondente ao código digitado fosse diferente de "S", o código fosse guardado, mas, se fosse igual a "S" , aparecesse uma mensagem e apagasse esse mesmo código."
 

Vejamos o exemplo:

Na folha1:

 
Na folha 2:
 
O Código (inserido do seguinte modo na folha 2):
 

Private Sub Worksheet_Change(ByVal Target As Range)
'JRod - Microsoft [MVP] - Excel
'blog: http://EXCELer.blogspot.com
'site: http://www.exceler.org
'email1: mail@exceler.org
'email2: blog.exceler@netcabo.pt
'
    Const WS_RANGE As String = "A2:A10"

    Dim c As Range, myRange As Range

    On Error GoTo ws_exit

    Application.EnableEvents = False

    If Not Intersect(Target, Me.Range(WS_RANGE)) Is Nothing Then
        With Target
            Set myRange = Sheets(1).Range("A2:A10")
            For Each c In myRange
                If c.Value = ActiveCell.Offset(-1, 0).Value Then

                    If c.Offset(0, 1).Value = "S" Then
                        MsgBox "O trabalhador encontra-se de Baixa." & Chr(10) & "Inserção Impossível!", Buttons:=vbInformation
                        ActiveCell.Offset(-1, 0).Activate
                        ActiveCell.Value = ""
                    End If

                End If
            Next
        End With
    End If

ws_exit:
    Application.EnableEvents = True

End Sub

 

Tópicos relacionados:

2007-09-06
Num newsgroup, colocaram a seguinte questão (adaptada):
 
"Tenho uma folha em que na coluna A, tenho datas no seguinte formato"06-09-2007", na coluna B e na coluna C tenho valores. Não estou a conseguir, mediante a utilização da formula=SUMIF(A1:A1000;MONTH(6);B1:B1000), somar todos os valores da coluna B correspondentes ao mês 6" .
 
Rodrigo Ferreira [Brasil - gostaria de saber mais sobre este "adicto" do Excel...], apresentou a seguinte possível solução:
 

=SUMPRODUCT((MÊS(A1:A1000)=6)*B1:B1000)

 

Eu, resolvi apresentar a seguinte alternativa:

{=SUM((MONTH(A1:A1000)=6)*(B1:B1000))}'como um array, ou seja com CTRL+SHIFT+ENTER para obter {}


 

KL (MVP Kiril Lapin) mostrou, entre outras, uma terceira possível solução:
 

=SUMIF(A1:A1000;">="&DATE(2007;6;1);B1:B1000)-SUMIF(A1:A1000;">"&DATE(2007;6;30);B1:B1000)

 


Bom, a escolha é vossa!!!

 

Tópicos relacionados:

2007-08-25
Por mail, colocaram-me a seguinte pergunta (adaptada): "Estou pretendendo fazer o seguinte: Utilizar um formulário para alimentar dados numa folha. Existirá uma forma de quando mandar salvar (botão Adiciona), seja verificado se todos os campos foram preenchidos?"

A imagem do que se pretende:

 

 

O segmento de Código, apenas para o fim em vista:  

  For Each C In Me.Controls
     If TypeName(C) = "TextBox" Or TypeName(C) = "ComboBox" Then
       If C.Value = "" Then
         MsgBox "Por favor, preencha todos os campos!"
         C.SetFocus
         Exit Sub
       End If
     End If
   Next

Créditos para Bill Manville

 

Tópicos relacionados:

2007-08-17
A propósito de uma questão (adaptada) que me foi colocada, via e-mail: "É possivel fazer um sorteio com uma apresentação onde eu veja os números rodando em cada caixa até parar no número sorteado? Ou seja, o programa estará gerando os números randomicamente num determinado período. Digamos que para gerar a primeira dezena ele ficará randomicamente num loop de 100 voltas e o centésimo número gerado será a primeira dezena sorteada (unidades), e assim sucessivamente até a última dezena (dezenas, centenas e milhares). Porém eu gostaria de ver cada um dos números sendo exibidos mesmo que em frações de milésimos.É possível?", aproveitei um segmento de código que "apanhei" na net e introduzi-lhe algumas alterações, para obter o efeito desejado.
 
A ideia, será a seguinte, nas duas imagens:
 
com a visualização de um "rollup" de números aleatórios até à sua fixação, seguindo-se a ordem descrita:

O Código:

Sub Macro1()
    Dim i, z, choice, balls(10)
    
    Range("A17").Select 'Para referência da ActiveCell

    
    For i = 0 To 9
        balls(i) = i
    Next
    
    Randomize Timer
    
    For i = 4 To 1 Step -1 ' da direita para a esquerda
        For z = 100 To 1 Step -1
            choice = 1 + Int((Rnd * (10 - 1)))
            ActiveCell.Offset(0, i - 1).Value = balls(choice)
        Next z
        balls(choice) = 0
    Next
End Sub

Tópicos relacionados:

2007-08-12
Num newsgroup, colocaram a seguinte questão: "Gostaria que nas células que o utilizador percorra, A1, A2, A3, onde vai depositando valores numericos, esses mesmos valores sejam automaticamente carregados para uma outra célula, que será sempre a mesma, por exemplo em C5, isto porque em C5 a cada valor percorrido na coluna A, vão sendo efectuados diversos cálculos baseados nos valores dos inputs que vão sendo feitos. Eu apenas consegui atingir este objectivo colocando um botão, que o utilizador deverá carregar, quando se posicionar em A1, A2, A3 etc, que copia os valores SEMPRE para C5. Mas isto obriga a que o utilizador carregue num botão o que não dá muito jeito".
 
Através do exemplo que se segue, entende-se o que é pretendido.
 
Supondo que a célula de input é uma das que compõem o Range A1:A10 e que a célula que vai receber igualmente o valor é C5: ao digitarmos o valor 3 em A5C5 toma também o valor 3:
 
 
e ao digitarmos o valor 7 em A7, então C5 tomará igualmente esse valor, o mesmo se passando para as restantes células do Range A1:A10:
 
 

O Código:

Private Sub Worksheet_Change(ByVal Target As Range)
'JRod - Microsoft [MVP] - Excel
'blog: http://EXCELer.blogspot.com
'site: http://www.exceler.org
'email1: mail@exceler.org
'email2: blog.exceler@netcabo.pt
'
Const WS_RANGE As String = "A1:A10"
Dim vValor As Long

    On Error GoTo ws_exit
    Application.EnableEvents = False

    If Not Intersect(Target, Me.Range(WS_RANGE)) Is Nothing Then
        With Target
        ActiveCell.Offset(-1, 0).Activate
        vValor = Application.ActiveCell.Value
        Range("C5") = vValor
        End With
    End If
    
ws_exit:
    Application.EnableEvents = True
  
End Sub


Nota: O Código deve ser inserido no próprio módulo da Sheet activa.

 

Tópicos relacionados:

2007-08-10

Há dias, num newsgroup, colocaram a questão de saber como se poderia ordenar um range dinâmico em termos de linhas, com o tipo de ordenação na horizontal (por linha) e da direita para a esquerda.

Tomemos o seguinte exemplo demonstrativo da pretensão e do consequente resultado:




 

O Código:

Sub SortRow()
'JRod
'
'Copyright 2007
   Dim R, RowNum As Long
   RowNum = ActiveSheet.UsedRange.Rows.Count
   For R = 2 To RowNum + 1
    Range("A" & R & ":E" & R).Sort key1:=Range("A" & R), _
        Order1:=xlAscending, Header:=xlNo, _
        OrderCustom:=1, MatchCase:=False, _
        Orientation:=xlLeftToRight
   Next R
End Sub

 

Tópicos relacionados:

2007-07-29

Por mail, colocaram-me a seguinte questão (adaptada):

 "Estou a criar um registo de membros... contudo, dado que o seu número facilmente poderá chegar aos 50, corro o risco de criar entradas duplicadas.
Assim, e depois de mais uma visita ao Exceler encontrei um post sobre o assunto [post de 2004-12-16]. Mas, a solução apresentada não me pareceu funcionar com texto... Agradeço, se possível, a informação de se será possível aplicar ou não a texto... "


Várias soluções se podem apresentar.


Uma delas, por exemplo, será a utilização de "Data Validation". No exemplo seguinte, sempre que se escrever numa das células do Range um conteúdo duplicado, vai dar uma mensagem:

Como fazer:

 

Outra possibilidade, é utilizar uma fórmula [com o mesmo Range de exemplo (D1:D10)] - na célula E1: =IF(MAX(COUNTIF($D$1:$D$10;$D$1:$D$10))>1;"Duplicado";"")
e copiando até ao fim do range [no exemplo,E1:E10] - Neste caso, vai dar TODAS as entradas duplicadas no range D1:D10, ou seja, considera entrada duplicada as duas entradas:.

 

Outra possibilidade ainda será, se se pretender que apenas as entradas duplicadas sejam consideradas, então teremos, no exemplo, em F1:
=IF(D1="";"";IF(MATCH(D1;D$1:D$10;0)<ROW(D1);"Duplicado!";""))
e copiando de F1 até F10:

 

Tópicos relacionados:

2007-07-24

Há dias, num newsgroup, colocaram a seguinte questão (adaptada): "Dado o elevado n.º de códigos postais, os mesmos têm de ser colocados em 2 colunas, com a devida correspondencia de localidade na coluna seguinte. Como fazer para, na mesma folha, e numa determinada célula, quando digitasse, por exemplo, 8125-421, noutra célula aparecer a localidade correspondente, ou seja, Vilamoura?"
 

Para uma possível solução e de modo a tornarmos a apresentação um pouco mais agradável (utilizando uma TextBox em vez de uma célula, para apresentar o resultado), tomemos, então, o seguinte exemplo:

 

O que se pretende será:

  • Digitar o Código Postal em B10
  • Pesquisar nas Colunas "E" e "G" pelo Código Postal
  • Se existir, mostrar a cidade correspondente numa TextBox

 

No exemplo, a primeira acção a tomar, será criar a TextBox:

 

E, depois, para efectuar a pesquisa, por coluna, do Código Postal, digitar o seguinte, por exemplo em:

N5: =IF(ISNA(INDEX($F$3:$F$9;MATCH(B10;$E$3:$E$9;0)));"";INDEX($F$3:$F$9;MATCH(B10;$E$3:$E$9;0)))

e em N6: =IF(ISNA(INDEX($H$3:$H$9;MATCH (B10;$G$3:$G$9;0)));"";INDEX($H$3:$H$9;MATCH(B10;$G$3:$G$9;0)))

Para concatenar as duas células e obtermos o resultado apenas numa, digitaremos então,

em N8: =N5&N6

 
Voltando novamente à TextBox, podemos renomeá-la, no exemplo, para "Result" e, estando activa, digitar na Barra de Fórmula a referência à célula N8, para obtermos o resultado esperado:
 

 

Tópicos relacionados:

2007-07-08

 Há dias, por mail, fizeram-me a seguinte pergunta:

"Como hei-de fazer para que, partindo do seguinte conteúdo em duas células: 20+500- e 18+200, tenha como resultado numa terceira célula, o seguinte: 2+300 e, sempre que altere um destes valores parcelares, no mesmo formato, o resultado reflicta essa alteração?"

 

O exemplo:

 

A fórmula:

=LEFT(A1;2)-LEFT(B1;2)&"+"&MID(A1;4;3)-RIGHT(B1;3)


 

Tópicos relacionados:

2007-06-21

Já reparou que pode ver, alterar, apagar ou fazer merge de estilos, no Excel?


Vá a FORMAT | STYLE:


 

  • Tópicos relacionados:

Using Styles in Excel (I)

Using Styles in Excel (II)

Style Object

Styles Collection

2007-06-09

Normalmente, nas nossas Macros, quando pretendemos seleccionar uma Sheet, ou, por exemplo, limitar a uma área de scroll, utilizamos o seguinte Código:

Sheets("INICIO").Select
Sheets("INICIO").ScrollArea = "A1:Q31"

 

O que pode acontecer é que um utilizador, pelo facto de não ser possível proteger o tabulador que dá o nome à Sheet [que, no nosso exemplo, tem o nome "INICIO"], resolve alterar o nome do tabulador, para "FIM".

Resultado: uma mensagem de erro, porque o que o código diz, é que a folha se denomina "INICIO" e, na realidade, o que lá se encontra é o nome "FIM".

Uma maneira de obviar o problema, é resolvê-lo pela via mais simples, ou seja, "obrigar" que a folha seja seleccionada e faça o scroll limitado, independentemente do nome que o tabulador tenha. Assim, se a folha com o nome "INICIO" ou com o nome "FIM" for efectivamente a 1ª folha, então podemos utilizar, em vez de indicar o nome da folha como está acima, o seguinte [o mesmo será para as outras folhas, mudando apenas o algarismo]:

Sheet1.Select
Sheet1.ScrollArea = "A1:Q31"

 

Outra maneira, é  "obrigar" que a folha, ao ser aberta, venha a adquirir o nome que nós pretendemos inicialmente, ou seja, que fique com o nome "INICIO":

Dim tabName


Sheet1.Select
tabName = "INICIO"
ActiveSheet.Name = tabName

Sheets("INICIO").ScrollArea = "A1:Q31"

 

Por último, porque não esconder, pura e simplesmente, o(s) tabulador(es)? Assim, de certeza que já não haverá "tendências" para fazer alterações inconvenientes ;-)

O Código para pôr a barra dos tabuladores na situação de "hidden":

Private Sub Workbook_Open()
    'Tira a barra de tabuladores com os nomes das folhas...
    ActiveWindow.DisplayWorkbookTabs = False
End Sub

2007-06-06

Se pretendermos apagar linhas inteiras a partir de células vazias num determinado range, incluindo uma mensagem de alerta se, nesse range, não houver nenhuma célula vazia, podemos utilizar o seguinte código:

 

Sub FindAndDelete()

    Dim myRange As Range

    On Error Resume Next
    Set myRange = Range("A1:A100")

    If Application.CountA(myRange) = 100 Then
        MsgBox "Não existem células vazias no Range!"
    Else
        myRange.SpecialCells(xlBlanks).EntireRow.Delete
    End If

End Sub

 

  • Tópicos relacionados:

SpecialCells Method

Função CountA()

2007-05-26

 

O TechEd  Developers  é a maior Conferência europeia anual da Microsoft para Programadores e Arquitectos. São 5 dias de formação técnica avançada, organizados por 13 core tracks e inúmeras Breakouts,  Whiteboard Discussions, Demo Extravaganzas, Self-Paced Hands-on Labs, Painéis de Discussão, Apresentações das Comunidades e muito mais.

Datas importantes para registo:

Super Early Bird - até 31 Julho 2007: €1,945 – desconto de €300 sobre Full Price, MAIS convite para assistir a sessões exclusivas privadas com os Top Speakers da Microsoft.

Utilize o código TED11200.

Early Bird - até 28 Setembro 2007: €1,945 - €300 sobre Full Price

Full Price – a partir de 29 Setembro: €2,245

Aceda ao Web site para informação mais detalhada sobre o registo.

www.microsoft.com/europe/teched-developers/

2007-05-23

Por mail, recebi a seguinte pergunta: "Tenho o office 2003 instalado e necessito de colocar numa fórmula mais de sete "IF's" consecutivos, pois estou a comparar valores do mês actual com valores de meses anteriores. Como fazer?"

Como é sabido, o Excel apenas permite até 7 IF's [Função IF()] aninhados.

Uma das maneiras de obviar este pequeno problema, será utilizar uma UDF [User Defined Function] que permita estabelecer mais do que 7 critérios.

A UDF que apresento a seguir [a qual deverá ser copiada para um módulo de VBA, utilizando ALT + F11, para a ceder ao Editor de VBA e criando um novo módulo - Insert > Module -], possibilita a utilização de tantos critérios, quantos os que sejam necessários, embora se verifique que, quantos mais critérios, mais lento se tornará o cálculo, como é evidente.

 

O Código (créditos para Harlan Grove - ver perfil):

Function multi_if(ParamArray a() As Variant) As Variant
    Dim i As Long, n As Long

    n = UBound(a)

    If n Mod 2 = 0 Then
        multi_if = a(UBound(a))
        n = n - 1
    Else
        multi_if = False
    End If


    For i = 0 To n Step 2
        If CBool(a(i)) And i < n Then
            multi_if = a(i + 1)
            Exit For
        End If
    Next i
End Function


E, agora, apresento a máscara de utilização da função:

=multi_if (condition_a;value_a;condition_b;value_b;condition_c;value_c;
condition_d;value_d;condition_e;value_e;condition_f;value_f;
condition_g;value_g;condition_h,value_h;value_else)

 

O exemplo:

  =multi_if(AP4=0;0;$D4<>0;AP4/$D4;$J4<>0;AP4/$J4;$N4<>0;AP4/$N4;$R4<>0;AP4/$R4;$V4<>0;AP4/$V4;$Z4<>0;AP4/$Z4;$AD4<>0;AP4/$AD4;$AH4<>0;AP4/$AH4;$AL4<>0;AP4/$AL4;1)

 

  • Tópicos relacionados:

Nested IF's - Chip Pearson

How to avoid nested If's in Excel - Mark Kelly

2007-05-10

Há dias, perguntaram-me, por mail, como seria possível construir uma fórmula que, numa determinada sheet, apontasse para uma célula de outra sheet, de forma a que, se na primeira fosse adicionada uma nova coluna, a fórmula não sofresse alteração, ficando, deste modo a apontar sempre para a mesma célula. Vejamos então o exemplo:

Na sheet1, na célula B8, temos determinado conteúdo, no caso, o texto "teste":

Por sua vez, na sheet2, temos em D5, a referência à célula B8, da sheet1:

Vamos então inserir, na sheet1, uma nova coluna, passando, deste modo, a antiga coluna B para coluna C:

O que vai acontecer, é que a referência, na sheet2, para a sheet1 passa a ser para a célula C8:

Agora, vamos inserir na nova coluna B, em B8, o texto "teste1":

E, na sheet2, construimos s seguinte fórmula, em B10, com referência à célula B8, da Sheet1. O resultado será:

O resultado será:

O que resulta, é que, com a função INDIRECT(), a referência à célula B8 da sheet1 é uma referência que se mantém, mesmo que se adicionem colunas nessa sheet: