Blog Archive
About Me
Seguidores
Estatisticas
210: Excel - VLOOKUP()
=VLOOKUP(B1;D1:F3;3)
e em A1, como resultado pretendido:
=B1*C1
Tópicos relacionados:
209: VBA - Application.InputBox()
"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?"
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
A imagem do que se pretende:
Tópicos relacionados:
208: Excel - Procurar com 2 variáveis - Index & Match()
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:
O Microsoft Excel 5.0/95 e o Office 2003 Service Pack 3
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
Novas Tecnologias para Desenvolvimento Web
Concurso Gadgets de 2007 - Portugal
207: Excel - SUMPRODUCT()
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:
206: VBA: EntireRow.Delete & MenuItems.AddMenu
'---------------------------------------------------------------------------------------
' 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
' 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:
205: 2008 Microsoft MVP Award! URRA!!!!!
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!!!
Expression European Designer Tour
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
204: VBA: - Evento WorkSheet_Change, Método Intersect
Vejamos o exemplo:
Na folha1:
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:
203: Excel - SUMPRODUCT(), SUM() ou SUMIF()?
=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 {}
=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:
202: VBA - Userforms, Controls
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:
201: VBA - Gerar números aleatórios com "rollup"
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:
200: VBA - A Propriedade OFFSET e o Método INTERSECT
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:
199: VBA - Ordenação por linhas - Orientation:=xlLeftToRight
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:
198: Excel - Data Validation, Max(), Countif(), Match() e Row()
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:
197: Excel - IF(), ISNA(), INDEX() & MATCH()
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
Tópicos relacionados:
196: Excel - Left(), Mid() & Right()
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:
195: Excel - Curiosidades (II)
Já reparou que pode ver, alterar, apagar ou fazer merge de estilos, no Excel?
Vá a FORMAT | STYLE:
- Tópicos relacionados:
194: VBA - Curiosidades (I)
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
193: VBA - Apagar linhas num determinado Range
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:
192: Geral - TechEd Developers 2007
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.
191: VBA - IF's aninhados - UDF
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 VariantDim 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:
190: Excel - A Função INDIRECT() [II]
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: