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-08-11
Podemos utilizar o comando Goal Seek (Tools|Goal Seek) para resolvermos, por exemplo, equações. Tomemos a seguinte equação: x+x+x/4+1=100 => 4x+4x+x=396 => 9x=396 => x=396/9 => x=44.

Utilizando o Excel:

A célula A1 será a incógnita (x). Digitamos o valor 0 (zero)

Em B1: =A1+A1+A1/4+1



Utilizando o comando Goal Seek:



O valor colocado no campo "To value" faz parte da equação (100):



E o resultado é dado na célula A1, ou seja, 44, que é o valor de x e o resultado da equação:

2006-08-07
Sabendo como funciona o Operador de Divisão Inteiro (\), então, podemos construir uma UDF, que mais não é do que a Função do Excel denominada QUOTIENT().

Vejamos o exemplo no seguinte screenshot:




O Código da Função IntDiv():

Function IntDiv(ByVal vStr As Double, vStr1 As Double) As Double


    Dim oStr As String

    oStr = vStr \ vStr1

    IntDiv = oStr

End Function


Nota -
Como se pode verificar, é indiferente colocar directamente o valor do dividendo e do divisor ou apenas colocar o endereço das respectivas células que contêm os valores mencionados.
Ao contrário do operador de divisão usual no Excel (/), que nos fornece um resultado com valor fraccionário, o operador de divisão inteiro (\), no VBA, dá-nos sempre o resultado num número inteiro, com nenhuma divisória fracionária.

Vejamos o exemplo:




O Código da função Teste():

Function Teste()

    Dim oDbl As Double
    Dim vA1 As Double
    Dim vA2 As Double

    vA1 = Range("a1")
    vA2 = Range("a2")

    oDbl = vA1 \ vA2

    Teste = oDbl

End Function


  • Tópicos relacionados:


  •  Integer Division (\)

     Function Quotient()

     Function Mod()

     Function Round()

    2006-07-29
    Se pretendermos colorir as células que contenham um determinado nome que se encontre numa lista (Range), podemos clicar na célula de outra lista que contém o nome requerido, como no exemplo:








    Podemos utilizar o seguinte Código:


    Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)

        Dim tabela As Range
        Dim nomeLista As Range
        Dim cell As Range

        Set tabela = Range("B1:B20")
        Set nomeLista = Range("D10:H10")

        tabela.Interior.ColorIndex = 0
        If Target.Count = 1 Then
            If Not Intersect(Target, nomeLista) Is Nothing Then
                For Each cell In tabela
                    If cell.Value = Target.Value Then
                        cell.Interior.ColorIndex = 5
                    End If
                Next cell
            End If
        End If

    End Sub


    Nota: O Código deve ser inserido no próprio módulo da Sheet activa.


  • Tópicos relacionados:


  •  Cell Colors

     Color Palette & ColorIndex
    2006-07-25
    Se pretenderemos que o que digitarmos, por exemplo numa InputBox, apareça em maiúsculas e o respectivo conteúdo apareça numa determinada célula também com a mesma condição, podemos utilizar, via VBA, funções API do Windows.

    O Código:

    Declare Function GetKeyboardState Lib "user32" _
                                      (pbKeyState As Byte) As Long
    Declare Function SetKeyboardState Lib "user32" _
                                      (lppbKeyState As Byte) As Long

    Sub Abrir()
        Dim User As String
        Dim Res As Long
        Dim KBState(0 To 255) As Byte


        Res = GetKeyboardState(KBState(0))
        KBState(&H14) = 1  ' 1 para "on", 0 para "off"; &H14 (CapsLock) &H90 (NumLock)



        Sheets("Progressivo").Select

        Do While User = ""
            User = InputBox(Prompt:="Digite o seu nome e Enter para continuar", Title:="Nome")
        Loop

        Range("O34").Select
        ActiveCell.FormulaR1C1 = User
        
        KBState(&H14) = 0  ' 1 para "on", 0 para "off"

        Res = SetKeyboardState(KBState(0))

    End Sub



  • Tópicos relacionados:


  •   Num Lock, Caps Lock e Scroll Lock Toogle

      Windows API Functions
    2006-07-20
    Por vezes, podemos ter necessidade de saber qual foi o utilizador que acedeu e quando acedeu a uma determinada worksheet, nomeadamente quando se trabalha em rede.

    O Código:

    Private iNextRow As Long
    Const HIDDEN_SHEET As String = "Sheet3"    ' ou outro nome


    Private Sub Workbook_Open()
         With Worksheets(HIDDEN_SHEET)
             .Range("A1").Value = Environ("UserName")
             .Range("B1").Value = Format(Date + Time, _
                             "dd mmm yyyy hh:mm:ss")
         End With
         iNextRow = 2


    End Sub

    Private Sub Workbook_SheetChange(ByVal Sh As Object, _
                                     ByVal Target As Range)
         On Error GoTo wb_exit
         Application.EnableEvents = False
         If Sh.Name <> HIDDEN_SHEET Then
             With Worksheets(HIDDEN_SHEET)
                 .Range("A" & iNextRow).Value = Environ("UserName")
                 .Range("B" & iNextRow).Value = Format(Date + Time, _
                                         "dd mmm yyyy hh:mm:ss")
             End With
         End If


    wb_exit:
         Application.EnableEvents = True
    End Sub


    NOTA: Este código deve ser colocado no próprio workbook, porque é um evento dele. Para tal, clicar no ícone que está à esquerda do comando chamado "File", no Toolbar , com a tecla direita do rato e escolher a opção "View Code". Copiar o código para o editor de VBE. Depois, sair e gravar o ficheiro. Quando se abrir novamente, ver-se-á, na Sheet3 (ou naquela que determinámos no código), o nome do utilizador, a data e hora do último acesso.

  • Tópicos relacionados:


  •  Environ Function - Microsoft Visual Basic Help (com o editor de VBE activo)

     Environ Function (MSDN Library)

     Environ Function Example




    2006-07-03

    Pergunta efectuada por mail:

    Tenho uma lista de nomes de pessoas e por baixo a sua pontuação...

    O que pretendo é que por baixo da pontuação apareça a posição, do genero...



    Uma possível solução, será a seguinte fórmula em A3, com cópia até D3:

    =RANK(A2;$A$2:$D$2;0)& "º"

    E se se pretender que não haja o salto da terceira posição? Neste caso, poderá utilizar-se a seguinte fórmula, como Array, em A4, copiando até D4:

    {=RANK(A2;$A$2:$D$2)-(COUNTIF($A$2:$D$2;">"&A2)-SUM((1/COUNTIF($A$2:$D$2;$A$2:$D$2))*($A$2:$D$2>A2))) & "º"}


    Nota: Não esquecer que as chavetas são conseguidas através das teclas CTRL + SHIFT + ENTER na fórmula activa, porque se trata de um Array.

  • Tópicos relacionados:


  •   1 - Função RANK()

      2 - Função RANK()

      1 - Função COUNTIF()

      2 - Função COUNTIF()

      Array
    2006-06-30
    Num newsgroup de Excel, foi colocada a seguinte questão:

    "Pretendo imprimir n cópias de uma folha em excel, mas pretendo que cada uma delas tenha um número diferente, tipo a numeração de um livro."

    Resposta possível, em VBA:

    Sub ImprimeSequencial()

    Dim StartNumber, EndNumber, TempNumber, TempAnswer As Integer


    Do
      StartNumber = InputBox("Indique o primeiro número da Sequencia")
      EndNumber = InputBox("Indique o último número da Sequencia")


      TempAnswer = MsgBox("Vão ser impressas " & EndNumber - StartNumber + 1 & _
      " folhas! OK?", vbYesNoCancel, "Confirmar números...")


        Select Case TempAnswer
            Case vbCancel
                Exit Sub
            Case vbYes
                Exit Do
        End Select
    Loop


      For TempNumber = StartNumber To EndNumber
          ActiveWorkbook.Sheets("Sheet1").Range("E30").Value = TempNumber
          ActiveWorkbook.Sheets("Sheet1").PrintOut
      Next TempNumber
    End Sub



    ATENÇÃO:
    Em:
    ActiveWorkbook.Sheets("Sheet1") - alterar "Sheet1" pelo nome da Sheet pretendida;
    Em:
    Range("E30"), alterar para a célula onde se pretende que apareça a numeração para impressão.
    2006-06-12
    Se pretendermos somar dias, meses e anos a uma determinada data, como no exemplo:



    podemos utilizar uma UDF:

    Public Function CalculaData(ByVal datDataInicial As Date, ByVal intAnos As _
    Integer, ByVal intMeses As Integer, ByVal intDias As Integer) As Date

    ' Utilização da Função de VBA DateAdd()
    ' Soma Anos, Meses e Dias a uma determinada Data
    ' Exemplo da Função numa célula: Em A1: = =CalculaData("1-1-2006";0;5;11)
    ' Ou seja, soma 0 anos, 5 meses e 11 dias à data 1/1/2006 - Resultado: 12/06/2006
    ' Atenção: é preciso formatar a célula como Data!
        
        Dim datResult As Date
        
        datResult = DateAdd("yyyy", intAnos, datDataInicial)
        datResult = DateAdd("m", intMeses, datResult)
        datResult = DateAdd("d", intDias, datResult)
        CalculaData = datResult

    End Function


  • Tópicos relacionados:


  •   Função DATEADD()

      Adicionar datas
    2006-06-04
    Tomemos, por exemplo, em A1, o seguinte Nome + Apelido: "Jorge Rodrigues"

    Para inserir o Nome numa outra célula:

    =LEFT(A1;FIND(" ";A1)-1)

    ou

    =LEFT(TRIM(A1);FIND(" ";TRIM(A1))-1)


    Para inserir o Apelido:

    =RIGHT(A1;LEN(A1)-FIND(" ";A1))

    ou

    =MID(A1;FIND(" ";A1)+1;256)

    ou

    =RIGHT(A1;LEN(A1)-SEARCH(" ";A1;1))

    ou

    =MID(TRIM(A1);FIND(" ";TRIM(A1))+1;LEN(A1))


    Código VBA de uma Função UDF para obter o Apelido:

    Function apelido(tot)
        For I = 0 To Len(tot) - 1
            Var = Var & Mid(tot, Len(tot) - I, 1)
        Next I
        apelido = Right(tot, InStr(Var, " "))
    End Function



    em A1: =apelido(A1)