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
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 A5, C5 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: