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
2008-09-24

Ainda a propósito do post anterior, foi colocada a questão de encontrar uma data que esteja entre a Data inicial e a Data final (por exemplo, 14/03/2007-11/05/2008) e depois partir daí para a contagem dos dias até à data final (que poderá estar também entre uma data inicial e final mais abaixo).


A imagem do que se pretende:

 

image
Ou seja,


Campos a preencher:


- Data de início (será 14/03/2007) - D2
- Data de fim (será 11/05/2008) -D4
- Capital (será 1000) - E2


Resultado pretendido:


De 14/03/2007 a 30/06/2007 - 109 dias à taxa de 0,1058 = 31,60
De 01/07/2007 a 31/12/2007 - 184 dias à taxa de 0,1107 = 55,80
De 01/01/2008 a 11/05/2008 - 132 dias à taxa de 0,1120 = 40,50
-------------------------------------------------- Total de juros: 127,90


Então, com a utilização da função PROCV(), poderemos chegar ao resultado pretendido.


Assim, teremos:

Em F2:=SE(D2="";ARRED(C2*((B2-A2)+1)/365*$E$2;2);ARRED(PROCV(D2;$A$2:$C$4;3)*((B2-D2)+1)/365*$E$2;2))


Em F3:=SE(D3="";ARRED(C3*((B3-A3)+1)/365*$E$2;2);ARRED(PROCV(D3;$A$2:$C$4;3)*((B3-D3)+1)/365*$E$2;2))


Em F4:=SE(D4="";ARRED(C4*((B4-A4)+1)/365*$E$2;2);ARRED(PROCV(D4;$A$2:$C$4;3)*((D4-A4)+1)/365*$E$2;2))
2008-09-22

No Forum do EXCELer, foi apresentada a seguinte questão (adaptada):


“A tabela abaixo representa valores de taxas de juros aplicáveis nas datas indicadas, isto é, entre as datas indicadas aplicam-se as taxas que estão à frente.
      A                  B                  C
1 01/01/07    30/06/07       0,1058
2 01/07/07    31/12/07       0,1107
3 01/01/08    30/06/08       0,1120
4 01/07/08    31/12/08       0,1120


(Em que A= Data de Início
Em que B= Data de Fim
Em que C= Taxa a Aplicar)

Se um documento for emitido em 14/03/07 e contar juros até 11/05/08, é possível obter o valor dos juros na totalidade.


Eu pretendia obter no final valores parcelares, assim:


De 14/03/2007 a 30/06/2007 - 109 dias à taxa de 0,1058 = 31,60
De 01/07/2007 a 31/12/2007 - 184 dias à taxa de 0,1107 = 55,80
De 01/01/2008 a 11/05/2008 - 132 dias à taxa de 0,1120 = 40,50 “


Representemos então, o que se pretende:

 

image


Para calcularmos o número de dias entre as duas datas que contêm a mesma taxa de juro a aplicar, utilizaremos a seguinte fórmula:

Em E1: =(B1-A1)+1

Em E2: =(B2-A2)+1

Em E3: =(B3-A3)+1

(A formatação destas células deverá ser “Número”, sem casas decimais)


E agora, para calcularmos os valores dos juros, de forma parcelar, teremos:

Em F1: =ARRED(C1*E1/365*1000;2)

Em F2: =ARRED(C2*E2/365*1000;2)

Em F3: =ARRED(C3*E3/365*1000;2)

(A formatação destas células deverá ser “Número”, com 2 casas decimais)

 

Tópicos relacionados:

2008-09-06

A estrutura para guardar múltiplos valores - de tipo semelhante ou diferente - chama-se registo. Para definir um registo em VBA, pode utilizar-se a indicação Type (Type Statement), a qual tem a seguinte sintaxe:
 
Type varType
    Variable1 As varType1
    Variable2 As varType2
    ...
    VariableN As varTypeN
End Type

VariableX é o nome da variável e varTypeX. Com uma declaração como esta, pode criar-se um tipo de dados que se pode usar nas nossas aplicações.
 
Exemplo de uma declaração para uma estrutura de registo:
 
Type Meuregisto

    registoNumero As Integer
    registoData As Date
    registoValor As Currency
    registoNome As String * 50

End Type



Esta estrutura pode ser utilizada da mesma maneira que as variáveis normais, como no exemplo a seguir:
 
Private registo1 As Meuregisto
 
Então, a forma de associar valores aos elementos do objecto, seria:
 
registo1.registoNumero = 1
registo1.registoData = "06-09-2008"
.
.
.

 Tópicos relacionados:

2008-08-31

Por mail, fizeram-me a seguinte pergunta (adaptada): "...gostava de incluir a informação ao utilizador quais as medidas a cortar de uma barra para maior aproveitamento, por exemplo: tenho 5 cortes com 112, 1 com 30, 2 com 4 etc etc.. as barras têm 6 metros e a intenção era tirar o maior aproveitamento no corte, para as sobras serem o menor possivel, isto é, escolher valores cuja soma fosse o mais perto possivel dos 6 metros, a mensagem ao utilizador fosse por exemplo: de uma barra cortas 5 com 112 e uma com 30, na outra cortas tantas com tanto e outras ou outra com tanto etc..."


Bom, vejamos a imagem da possível resolução do problema:

 

image

 

As fórmulas:

Em E5: =ARRED.PARA.BAIXO((C1/C5);0)

Em E6: =SE(C6="";"";ARRED.PARA.BAIXO((I5/C6);0))

Em E7: =SE(C7="";"";ARRED.PARA.BAIXO((I6/C7);0))

Em I5: =C1-(C5*E5)

Em I6: SE(C6="";"";I5-(C6*E6))

Em I7: SE(C7="";"";I6-(C7*E7))

 

Mas, e se não quisermos, no exemplo, cortar as 5 barras da medida 112, mas apenas 4? Como faríamos para, aceitando a alteração, harmonizar o número de cortes relativos às outras medidas?

Vejamos então, o exemplo do que agora referi:

image

 

Eis as fórmulas, referentes à coluna I:

Em I5: =SE(F5="";C1-(C5*E5);C1-(C5*F5))

Em I6: =SE(F6="";SE(C6="";"";I5-(C6*E6));SE(C6="";"";I5-(C6*F6)))

Em I7: =SE(F7="";SE(C7="";"";I6-(C7*E7));SE(C7="";"";I6-(C7*F7)))

 

Tópicos relacionados:

 

 

2008-08-16

Se pretendermos utilizar a indicação Option Explicit (Option Explicit Statement), a mesma deve aparecer num módulo antes de todos os procedimentos. Quando a Option Explicit aparece num módulo, devem declarar-se explicitamente todas as variáveis usando as indicações Dim, Private, Public, ReDim, ou Static. Se tentarmos usar uma variável tipo “undeclared”, ocorre um erro na compilação. Se não se utilizar a indicação Option Explicit, todas as variáveis “undeclared” são do tipo Variant, a menos que o tipo seja especificado de outra maneira, por exemplo, com uma indicação de DefType. Por norma, é de utilizar a indicação Option Explicit para evitar incorrecções de digitação do nome de uma variável existente.

Nas opções de VBA, encontra-se uma checkbox, chamada “Require Variable Declaration”:

image

Seleccionando esta checkbox, fazemos com que o VBA insira a linha “Option Explicit”, no topo de qualquer módulo que criamos. Esta indicação força-nos a declarar todas as variáveis antes de as referirmos no nosso código.

 

Tópicos relacionados:

2008-08-14

image

SAVE THE DATE

2008-07-27

Introduzido em 1992, os Reddick VBA (RVBA) Naming Conventions, foram publicados num grande número livros e revistas. São utilizados por milhares de programadores em todo o mundo, para denominar objectos dentro de seu código de VBA.

Estes RVBA Naming Conventions têm sido suplementados agora pelas RVBA Coding Conventions. A finalidade dos Reddick VBA (RVBA) Naming Conventions é fornecer um guia para denominar objectos no Visual Basic for Applications (VBA). Ter convenções é valioso em todo o projecto de programação. Quando são utilizados, o nome do objecto informa sobre o significado do objecto. Estas convenções tentam fornecer uma maneira de estandardizar esse significado pelo corpo de programadores de VBA.

Os objectivos das convenções de Coding Reddick VBA (RVBA), são fazer com que o código:

· Seja mais legível: As convenções permitem que um leitor compreenda o significado do código com menos esforço.

· Tenha melhor manutenção: O código pode mais confiantemente ser mudado face aos erros e realçar a sua funcionalidade.

· Dê maior confiança: O código tem maior probabilidade de se executar como seria esperado.

· Seja mais eficiente: O código executa mais rapidamente ou consome menos recursos.

 

Para saber mais, aceder a:

 

Pode fazer o download aqui do "The Reddick VBA (RVBA) Naming Conventions, Version 6.01".

2008-07-26

Esta função, por defeito, apresenta uma mensagem numa caixa de diálogo, a qual tem um botão "OK". No entanto, esta função pode apresentar outros botões e/ou um icon na caixa de diálogo.

Exemplo:

image

O código, para este exemplo, será:

Sub Mensagem()
    msg = MsgBox("Pretende Continuar?", vbInformation + vbYesNoCancel)
End Sub

No entanto, para obtermos este resultado, poderemos utilizar os chamados valores dos botões de argumento, como no seguinte exemplo de código:

Sub Mensagem()
    msg = MsgBox("Pretende Continuar?", 64 + 3)
End Sub

Segue-se um quadro com o nome das principais Constantes, o seu Valor e a respectiva Descrição:

image

image

Tópicos relacionados:

2008-06-29

Se pretendermos que uma determinada célula contenha o nome da folha (nome esse que se encontra no tabulador dessa folha), como no exemplo:

image image

podemos utilizar o seguinte segmento de código, ligado à folha em causa:

Private Sub Worksheet_Activate()
    On Error Resume Next
    Range("C6").Value = ActiveSheet.Name
End Sub

Se pretendermos repetir um footer (rodapé) em diversas folhas, a partir de uma determinada folha, podemos efectuar da seguinte forma:

1º - Criamos o nosso footer, como habitualmente (Ver > Cabeçalho/Rodapé)

2º - Seleccionamos a folha que contém o footer (parent worksheet) e a seguir CTRL-Click no(s) tabulador(es) que queremos que venham a conter aquele footer (child(ren) worksheet), ou seja, marcamos um grupo.

3º - Na barra de ferramentas, escolhemos Ficheiro > Configurar Página

4º - Desmarcar o grupo e verificar se o footer já se encontra nas outras worksheets.

Tópicos relacionados:

2008-05-25

Há dias, foi-me perguntado qual o método para se poder imprimir, de uma só vez, Ranges provenientes de duas WorkSheets.

Uma das possibilidades, é utilizar uma mistura de Excel (definição das áeras de impressão nas duas WorkSheets) e de VBA, no sentido de, a partir daquela definição, imprimir de uma só vez, mas em duas folhas distintas, os Ranges pretendidos.

Exemplo:

Sheet1:

image 

Sheet2:

image

 

Para definir as respectivas áreas de impressão:

1 - "marcar" o Range pretendido

2 - File>PrintArea>Set Print Area

 image

3 - A definição das áreas de impressão deve ser efectuada para as duas Sheets.

 

E, agora, para a impressão dos Ranges definidos, o código VBA:

 

Sub ImprimeDeUmaVez()

    Sheets(Array("Sheet1", "Sheet2")).Select
    ActiveWindow.SelectedSheets.PrintOut

End Sub

 

Tópicos relacionados: