About Me
Seguidores
Estatisticas
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:
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))
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:
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:
Variable1 As varType1
Variable2 As varType2
...
VariableN As varTypeN
End Type
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:
registo1.registoData = "06-09-2008"
Tópicos relacionados:
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:
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:
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:
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”:
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:
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:
- RVBA Naming Conventions
- RVBA Coding Conventions
- Microsoft Consulting Services convenções de nomenclatura para o Visual Basic
Pode fazer o download aqui do "The Reddick VBA (RVBA) Naming Conventions, Version 6.01".
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:
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:
Tópicos relacionados:
Se pretendermos que uma determinada célula contenha o nome da folha (nome esse que se encontra no tabulador dessa folha), como no exemplo:
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:
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:
Sheet2:
Para definir as respectivas áreas de impressão:
1 - "marcar" o Range pretendido
2 - File>PrintArea>Set Print Area
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: