(clica para download)
Um vez mais a equipa da Revista PROGRAMAR traz-lhe uma nova edição.
Com esta 27ª Edição continuamos a aplicar pequenos retoques no design da Revista PROGRAMAR, de acordo com as opiniões que fomos recebendo. Mantivemos as parcerias e fizemos novas com mais comunidades de programação. Tudo isto com o intuito de continuar a trazer até si uma edição de qualidade.
Por isso nesta edição trazemos até si, como artigo de capa, um artigo para Introdução ao ASP .NET MVC 3.0, e ainda os seguintes artigos:
- Lua - Linguagem de Programação (Parte 7)
- Flex e Byacc - Parte III
- Optimização de SQL em Oracle - Índices
- jQuery - A framework
- 6 regras para utilizar AJAX
- Windows Phone 7
- Core Dump - gcc -Wall myApp.c -linstantaneous -o success
- Desenvolvimento em SharePoint 2010
- GuiaTV CoolthingsPT
- Habilitar external users no SharePoint online - Office365
- O Futuro da Programação Assíncrona da Plataforma .NET
E ainda a análise ao livro Silverlight 4.0 - Curso Completo
Mais informação
No artigo anterior, foi mostrado com é possível contar as cores das células ou a cor da fonte, mesmo sendo usada formatação condicional.
Usando duas funções desse artigo, a GetFormatConditionIndex() que verifica se a célula corresponde ao critério definido na formatação condicional, retornando 0 caso não corresponda e o número da formatação, caso corresponda, e a função ClearValue() que simplesmente remove o sinal de igual e garantir que o resultado final é numérico, podemos criar mais duas funções úteis, que nos permitem então verifica que cor está na célula ou na fonte.
Essas funções são a GetFontColorIndex() que verifica qual a cor da fonte que está definida na formatação condicional, indicando o parâmetro ConditionalFormat = True, ou sem ser na formatação condicional, não indicando nada ou o parâmetro ConditionalFormat = False.
' Verifica qual é a cor da fonte
Public Function GetFontColorIndex(ByVal rng As Range, _
Optional ByVal ConditionalFormat As Boolean = False) As Long
On Error GoTo errorGetFontColorIndex
If rng.Cells.Count = 1 Then
If ConditionalFormat Then
Dim cfIndex As Integer
cfIndex = GetFormatConditionIndex(rng)
If cfIndex > 0 Then
Dim temp As FormatCondition
Set temp = rng.FormatConditions(cfIndex)
GetFontColorIndex = temp.Font.ColorIndex
Else
GetFontColorIndex = 0
End If
Else
GetFontColorIndex = rng.Font.ColorIndex
End If
Else
GetFontColorIndex = 0
End If
Exit Function
errorGetFontColorIndex:
GetFontColorIndex = 0
End Function
A GetFillColorIndex() verifica qual a cor da célula/fundo que está definida na formatação condicional, indicando o parâmetro ConditionalFormat = True, ou sem ser na formatação condicional, não indicando nada ou o parâmetro ConditionalFormat = False.
' Verifica qual é a cor de fundo
Public Function GetFillColorIndex(ByVal rng As Range, _
Optional ByVal ConditionalFormat As Boolean = False) As Long
On Error GoTo errorGetFillColorIndex
If rng.Cells.Count = 1 Then
If ConditionalFormat Then
Dim cfIndex As Integer
cfIndex = GetFormatConditionIndex(rng)
If cfIndex > 0 Then
Dim temp As FormatCondition
Set temp = rng.FormatConditions(cfIndex)
GetFillColorIndex = temp.Interior.ColorIndex
Else
GetFillColorIndex = 0
End If
Else
GetFillColorIndex = rng.Interior.ColorIndex
End If
Else
GetFillColorIndex = 0
End If
Exit Function
errorGetFillColorIndex:
GetFillColorIndex = 0
End Function
Como o valor é verificado em apenas uma célula, pois células diferentes poderiam ter cores diferentes, é verificado se o número de células indicado é igual a 1 para que a função seja válida.
São duas funções simples, mas que podem ser interessantes, especialmente para uma melhor aplicação das formulas referidas no artigo anterior sobre Contar Cores na Formatação Condicional.
Para as usar, é só preciso fazer:
=GetFillColorIndex(A1;TRUE)
=GetFillColorIndex(A1) ou =GetFillColorIndex(A1;FALSE)
=GetFontColorIndex(A1;TRUE)
=GetFontColorIndex(A1) ou =GetFontColorIndex(A1;FALSE)
Espero que vos sejam úteis!
Num artigo anterior, foi mostrado como Contar Cores das Células, de acordo com a indicação da área (range) e o código do cor. Esta função, embora simples, é muito útil, funcionando no entanto apenas se o utilizador aplicar a cor manualmente e não com o uso de formatação condicional.
Com a formatação condicional podemos criar várias formatações para a mesma área, interferindo em diferentes aspectos (fonte, preenchimento, etc), ficando a formatação base inalterável. O que acontece é que o Excel cria camadas nas células, definidas na formatação, ficando a informação original preservada. Por exemplo, se tivermos uma tabela com todas as células com a cor de fundo verde e se a formatação condicional colocar algumas células com a cor de fundo azul, na prática a cor de fundo de todas as células é verde e existe uma camada azul por cima das células que correspondem ao critério definido para a formatação condicional.
Além disso, a versão 2007 ou superior do Excel, sofreu um conjunto de alterações na formatação condicional, sendo agora possível utilizar ícones, shapes, tops, etc, definidos pelo tipo XlFormatConditionType, o que pode obrigar a mais algumas validações (não será no entanto abordado neste artigo)
Em termos práticos não é possível verificar directamente se a formatação está aplicada ou não, o que é possível verificar são os critérios da formatação condicional e com isso, validarmos se a célula corresponde a esses critérios ou não.
Neste exemplo, vamos verificar se os valores das células (xlCellValue) correspondem a um critério definido (maior do que, menor do que, entre, etc), definidos pelo tipo XlFormatConditionOperator, e se corresponderem, então a formatação condicional está visível e usamos essa informação para contar, somar, etc.
Para começar esta pequena função auxiliar, que serve simplesmente para remover o sinal de igual e garantir que o resultado final é numérico.
' Limpa o sinal de igual da fórmula
Public Function ClearValue(ByVal value As String) As Double
Dim tempValue As String
On Error Resume Next
tempValue = Replace(value, "=", "")
If IsNumeric(tempValue) Then
ClearValue = CDbl(tempValue)
Else
ClearValue = 0
End If
End Function
Depois, a função GetFormatConditionIndex() que verifica se a célula corresponde ao critério definido na formatação condicional, retornando 0 caso não corresponda e o número da formatação, caso corresponda (como já foi dito uma célula pode ter diversas formatações condicionais).
Public Function GetFormatConditionIndex(ByVal rng As Range) As Integer
On Error GoTo errorGetFormatConditionIndex
' Caso não tenha qualquer formatação condicional
If rng.FormatConditions.Count = 0 Then
Exit Function
Else
Dim x As Long
Dim cf As FormatCondition
' Ciclo nas formatações condicionais atribuidas
For x = 1 To rng.FormatConditions.Count
' Verifica qual a FormatConditions actual
Set cf = rng.FormatConditions(x)
' Verifica o tipo de formatação
If cf.Type = xlCellValue Then
' Verifica se algumas da opções escolhidas para a
' formatação condicional é valida, ou seja, está visivel
Select Case cf.Operator
Case xlGreater
If rng.value > ClearValue(cf.Formula1) Then
GetFormatConditionIndex = x
End If
Case xlLess
If rng.value < ClearValue(cf.Formula1) Then
GetFormatConditionIndex = x
End If
Case xlEqual
If rng.value = ClearValue(cf.Formula1) Then
GetFormatConditionIndex = x
End If
Case xlNotEqual
If rng.value <> ClearValue(cf.Formula1) Then
GetFormatConditionIndex = x
End If
Case xlGreaterEqual
If rng.value >= ClearValue(cf.Formula1) Then
GetFormatConditionIndex = x
End If
Case xlLessEqual
If rng.value <= ClearValue(cf.Formula1) Then
GetFormatConditionIndex = x
End If
Case xlBetween
If rng.value >= ClearValue(cf.Formula1) And _
rng.value <= ClearValue(cf.Formula2) Then
GetFormatConditionIndex = x
End If
Case xlNotBetween
If rng.value < ClearValue(cf.Formula1) Or _
rng.value > ClearValue(cf.Formula2) Then
GetFormatConditionIndex = x
End If
End Select
End If
' Caso tenha encontrada uma opção válida
If GetFormatConditionIndex > 0 Then Exit Function
Next
' Caso não encontre retorna 0
GetFormatConditionIndex = 0
End If
Exit Function
errorGetFormatConditionIndex:
' Em caso de erro retorna 0
GetFormatConditionIndex = 0
End Function
Finalmente as funções que contam (neste caso podendo ser adaptado para outro objectivo), o número de células com a fonte igual a um determinado número (ColorIndex), com ou sem formatação condicional:
Public Function CountFontColor( _
ByVal rng As Range, _
ByVal ColorIndex As Integer, _
Optional ByVal ConditionalFormat As Boolean = False) As Long
Dim r As Range
Dim result As Integer
On Error GoTo errorCountFontColor
' Verifica na formatação condicional
If ConditionalFormat Then
For Each r In rng
Dim cfIndex As Integer
cfIndex = GetFormatConditionIndex(r)
If cfIndex > 0 Then
Dim temp As FormatCondition
Set temp = r.FormatConditions(cfIndex)
If temp.Font.ColorIndex = ColorIndex Then
result = result + 1
End If
End If
Next
Else
For Each r In rng
If r.Font.ColorIndex = ColorIndex Then
result = result + 1
End If
Next
End If
CountFontColor = result
Exit Function
errorCountFontColor:
CountFontColor = 0
End Function
E a função que conta o número de células com a fundo (background) igual a um determinado número (ColorIndex), com ou sem formatação condicional:
Public Function CountFillColor( _
ByVal rng As Range, _
ByVal ColorIndex As Integer, _
Optional ByVal ConditionalFormat As Boolean = False) As Long
Dim r As Range
Dim result As Integer
On Error GoTo errorCountFillColor
' Verifica na formatação condicional
If ConditionalFormat Then
For Each r In rng
Dim cfIndex As Integer
cfIndex = GetFormatConditionIndex(r)
If cfIndex > 0 Then
Dim temp As FormatCondition
Set temp = r.FormatConditions(cfIndex)
If temp.Interior.ColorIndex = ColorIndex Then
result = result + 1
End If
End If
Next
Else
For Each r In rng
If r.Interior.ColorIndex = ColorIndex Then
result = result + 1
End If
Next
End If
CountFillColor = result
Exit Function
errorCountFillColor:
CountFillColor = 0
End Function
Com estas funções, podemos facilmente usar em qualquer célula:
=CountFontColor(A1:A10;3;TRUE)
=CountFillColor(A1:A10;3;TRUE)
Onde A1:A10 é a área a verificar, 3 o número da cor(neste caso vermelho) e TRUE indicando que a verificação é na formatação condicional. Para não ser verificada na formatação condicional podemos fazer:
=CountFontColor(A1:A10;3)
=CountFillColor(A1:A10;3)
As cores, são definidas na propriedade ColorIndex (podem ser mais detalhes e a palete de cores neste link)
NOTA: Embora este artigo refira as versões 2007 e superior do Excel, também funciona em versões mais antigas.
Espero que este artigo vos seja útil!