About Me
Com tecnologia do Blogger.
Seguidores
Estatisticas
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 -
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
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.
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
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.
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.
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.
"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
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
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)
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)
Subscrever:
Mensagens (Atom)