Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

Visual Basic Team - Windows Phone 7 Series

A Visual Basic Team criou recentemente no seu blog uma mini série dedicada ao desenvolvimento em Windows Phone 7. São alguns posts muito bem conseguidos, com imagens, código e exemplos.

Os exemplos podem ser descarregados aqui: Code Samples for Windows Phone


Revista PROGRAMAR - 27ª Edição Fevereiro 2011


(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


Excel: Verificar a Cor na Formatação Condicional

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!


Excel: Contar Cores na Formatação Condicional

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!




Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico