About Me

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

Seguidores

Estatisticas

Free Blog Counter

eXTReMe Tracker
2006-05-29
Se se pretender mostrar numa determinada célula o conteúdo de uma outra célula de outra worksheet que pode não ser sempre a mesma, ou seja, por exemplo, a célula mostrar o valor correspondente ao valor acumulado do mês que se encontra numa determinada worksheet, cuja identificação é numérica e está baseada na digitação efectuada numa outra célula ( se valor 1, então Janeiro, se valor 2, então Fevereiro, etc.), pode utilizar-se a Função INDIRECT() para obter o resultado esperado:

O exemplo:









A Fórmula:

=INDIRECT("'"&$B$7&"'!D3")
2006-05-16
Se pretendermos verificar em determinado Range se uma célula de uma coluna tem no seu conteúdo, por exemplo, o texto "REPARADO" e, em caso afirmativo, marcar toda a linha desse Range com um fundo colorido (no exemplo, o verde):






e, se, ao apagarmos o texto da célula, a cor da linha também venha a ser desfeita, como no exemplo:






Então podemos utilizar o seguinte Código:

Private Sub CommandButton1_Click()
    Dim r As Long
    For r = UsedRange.Rows.Count To 1 Step -1
        If Range("G" & r) = "REPARADO" Then _
           Range("A:J").Rows(r).Interior.ColorIndex = 10
    Next r

    For r = UsedRange.Rows.Count To 1 Step -1
        If Range("G" & r) = "" Then _
           Range("A:J").Rows(r).Interior.ColorIndex = 2
    Next r

End Sub
2006-05-07
Na continuação do post de 27 de Abril p.p., se pretendermos filtrar, por exemplo, por cliente e preparar a impressão de modo a só imprimir os dados filtrados,



podemos utilizar o seguinte código:

'-------------------------------------------------------------------------------
' Procedure : Filtra_Cliente_Click
' DateTime  : 02-05-2006 20:23
' Author    : JRod
' Purpose   : Efectua Filtro por Cliente e prepara para impressão filtrada
'-------------------------------------------------------------------------------
'
Private Sub Filtra_Cliente_Click()
    Dim myCliente

    myCliente = ActiveCell.Value
    Range("E6:E700").Select

    If myCliente = "" Then
        Selection.AutoFilter
        Range("K1").Select
    Else
        Selection.AutoFilter Field:=1, Criteria1:="=" & myCliente, Operator:=xlAnd
        ActiveSheet.PageSetup.PrintArea = ActiveCell.CurrentRegion.Address
        Range("K1").Select

    End If
End Sub


NOTA: No exemplo, para estabelecer o filtro pelo cliente desejado, clica-se na célula pretendida e depois no botão de comando que faz executar o procedimento.
2006-05-01
Se pretendermos contar quantas células existem num determinado Range e que contenham valores apresentadas numa determinada cor, ou se quisermos somar os valores com a mesma cor contidos nesse mesmo Range, como no exemplo seguinte:

,

podemos criar duas User Defined Functions (UDF). Por outro lado, para sabermos a que número corresponde cada uma das 56 cores da palette de cores do Excel, podemos utilizar uma macro, que, ao que julgo, é da autoria do MVP Excel - Tom Ogilvy.

Os Códigos:

(Para contar as ocorrências):

Option Explicit

Function CountFc(rng As Range, Num As Long)

    Dim Item
    Application.Volatile
    For Each Item In rng
        If Item.Font.ColorIndex = Num Then CountFc = CountFc + 1
    Next
    
End Function


(Para somar as ocorrências):

Option Explicit


Function SumFC(Source As Range, Num As Long)

Application.Volatile
    Dim total As Double
    Dim cell As Range
    For Each cell In Source
        With cell
            If .Font.ColorIndex = Num Then
                total = total + .Value
            End If
        End With
    Next
    SumFC = total
    
End Function


(Para mostrar a palette de cores):

' By Tom Ogilvy

Sub ShowPalette()

    varr = SetPaletteArray
    Set rng = Cells(1, 1).Resize(7, 8)
    rng.Value = varr
    rng.HorizontalAlignment = xlCenter
    For Each cell In rng
        cell.Interior.ColorIndex = cell.Value
    Next
    Range("A:H").ColumnWidth = 3.29
    Range("A1:H2,A7,H7,E6,E7,F7").Font.ColorIndex = 2
    
End Sub


Public Function SetPaletteArray()


    varr1 = Evaluate(" { 1,53,52,51,49,11,55,56; " & _
                     "9,46,12,10,14,5,47,16;" & _
                     "3,45,43,50,42,41,13,48;" & _
                     "7,44,6,4,8,33,54,15;" & _
                     "38,40,36,35,34,37,39,2;" & _
                     "17,18,19,20,21,22,23,24;" & _
                     "25,26,27,28,29,30,31,32}")


    SetPaletteArray = varr1
End Function


Nota:

Como muito bem refere o MVP Excel - Kiril Lapin (KL), num newsgroup, a este propósito:

" 1) O problema principal, consiste em que o Excel não tem nenhum evento que seja impelido quando muda o formato da célula e, consequentemente, não há maneira de advertir uma fórmula, função, macro, etc., atempadamente, de que a mudança ocorreu.

2) Como se disse, não podemos detectar o momento da mudança do formato, pelo que só nos resta ir checando periodicamente (quanto mais frequentemente melhor). Isto poderá ser conseguido, entre outras coisas, mediante a volatilidade da fórmula."